笑话/Zookeeper-Zookeeper可以干什么
在Zookeeper的官网上有这么一句话VNFYRe30:Ja374B6Jz3jZooKeeper is a centralized service for maintaining configuration informationKrZoO,U1ArqQuKOY7755 naming828ET5wbg28,6oC0Rw providing distributed synchronization5g86K603k,336q4am and providing group services. 这大概描述了Zookeeper主要可以干哪些事情I3e34tiOsKQ4Wm:4m5hpNO00fU1配置管理zO0Z4d8Gll6a4,3sZJA名字服务I8R15c49Np,qABk41qSgLOK4g提供分布式同步以及集群管理LdAovlk。52rf1y那这些服务又到底是什么呢a8In3Fk?86Eq6Tb我们为什么需要这样的服务31sn3LmtFc?ZK2Q5jQUTLjko1我们又为什么要使用Zookeeper来实现呢668ttRGI6L,lrPKTKd9X8djYK使用Zookeeper有什么优势UMm36RJCeGKqT1?8NQaVWy5tQbu接下来我会挨个介绍这些到底是什么sQ5R46,igsf964UGTGEz以及有哪些开源系统中使用了V5x4MC。IY5G2CRx7W5 配置管理 在我们的应用中除了代码外1bNIH8v,3tWl17QuT还有一些就是各种配置q8Ko7F66XZNw。i8TfsF4OxWeaqO比如数据库连接等rvsOoD0e。XK3jc5一般我们都是使用配置文件的方式221q7ABEUE,138R94Hwp在代码中引入这些配置文件34zp6u7QU142z。Q1FF3但是当我们只有一种配置1eZJwC,wS3R2只有一台服务器J8HN15588P26G9,21Y98au并且不经常修改的时候wsF2U8mIBs,98ByBy6使用配置文件是一个很好的做法SJgd698EP2mn57,X9inQ40但是如果我们配置非常多22IQB2,1h8M5x387RLn有很多服务器都需要这个配置0L7uI3YI1I,kLHqvd0Gf而且还可能是动态的话使用配置文件就不是个好主意了MnjERQSLzP。YUi820这个时候往往需要寻找一种集中管理配置的方法Eh10N8Y6L2,rKA53okNW9X3我们在这个集中的地方修改了配置JUlh1,2USa1所有对这个配置感兴趣的都可以获得变更0aa32sd2lbeDz。3Lk7iUci比如我们可以把配置放在数据库里PCU3x48j5If5x,G498JhUr55然后所有需要配置的服务都去这个数据库读取配置bnRneS18n6。DQc0O4Js485Z但是F6KERij3vHNy,Tt4CR3OY0因为很多服务的正常运行都非常依赖这个配置Ph8Oezi7613,AshD9Ge所以需要这个集中提供配置服务的服务具备很高的可靠性d9A1o0x9vO。85N762一般我们可以用一个集群来提供这个配置服务tfPbTTfK9,2wBOD8但是用集群提升可靠性o13dz3,FT65018V8r那如何保证配置在集群中的一致性呢izzq5i3pl1h4?2RZai2xID 这个时候就需要使用一种实现了一致性协议的服务了Pvmk48pqdN0Vr。hX5z411LZookeeper就是这种服务Ln3242pxx1j45,vW65nXGj1zQHA6它使用Zab这种一致性协议来提供一致性04ccDbr。GjJzhOwMxn8现在有很多开源项目使用Zookeeper来维护配置OU9b5Wa,MagHx23bsx比如在HBase中ptNG3eJks9Myi3,4417oTm0ND5客户端就是连接一个Zookeeper7E0oSRK,LoAa7MaN16l获得必要的HBase集群的配置信息087ihb2HS,cBaS0Q然后才可以进一步操作WYtC74FDN3DL7。p170hCh5还有在开源的消息队列Kafka中0G8ALv33,9cJZi7FDphV87L也使用Zookeeper来维护broker的信息3OJFOV419kv0z0。xzkzr6lkRu2iWa在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理YZ90U950P。HT2w52Daw 名字服务 名字服务这个就很好理解了Do6U1K0J5i。5GpT2tZQ5uAT比如为了通过网络访问一个系统oI3m1He,5E9mhlQ8hn我们得知道对方的IP地址NQc2I7jb1nYes,6EoL2rR0C但是IP地址对人非常不友好fxQ9Okcm,arSSx4WTk3Tu这个时候我们就需要使用域名来访问5sRcuNKbbf3M。QeK2wta但是计算机是不能是别域名的Foc7205s。30i6b9pKd73怎么办呢f77M3WzY2lLt?Mn06456qn如果我们每台机器里都备有一份域名到IP地址的映射WICqHtQN,5YIg0Ax8thMT这个倒是能解决一部分问题424Za4C,FX36hTOW0fGS但是如果域名对应的IP发生变化了又该怎么办呢253g9R8EabF734?7cG72于是我们有了DNS这个东西OMm9KhQ。Yu5EdlH我们只需要访问一个大家熟知的(known)的点wYuMeZ9KqWK7Z9,4WsDbVA它就会告诉你这个域名对应的IP是什么4aZsy。D64bae2wzu5f7在我们的应用中也会存在很多这类问题jI34gqS36Ezun,7Z1105dyOE特别是在我们的服务特别多的时候Jstzj1xgOlhUx,6h48yS如果我们在本地保存服务的地址的时候将非常不方便a60D5QJXEdGff9,0ij0v0x2wDjAe但是如果我们只需要访问一个大家都熟知的访问点w72Q12HnqBUv8T,93gwOBLW9Forjo这里提供统一的入口b290ph5On,6Bxq54那么维护起来将方便得多了9xQ6l5RLD3m4o。P8lGYN5jJM6 分布式锁 其实在第一篇文章中已经介绍了Zookeeper是一个分布式协调服务c59Qpwc0l。PSigeE这样我们就可以利用Zookeeper来协调多个分布式进程之间的活动914Xlu3mpC。tBV4U比如在一个分布式环境中A727xj3S053BB,WMHp61SBfup034为了提高可靠性goQnIFZ86Iv2g0,02im26N我们的集群的每台服务器上都部署着同样的服务nU9mJ。5431sgXQ9lm03但是cuK1y0FBv,2jdS0CSx41q7N一件事情如果集群中的每个服务器都进行的话xnU783V128y56j,1gU4m4w8U那相互之间就要协调37ej4U,7f5qZaJOy编程起来将非常复杂jQ8vd07r2。0pJJF而如果我们只让一个服务进行操作O94i4a21XCL8,MZcPm1Ddm那又存在单点93C91s。YD9929通常还有一种做法就是使用分布式锁yohcRCxjPY,1q59rtNTuQqve在某个时刻只让一个服务去干活U1pNc4Zlv8,JP0J9n2mBflb当这台服务出问题的时候锁释放AHKgqDmN6a,2K2tT60m50aGz立即fail over到另外的服务MI1vYEfUHu4o5。T5i5AqTjdhK3ou这在很多分布式系统中都是这么做u8oB5,1x5qqy7UrG5Vx7这种设计有一个更好听的名字叫Leader Election(leader选举)KH6So9Z。5YZjynAJ2SnwO比如HBase的Master就是采用这种机制91tE3astsL。6bw2CFROvxS但要注意的是分布式锁跟同一个进程的锁还是有区别的Mx43L,l99k0所以使用的时候要比同一个进程里的锁更谨慎的使用S08B3sk98。LUANN50 集群管理 在分布式的集群中YFP6P5I5MC,E8jjP经常会由于各种原因MG2xuEt6Xcy0J,U23ZhH63q6S比如硬件故障B2G5y6509,dHvtwOropdS软件故障fs6HXSFDj,bw76Fj0g1Q网络问题j46Cf9n0TJ,8dIZx有些节点会进进出出2J6G6GTg7Pvx。89c8UO5nq1u6T有新的节点加入进来300owFf,5hiK3j90437JU也有老的节点退出集群bA055Hg0。12NUmg这个时候cN2U4qdA7M0L,O6ciKK1s4cO341集群中其他机器需要感知到这种变化mamchZ6mwIZkr1,n9T9F716A583e3然后根据这种变化做出对应的决策dzMr55EB9th。8X3jpoZ2比如我们是一个分布式存储系统4Uwhq025822,27Z8ngx3mAY5qL有一个中央控制节点负责存储的分配CDZ385JY7k6,evsa8fY当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点276Gx8。P3R72Vx这个时候我们就需要动态感知到集群目前的状态R6SoRJXRc7b。loLM9r还有dHrQA986Nfk,91dqWJ比如一个分布式的SOA架构中GcZiu,eQTr47x服务是一个集群提供的5Ibdh,Ni7QI65当消费者访问某个服务时L03wam,n62p3b5uP2就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现V0g9ZYD,486tSW02AF8比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)0n8Uw。tivRpFs5U7j8还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理dFu583rN1。4xs9kz 后记 在这篇文章中j293fJl9Q,MG8PrBC73列出了一些Zookeeper可以提供的服务F7tlZ62,QZZ2yO并给出了一些开源系统里面的实例qW5mL5t9。QMv0hA20mYNmr后面我们从Zookeeper的安装配置开始WSM6u,O0mc79并用示例进一步介绍Zookeeper如何使用