zookeeper简单学习
zookeeper的产生背景:
由于互联网的普及和移动互联网的发展,以及用户对产品要求的提升,单一的服务器已经无法满足高并发,大数据的需求。公司的业务一般会进行水平拆分为一个个子系统,然后以分布式的架构形式对外提供服务。
各个子系统虽然经过了拆分解耦,但是每个子系统并不是孤立存在并单独对外服务的。它们往往会产生一定的关联。比如电商平台中的订单子系统往往会使用支付子系统提供的服务,那么订单子系统如何去发现支付子系统提供的服务呢?再或者有一些业务需要实现高可用,如何实现master-slave-standby模式呢?
这样的分布式协调系统我们可能会自己去开发一套。但是开发这样的系统难度和成本不言而喻。就算有非常扎实的基本功和相当的财力支持开发出来了,但是也可能存在很多bug在日后使用的过程中才可以发现。而且自己研发的系统可能在本业务环境下是适用的,但是换一个业务环境立马歇菜。
这时,zookeeper就成了一个不错的选择。zookeeper是一个开源的,高性能,分布式的应用协调服务。它实现了一些分布式系统中经常需要用到的底层功能,包括同步,配置管理,集群管理等。并且提供了相当简单的接口去使用这些功能。使程序员不用再花费大量的精力去考虑去考虑如何解决分布式系统网络延迟,处理能力差异,故障等带来的问题,而只关注于业务逻辑的开发。使得开发一个分布式的应用系统的复杂度大大降低。
zookeeper的特性:
1. 简单
为了能让其他的子系统简单地进行协作,zookeeper使用的命令空间相当简单明了。类似于linux的文件系统,它采用树形结构来作为命令空间的结构。其中的每个节点都成为一个znode。znode中存放着一些状态数据和用户自定义的数据。比如子系统A可以向一个叫做“/zookeeper/test"的znode写数据,子系统B可以直接从“/zookeeper/test”中得到子系统A写的数据。
2.高可用
zookeeper用作一个分布式系统中的协调系统。如果zookeeper挂了,那么整个分布式系统还能不能正常运作就不好说了。所以zookeeper实现了高可用的机制。实现方式就是多台机器上运行多个zookeeper实例,分为leader和follower。每个实例中都保存有数据,写操作路由给leader进行所有节点同步,读操作所有实例都可以提供服务。当leader挂了,通过选举算法选出下一个leader,继续对外提供服务。只要集群中还有超过一半的机器在运行,那么zookeeper集群就是可用的。
3. 有序
zookeeper中所有的更新操作都是有序的。因为它把所有更新操作都封装成一个事物,并分配一个时间戳,通过此方式进行有序操作。比如有两个操作,A=“创建znode ‘/zookeeper/test’”, B=“删除znode‘/zookeeper/test’”。 如果发送操作的顺序为AB,而到达zookeeper服务器的顺序编变成BA,同时zookeeper又不考虑顺序,开心地执行了BA,那么执行的结果完全不是发起方想要。的。
4. 快速
通过第2点,大家可以看出来,zookeeper适合读多写少的场景。作为分布式系统中的协调者,如果成为系统的性能瓶颈,那么zookeeper十有八九在这个分布式系统中是混不下去的。
zookeeper中的概念:
zookeeper中的概念有很多,这里直介绍一些我了解过,但是足够简单使用zookeeper的概念。
1. znode
znode就是刚才介绍的zookeeper命名空间树的基本组成单元。大家可以认为这棵树上的每个节点,也就是znode都可以存储数据。比如“/zookeeper/test”可以存储用户自定义的数据,“/zookeeper/test/other_test”同样也可以存储数据。数据分为两类,用户自定义的数据和一些状态数据,比如一些数据的version,ACL权限控制数据等。
znode可以是临时的。当client和server的session保持alive状态时,节点存在。但是当session结束后,临时znode将会被自动删除。
2. session
client和zookeeper server使用TCP连接。zookeeper服务端给每个连接一个session_id,用来区别各个连接。客户端会周期性地向server发送PING来keep alive。当客户端检测到断开连接时,会自动选择配置的服务器列表中的另一个服务器进行重连。这里有个timeout的概念。如果zookeeper server 在timeout的时间内,没有收到client的任何数据,即认为客户端已经死掉了。
3. watch
zookeeper提供了watch的机制。client可以监听一个znode。当znode发生变化时,监听的client将会收到通知消息。
4. 原语
为了让程序员使用zookeeper提供的功能,zookeeper提供了一套简单的API(粘贴下,偷个懒):
CREATE: you can create a child node
READ: you can get data from a node and list its children.
WRITE: you can set data for a node
DELETE: you can delete a child node
ADMIN: you can set permissions
zookeeper的应用:
有了上面的概念,就不难理解下面的应用了
1. 配置中心
可以利用zookeeper做一个配置中心。把需要分发的配置文件保存在zookeeper中的znode中,并设置监听。如果监听到配置文件的变化,可以调用read API,得到更新后的配置文件。
2. 服务高可用
在一些场景中,有一些服务要实现高可用,比如mysql存储系统。一般的实现就是master-slave-standby机制。使用zookeeper的临时节点。leader连接zookeeper并创建一个临时节点,其他的slave监听这个临时节点,当节点发生变化,也就意味着leader挂了,这时候slave就可以顶上来成为leader了。
3. 服务发现负载均衡
比如服务A有三台机器,让这三台机器启动后在zookeeper上都注册临时节点。当有其他业务需要调用服务A时,先去zookeeper拿到这三台机器的host,然后自定义算法选择一台,达到服务发现和负载均衡的目的。当A中某台机器挂了,那么临时节点就会被删除,那么其他业务代码下次去zookeeper拿host的时候就会拿不到那台挂了的机器的host。当那台机器被修复后,重新注册到zookeeper。这样就达到了动态扩容之类的目的。
zookeeper在很多工业级别的中间件中也有大量的使用,比如kafka,hadoop,storm。大家有兴趣可以去了解。
本文为作者个人理解,难免有疏漏的地方。恳请广大网友指正交流。如果喜欢本文章,转载请注明原文连接,谢谢 : )