路过浪人

路过浪人 查看完整档案

北京编辑  |  填写毕业院校JD  |  架构师 编辑 www.cnblogs.com/snailrun/ 编辑
编辑

微信公众号:ArchWeek(互联网架构技术周刊)

个人动态

路过浪人 回答了问题 · 2019-11-24

raft协议,leader在commit了一条日志后,立刻挂了,那其他节点如何处理这条日志?

1、首先给你一个网址:http://thesecretlivesofdata.c...,能够更加生动的看到Log Replication的过程。
2、Commit的定义是当集群中大部分的节点(一半以上)响应了Leader的Log Replication操作之后才会被Commited。否则,Leader是不会像Client发送提交成功的响应的。提交操作并未真正Commit,Leader会被阻塞在这里。
3、这种情况的发生一般来说都是因为Leader挂掉了或者网络分区了。Leader挂掉了的话在一个HeartBeat Timeout后系统会Re-select,新的Leader会更新自己的term-id,这时候Client一般是会重试的,也就是会向新的Leader提交成功。
4、当Leader恢复或者分区消失,恢复后的Leader发现集群存在更新的term-id,它会放弃leader地位并主动向新的leader进行同步,从而整个集群恢复到一致状态。

关注 3 回答 2

路过浪人 发布了文章 · 2019-08-12

互联网架构技术周刊第二十一期

架构原理
1、一文读懂高性能网络编程中的I/O模型
Linux系统中五种IO模型的实现机制和对比,可以期待一下更加完善的AIO的实践应用。
2、分布式事务解决方案汇总:2PC、消息中间件、TCC、状态机+重试+幂等
本文从实践角度总结了解决分布式事务问题,比较可靠的七种方法:两种最终一致性的方案,两种妥协办法,两种基于状态 + 重试 + 幂等的方法(TCC,状态机+重试+幂等),还有一种对账方法。

架构设计
1、数据库软件架构,到底要设计些什么
文章简单的讨论了在高可用数据库架构设计时的要点问题,比如可靠用(主从/双主)、一致性、读写扩展、与缓存的作用关系等。
2、千万级并发!如何设计一个多级缓存系统?
在业务架构中应用多级缓存机制,实现系统对高并发场景的良好支持,文章对多级缓存存在的热点、一致性和更新问题进行了探讨。
3、海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解
之前分享“现代IM系统中的消息系统架构”系列文章中就是基于阿里Tablestore构建构建的,本文更加系统的说明了Tablestore引擎原理和架构,对比HBase通过二级索引和多元索引引擎加速数据查找。

架构实践
1、蚂蚁金服 Service Mesh 落地实践与挑战
蚂蚁金服在实施 Service Mesh 时的业务背景和挑战,方案设计和架构落地时的思考,可以借鉴其中Sidecar平滑升级和性能优化方面的经验。
2、Medium的微服务架构最佳实践
Medium在实践微服务架构时避免“微服务综合症”的经验分享。

技术管理
1、一文了解微服务的流程和组织
组织转向微服务架构的过程并非仅仅是研发人员的工作,组织需要配合从管理到保障实施多个领域的调整,狭义上是DevOps,广义上甚至要做出对组织架构、KPI等方面的改革。

查看原文

赞 0 收藏 0 评论 0

路过浪人 发布了文章 · 2019-05-24

互联网架构技术周刊

架构原理
1、浅谈几种常用负载均衡架构
文章概括了负载均衡技术分类、作用位置和负载均衡算法,以及每种技术的优缺点。
2、古典、SOA、传统、K8S、ServiceMesh
近几年微服务的思想和架构演化的速度非常快,经常是每年都有一个新的思想产生,从传统微服务思想起,近两年结合K8S和容器,SpringCloud、ServiceMesh、Severless思想层出不穷,从物理机部署起,云化方向加速发展,本文对这种演化的过程和原因进行了简单的概括。
3、互联网架构:屡试不爽的架构三马车
作者理解的微服务、消息队列和定时任务的最佳实践。
4、10种常见的软件架构模式
文章总结了软件架构设计的十种常见模式和应用场景。

架构设计
1、10个有关RESTful API良好设计的最佳实践
国内做服务间交互主要使用RPC,而国外的实践上使用RESTful的方式也比较多,RESTful仍然有他的市场,简单易描述。
2、掌握它才说明你真正懂Elasticsearch
搜索和推荐系统的核心是检索引擎,Elasticsearch基于Lucene,隐藏其复杂性,并提供简单易用的Restful API接口、Java API接口。所以理解ES的关键在于理解Lucene的基本原理。

架构实践
1、从零开始搭建创业公司大后台技术栈
创业公司最重要的资产是清晰的业务和需求、强大的运营能力,技术在创业初期并不是核心。

图片描述

查看原文

赞 0 收藏 0 评论 0

路过浪人 分享了头条 · 2019-03-08

这是经典书籍《重构》中列举的22种代码坏味道

赞 0 收藏 0 评论 0

路过浪人 发布了文章 · 2019-03-08

[转载] Redis、MongoDB 及 MemCache 的区别

