Kafka与Zookeeper

Zookeeper

 

Zookeeper是一个高性能分布式应用协调服务

Naming Service

》配置管理

Leader Election

》服务发现

》同步

Group Service

Barrier

》分布式队列(其实zookeeper并不适合作为分布式队列,性能不高只不过在特定场合可以)

》两阶段提交

 

Zookeeper工作方式

Zookeeper集群包含一个1个Leader,多个Follower

》所有的Follower都可提供读服务

》所有的写操作都会被forward到Leader

Client与Server通过NIO通信

》全局串行化所有的写操作

》保证同一客户端的指令被FIFO执行

》保证消息通知的FIFO

 

 

Kafka读写操作不一样,Kafka只有Leader提供读写操作。

 

Zab协议-广播模式

客户端每发送一个更新请求,ZooKeeper都会生成一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序,这个唯一编号就是事务ID(ZXID),只有更新请求才算是事务请求。
为保证按照事务的ZXID先后顺序来处理,Leader服务器会分别为每个Follower服务器创建一个队列,并将事务的先后顺序放入队列中,并按照FIFO的策略进行消息发送。收到需要处理的事务后,Follower服务器会首先以事务日志的形式写入服务器的磁盘中,写入成功后会向Leader服务器发送ACK响应。当Leader服务器收到超过一半的Follower服务器的ACK响应后,会向所有Follower服务器广播Commit消息,收到Commit消息的Follower服务器也会完成对事务的提交。
如果接收到事务请求的是Follower服务器,它会将请求转发给Leader服务器处理。

 

 

 

Zab协议-恢复模式

进入恢复模式:当Leader宕机或者丢失大多数Follower后,即进入恢复模式

结束恢复模式:新领导被选举出来,且大多数Follower完成了与Leader的状态同步后,恢复模式即结束,从而进入广播模式

恢复模式的意义

》发现集群中被commit的proposal的最大zxid

》建立新的epoch,从而保证之前的Leader不能再commit新的proposal

 

 

》集群中大部分节点都commit过前一个Leader commit过的信息,而新的Leader是被大部分节点所支持的,所以被之前Leader commit过的Proposal不会丢失,至少被一个节点所保存

》新Leader会与所有Follower通信,从而保证大部分节点都拥有最新的数据

 

 

 

Zookeeper一致性保证

顺序一致性:从一个客户端发出的更新操作会发送顺序被顺序执行

原子性:更新操作要么成功要么失败,无中间状态

单一系统镜像:一个客户端只会看到同一个view,无论它连到哪台服务器

可靠性:

》一旦一个更新被应用,该更新将被持久化,直到有客户端更新该结果

》如果一个客户端得到更新成功的状态码,则该更新一定生效

》任何一个被客户端通过读或者更新“看到”的结果,将不会被回滚,即使是从失败中恢复

实时性:保证客户端可在一定时间(通常是几十秒)内看到最新的视图

 

Zookeeper使用注意事项

》只保证同一客户端的单一系统镜像,并不保证多个不同客户端在同一时刻一定看到同一系统镜像,如果要实现这种效果,需要在读取数据之前调用sync操作

Zookeeper读性能好于写性能,因为任何Server均可提供读服务,而只有Leader可提供写服务

》为了保证Zookeeper本身的Leader Election顺利进行,通常将Server设置为奇数

》若需容忍f个Server的失败,必须保证有2f+1个以上的Server

posted @ 2017-08-20 17:44  一寂知千秋  阅读(16050)  评论(0编辑  收藏  举报