Zookeeper常用应用场景
统一命名服务
统一命名可以理解为,我们将一部分资源放在同一节点下,以方便管理和取数据。
如type 1 是一个域名,下面可以存储域名对应多台机器的ip地址。
统一配置管理
在分布式环境中,一般所有节点的配置信息是一致的,比如 Kafka 集群,当配置文件修改时,我们希望它快速同步到所有节点上。
所以,可以通过zookeeper实现。
- 将配置信息写到一个zookeeper的一个znode上。
- 所有用到该配置的客户端都去监听这个znode。
- 一旦znode中的数据被修改,触发事件,异步回调通知各个客户端。
负载均衡
-
服务器在启动的时候向zookeeper上注册自己信息,采用临时节点的方式(一旦关闭连接,该节点自动删除)。
-
客户端从zookeeper上获取最新的节点信息,本地实现负载均衡算法去分配服务器。
监听服务器动态上下线
- 服务器启动时,向zookeeper的某个znode下写入自己的信息(临时节点)。
- 客户端getChildren,获取服务器列表,并监听znode。
- 一旦服务器节点下线(如图中server_2),客户端会立刻接到下线通知。
分布式锁
分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,为了保证不同系统访问一个或一组资源时的一致性。
- 各个客户端访问 /lock 节点,访问时创建一个带序列的临时节点(EPHEMERAL_SEQUENTIAL),序列会根据创建顺序依次递增。
- 所有客户端拿到 /lock 下的所有子节点并排序,判断自己是否是最小的那个。
- 如果是,则拿到锁,拿到锁的客户端执行业务操作,结束后断开连接,临时节点自动删除,也就释放了锁。
- 如果不是,拿锁失败,然后将子节点排序,并监听节点比自己小1的节点是否被删除。
- 当监听的节点被删除会通知监听它的客户端,当客户端收到回调信息以后,再排序判断自己是否是第一个,如果是拿到锁。