1 基本概念

1.1 Redis(内存数据库)

Redis是一个key-value存储系统(布式内缓存,高性能的key-value数据库)。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

1.2 MongoDB(NoSQL数据库)

MongoDB是一个介于关系数据库和非关系数据库之间的产品(基于分布式文件存储的数据库),是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

1.3 Memcached(内存Cache)

Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

2 特点

2.1 Redis

支持多种数据结构,如 string(字符串)、list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)。
支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
支持简单的事务需求,但业界使用场景很少,并不成熟。

Redis 只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6w QPS(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
依赖快照进行持久化,AOF增强了可靠性的同时,对性能有所影响。
Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。
Memcached和Redis都是Key-Value类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难;
Redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache);
Redis事务支持比较弱,只能保证事务中的每个操作连续执行。

2.2 MongoDB

适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起。
支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。
从1.8版本开始采用binlog方式支持持久化的可靠性。
MongoDB不支持事务。
MongoDB内置了数据分析的功能(mapreduce),其他不支持。

2.3 Memcached

可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。
支持直接配置为session handle。
只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。
内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。
Memcached可以修改最大可用内存,采用LRU算法。

3 应用场景

3.1 Redis

适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。

3.2 MongoDB

主要解决海量数据的访问效率问题。

3.3 Memcached

动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等);
用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)。


图片描述

查看原文

赞 4 收藏 3 评论 0

路过浪人 分享了头条 · 2019-03-08

如何提高代码质量?

赞 0 收藏 1 评论 0

路过浪人 分享了头条 · 2019-03-08

架构师的自我修养

赞 0 收藏 1 评论 0

路过浪人 发布了文章 · 2019-03-01

Redhat6.9/Cent6下源码安装samba4手把手实操

由于Redhat6/Cent6操作系统属于骨灰级的操作系统,然而却老当益壮,在各大互联网公司内部仍有不少使用,下面就手把手记录下在rhel6下安装samba4的过程。

1 准备

samba:samba最新版本(4.9.4)https://download.samba.org/pu...

2 安装依赖

安装依赖请参考官网说明:https://wiki.samba.org/index....
虽然安装依赖中列出了很多依赖包,但在rhel6下可能缺少的只有python-devel。
对于缺少的依赖包,有两种方式处理:
1)使用操作系统自带的安装包直接安装

yun search python-devel
yun install python-devel.x86_64

2)使用--disable-/--without-跳过相关特性
例如,根据 ./configure 提示我如果希望支持AD DC、json-audit特性,我需要安装其他依赖包,但是这些依赖包并未随操作系统附带,直接跳过即可。

./configure --without-ad-dc --without-json-audit

使用以上两种方式,处理其他依赖即可。

运行 ./configure 直到出现 “configure finished successfully”,表示成功。
./configure --help 可以查看 configure 所有参数。

3 安装

make && make install

4 配置

1)配置文件
配置文件默认生成位置:/etc/samba/smb.conf
最简单的修改方式是在最后增加以下配置,更多高级特性查看配置文件说明。

[xxx]
comment = xxx root dir
path = /home/xxx
valid users = myname
browseable = yes
writable = yes
create mask = 0777

建议将/etc/samba/smb.conf放置到samba默认目录/usr/local/samba/etc/下。

2)用户名密码设置
执行命令:/usr/local/samba/bin/smbpasswd -a myname
输入密码即可。

3)启动samba
确认防火墙是否关闭:service iptables stop
启动服务:
/usr/local/samba/sbin/smbd -D -s /usr/local/samba/etc/smb.conf
/usr/local/samba/sbin/nmbd -D -s /usr/local/samba/etc/smb.conf

5 win10访问示例

1)映射网络驱动器
2)文件夹输入:\ipxxx,点击完成
3)弹出密码对话框,用户名输入:myname,密码输入在 smbpasswd 命令时设置的密码即可。


图片描述

查看原文

赞 0 收藏 0 评论 0

路过浪人 发布了文章 · 2019-02-27

Proactor 与 Reactor

Reactor和Proactor对比以及优缺点

两种高效的事件处理模型:Reactor模式和Proactor模式


在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。

在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步?

同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知)。

阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

一般来说I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO

同步阻塞IO:在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!

同步非阻塞IO:在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。

异步阻塞IO:此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作。因为select之后,进程还需要读写数据),从而提高系统的并发性!

异步非阻塞IO:在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。

搞清楚了以上概念以后,我们再回过头来看看,Reactor模式和Proactor模式。

(其实阻塞与非阻塞都可以理解为同步范畴下才有的概念,对于异步,就不会再去分阻塞非阻塞。对于用户进程,接到异步通知后,就直接操作进程用户态空间里的数据好了。)

首先来看看Reactor模式,Reactor模式应用于同步I/O的场景。我们分别以读操作和写操作为例来看看Reactor中的具体步骤:

读取操作:

  1. 应用程序注册读就绪事件和相关联的事件处理器
  2. 事件分离器等待事件的发生
  3. 当发生读就绪事件的时候,事件分离器调用第一步注册的事件处理器
  4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理

