Paxos+ZAB协议,分布式一致性问题的工业解决方案ZooKeeper手册
在计算机科学领域,分布式一致性问题是一个相当重要,且被广泛探索与论证的问题,通常存在于诸如分布式文件系统、缓存系统和数据库等大型分布式存储系统中。
什么是分布式一致性?分布式一致性分为哪些类型?分布式系统达到一致性后将会是一个什么样的状态?如果失去了一致性约束,分布式系统是否还可以依赖?如果一味地追求一致性,对系统的整体架构和性能又有多大影响?这一系列的问题,似乎都没有一个严格意义上准确的定义和答案。
但是通过读这一份系统的ZooKeeper手册,相信你可从中找到你想要的答案。
第1章分布式架构
第2章一致性协议
第3章Paxos的工程实践
第4章ZooKeeper与Paxos
第5章使用ZooKeeper
需要免费领取这份Paxos和ZAB协议,分布式一致性问题的工业解决方案ZooKeeper手册的朋友麻烦帮忙转发小编这篇文章+关注我,然后后台私信小编【手册】二字。
第6章ZooKeeper的典型应用场景
本章节优质内容节选:ZooKeeper在阿里巴巴的实践与应用:
案例一消息中间件: Metamorphosis
Metamorphosis是阿里巴巴中间件团队的killme2008和wq163于2012年3月开源的一个.Java消息中间件,目前项目主页地址为htps://ithub. com/killme 2008/Metamorphosis,由开源爱好者及项目的创始人killme2008和wq163持续维护。关于消息中间件,相信读者应该都听说过JMS规范,以及一些典型的开源实现,如ActiveMQ 和HornetQ 等,Metamorphosis也是其中之- -。
Metamorphosis是一个高性能、高可用、可扩展的分布式消息中间件,其思路起源于LinkedIn的Kafka,但并不是Kafka的一个 简单复制。Metamorphosis 具有消息存储顺序写、吞吐量大和支持本地XA事务等特性,适用于大吞吐量、顺序消息、消息广播和日志数据传输等分布式应用场景,目前在淘宝和支付宝都有着广泛的应用,其系统整体部署结构如图6-30所示。
生产者的负载均衡
和Kafka系统一样,Metamorphosis假定生产者、Broker和消费者都是分布式的集群系统。生产者可以是一个集群,多台机器_上的生产者可以向相同的Topic 发送消息。而服务器Broker通常也是一个集群,多台Broker组成一个集群对外提供--系列的Topic消息服务,生产者按照--定的路由规则向集群里某台Broker发送消息,消费者按照--定的路由规则拉取某台Broker 上的消息。每个Broker都可以配置-一个 Topic的多个分区,但是在生产者看来,会将一个Topic在所有Broker.上的所有分区组成- - 个完整的分区列表来使用。
在创建生产者的时候,客户端会从ZooKeeper.上获取已经配置好的Topic对应的Broker和分区列表,生产者在发送消息的时候必须选择一台Broker上的-个分区来发送消息,默认的策略是一个轮询的路由规则,如图6-31所示。
生产者在通过ZooKeeper获取分区列表之后,会按照Broker Id和Partition的顺序排列组织成一个有序的分区列表,发送的时候按照从头到尾循环往复的方式选择-一个分区来发送消息。考虑到我们的Broker服务器软硬件配置基本一致,因此默认的轮询策略已然足够。
在Broker因为重启或者故障等因素无法提供服务时,Producer能够通过ZooKeeper感知到这个变化,同时将失效的分区从列表中移除,从而做到Fail Over。需要注意的是,因为从故障到生产者感知到这个变化有一定的延迟,因此可能在那-瞬间会有部分的消息发送失败。
消费者的负载均衡
消费者的负载均衡则会相对复杂--些,我们这里讨论的是单个分组内的消费者集群的负载均衡,不同分组的负载均衡互不干扰。消费者的负载均衡跟Topic的分区数目和消费者的个数紧密相关,我们分几个场景来讨论。
消费者数和Topic分区数一致
如果单个分组内的消费者数目和Topic总的分区数目相同,那么每个消费者负责消费一个分区中的消息,一一对应,如图6-32所示。
当分区数目(n)大于单个Group的消费者数目(m)的时候,则有n%m个消费者需要额外承担1/n的消费任务,我们假设n无限大,那么这种策略还是能够达到负载均衡的目的。.
综上所述,单个分组内的消费者集群的负载均衡策略如下。
每个分区针对同一个Group只能挂载-一个消费者,即每个分区至多同时允许被-一个消费者进行消费。
如果同一个Group的消费者数目大于分区数目,则多出来的消费者将不参与消费。
如果同一个Group的消费者数目小于分区数目,则有部分消费者需要额外承担消费任务。
Metamorphosis的客户端会自动处理消费者的负载均衡,将消费者列表和分区列表分别排序,然后按照上述规则做合理的挂载。
从上述内容来看,合理地设置分区数目至关重要。如果分区数目太小,则有部分消费者可能闲置:如果分区数目太大,则对服务器的性能有影响。
在某个消费者发生故障或者发生重启等情况时,其他消费者会感知到这一变化(通过ZooKeeper的“节点变化”通知),然后重新进行负载均衡,以保证所有的分区都有消费者进行消费。
消息消费位点Offset存储
为了保证生产者和消费者在进行消息发送与接收过程中的可靠性和顺序性,同时也是为了尽可能地保证避免出现消息的重复发送和接收,Metamorphosis会将消息的消费记录Offset记录到ZooKeeper上去,以尽可能地确保在消费者进行负载均衡的时候,能够正确地识别出指定分区的消息进度。
第7章ZooKeeper技术内幕
第8章ZooKeeper运维
需要免费领取这份Paxos和ZAB协议,分布式一致性问题的工业解决方案ZooKeeper手册的朋友
添加小助手VX:BGM7756
领取资料备注好“简书”信息!
网友评论