写入操作类似于读取操作,只不过第一步注册的是写就绪事件。

下面我们来看看Proactor模式中读取操作和写入操作的过程:

读取操作:

  1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。
  2. 事件分离器等待读取操作完成事件
  3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作(异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作,操作系统扮演了重要角色),并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。
  4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。

Proactor中写入操作和读取操作,只不过感兴趣的事件是写入完成事件。

从上面可以看出,Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.

综上所述,同步和异步是相对于应用和内核的交互方式而言的,同步需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。


说到阻塞,首先得说说I/O等待。I/O等待是不可避免的,那么既然有了等待,就会有阻塞,但是注意,我们说的阻塞是指当前发起I/O操作的进程被阻塞。同步阻塞I/O便是指,当进程调用某些涉及I/O操作的系统调用或库函数时,比如accept()(注意accept也算在了i/o操作)、send()、recv()等,进程便暂停下来,等待I/O操作完成再继续运行。这是一种简单而有效的I/O模型,它可以和多进程结合起来有效的利用CPU资源,但是代价就是多进程的大量内存开销。

同步阻塞:进程坐水,就不能烧粥 同步非阻塞:类似于用一个进程坐水,烧粥。while(true){if… if… }
好处就是一个进程处理多个i/o请求,劣势就是需要不停的轮询。

区别在于等不等待数据就绪。因为数据占了等待的80%时间。同步非阻塞的优势就是一个进程里同时处理多个I/O操作。

在同步阻塞I/O中,进程实际上等待的时间可能包括两部分,一个是等待数据的就绪,另一个是等待数据的复制,对于网络I/O来说,前者的时间可能要更长一些。
与此不同的是,同步非阻塞I/O的调用不会等待数据的就绪,如果数据不可读或者不可写,它会立即返回告诉进程。

比如我们使用非阻塞recv()接收网络数据的时候,如果网卡缓冲区中没有可接收的数据,函数就及时返回,告诉进程没有数据可读了。相比于阻塞I/O,这种非阻塞I/O结合反复的轮询来尝试数据是否就绪,防止进程被阻塞,最大的好处便在于可以在一个进程里同时处理多个I/O操作。但正是由于需要进程执行多次的轮询来查看数据是否就绪,这花费了大量的CPU时间,使得进程处于忙碌等待状态。

非阻塞I/O一般只针对网络I/O有效,我们只要在socket的选项设置中使用O_NONBLOCK即可,这样对于该socket的send()或recv()便采用非阻塞方式。如果服务器想要同时接收多个TCP连接的数据,就必须轮流对每个socket调用接收数据的方法,比如recv()。不管这些socket有没有可以接收的数据,都要询问一遍,假如大部分socket并没有数据可以接收,那么进程便会浪费很多CPU时间用于检查这些socket,这显然不是我们所希望看到的。

同步和异步,阻塞和非阻塞,有些混用,其实它们完全不是一回事,而且它们修饰的对象也不相同。阻塞和非阻塞是指当进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪时是直接返回还是等待就绪;而同步和异步是指访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式,当数据就绪后在读写的时候必须阻塞(区别就绪与读写二个阶段,同步的读写必须阻塞),异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知,这可以使进程在数据读写时也不阻塞。(等待”通知”)

多数情况下,Web服务器对这些请求采用基于队列的自由竞争,通过多执行流(多进程或多线程)来充分占 用CPU以及I/O资源,减少任何无辜的等待时间,这其中包括了很多种具体实现的并发策略,在实际应用中,特别是Web服务器,同时处理大量的文件描述符是必不可少的。多路I/O就绪通知的出现,提供了对大量文件描述符就绪检查的高性能方案,它允许进程(比如电子屏,会闻到各个饭馆做好饭菜的味道)通过一种方法来同时监视所有文件描述符,并可以快速获得所有就绪的文件描述符,然后只针对这些文件描述符进行数据访问。

回到买面条的故事中,假如你不止买了一份面条,还在其它几个小吃店买了饺子、粥、馅饼等,因为一起逛街的朋友看到你的面条后也饿了。这些东西都需要时间来等待制作。在同步非阻塞I/O模型中,你要轮流不停的去各个小吃店询问进度,痛苦不堪。现在引入多路I/O就绪通知后,小吃城管理处给大厅安装了一块电子屏幕,以后所有小吃店的食物做好后,都会显示在屏幕上,这可真是个好消息,你只需要间隔性的看看大屏幕就可以了,也许你还可以同时逛逛附近的商店,在不远处也可以看到大屏幕。

多路就绪:1、强调多路; 2、只针对请求数据是否就绪,不针对I/O读写。epoll针对的是这样的场景。select, epoll都只需要进程(我)被动接收到数据就绪(面条)”通知”,符合异步的定义。 不需要一直在饭馆等(同步阻塞),或轮询(同步非阻塞)。


图片描述

查看原文

赞 2 收藏 2 评论 2

认证与成就

  • 获得 20 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2019-02-26
个人主页被 326 人浏览