《从Paxos到Zookeeper》——第五、六章:经典应用场景

目录

第五章 使用Zookeeper

5.1 服务端部署与运行

5.2 客户端相关

5.2.1 客户端运行

5.2.2 客户端命令

5.3 Java客户端API

5.4 开源客户端

第六章 经典应用场景

6.1 典型应用场景及实现

6.1.1 数据发布/订阅(全局配置中心)

6.1.2 负载均衡(Load Balance)

6.1.3 命名服务

6.1.4 分布式协调/通知

6.1.5 集群管理

6.1.6 Master选举

6.1.7 分布式锁

6.1.8 分布式队列

6.2 Zk在大型分布式系统中的应用

6.2.1 Hadoop

6.2.2 HBase

6.2.3 Kafka

6.3 Zk在阿里的实践与应用

本章不是重点,粗略的介绍了下Zk的应用场景

第五章 使用Zookeeper

环境:Zk是基于Java语言编写的,因此运行环境需要Java环境的支持

5.1 服务端部署与运行

Zk有两种运行模式:单机模式与集群模式

Zk提供的可执行脚本

5.2 客户端相关

5.2.1 客户端运行
## 连接本地服务端
sh zkCli.sh
## 连接指定服务端
sh zkCli.sh -server ip:port
5.2.2 客户端命令

内容

命令

格式

创建

create

create [-s] [-e] path data acl

  • -s或-e分别指定节点特性:顺序 或 临时。默认不加参数,创建的是持久节点

读取

ls

ls path [watch]

  • 查看该节点下所有子节点

get

get path [watch]

  • 获取该节点下数据内容和属性信息

更新

set

set path data [version]

删除

delete

delete path [version]

5.3 Java客户端API

5.4 开源客户端

  • ZkClient

  • Curator

  • 其他:zkui


    第六章 经典应用场景

    数据发布/订阅,负载均衡,命名服务,分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列......

    6.1 典型应用场景及实现

    近年来很多分布式系统都以Zk为核心组件:

    • Hadoop:用于高可用性(HA)配置中的名称节点选举和一些子项目的协调服务

    • HBase:用于Region服务器的状态管理、元数据存储和Master服务器的选举

    • Kafka:在早期版本中,用于集群管理、领导者选举、配置管理等。2.8.0后不再依赖Zk

    • Dubbo:作为注册中心,管理服务的地址和配置信息

      6.1.1 数据发布/订阅(全局配置中心)
      • 即所谓的配置中心:发布者将数据发布到zk的一个或一系列节点上,订阅者进行数据订阅,动态获取数据。

        • 通常全局配置有以下特点

          • 数据量小

          • 运行时动态发生变化

          • 集群中各机器共享,配置一致

        • 数据发布/订阅一般有两种设计模式:Push模式和Pull模式

          • Push:服务端主动将数据更新发送给订阅的客户端

          • Pull:客户端定时轮询,主动发请求拉取数

          • Zk采用推拉结合的模式:客户端订阅需要关注的节点,一旦节点数据更变,服务端通过发生Watcher事件通知客户端,客户端再主动拉取

            • Zk的实现方式

              • ①存储配置:在Zk上选取一个节点用于配置存储,如/app1/database_config

              • ②配置获取

                • 启动:集群中每台机器在启动初始化阶段,首先会从上面提到的Zk配置节点上读取该配置

                • 注册:同时在该配置节点上注册一个数据变更的Watcher监听。一旦数据发生变化,订阅的客户端能够得到通知

              • ③配置变更

                • 发生变更后,Zk会发送通知到各个客户端,客户端收到通知后拉取

              6.1.2 负载均衡(Load Balance)
              • 什么是负载均衡

                • 对多个计算机,网络连接,CPU,磁盘驱动器或其他资源进行分配负载,以达到优化资源使用,最大化吞吐率,最小化响应时间,避免过载的目的

                • 负载均衡分为两种

                  • 硬件:直连交换机,比如F5,成本比较高

                  • 软件:Zk是基于软件的

                • 基于Zk实现的动态DNS方案("DDNS",Dynamic DNS)

                  6.1.3 命名服务
                  • 命名服务场景

                    • 在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等。比较常见的就是一些分布式服务框架中的服务地址列表

                    • 在分布式环境中,上层应用有时仅仅需要一个全局唯一的名字,类似数据库中的唯一主键

                    • Zk全局唯一ID命名的实现方式:通过Zk节点的顺序递增性质,获取全局唯一ID

                      • 根据任务类型(type),在该节点下创建顺序节点,获取全局唯一ID

                      6.1.4 分布式协调/通知
                      • 对于分布式机器而言,需要一个协调者(Coordinator)来控制整个系统的运行流程,如分布式事务的处理,机器间的相互协调等

                        • Zk通过让客户端对同一个数据节点进行Watcher注册,来实现不同系统间的协调,如果数据节点发生变化,会通知所有订阅的客户端

                        • 常用场景

                          • 任务注册

                          • 心跳检测

                          • 系统调度

                          6.1.5 集群管理

                          集群管理包括两部分

                          • 集群监控:对整个集群运行时的状态信息收集,如:希望知道当前有多少台机器工作,每台机器运行时数据收集

                          • 集群控制:对集群的操作与控制,如:针对某台机器进行上下线操作

                            Zk做集群管理的两大优势

                            • 基于Watcher的订阅与监听特性

                            • Zk上的临时节点,一旦会话失效,临时节点会自动清除

                              6.1.6 Master选举
                              • 客户端集群每天都会定时往Zk上创建临时节点。在这个过程中,由于Zk原子性,只有一个客户端能创建成功,成功的即为Master
                              • 一旦Master挂了,通过Watcher机制,其余的客户端会重新选举
                                6.1.7 分布式锁

                                不赘述

                                6.1.8 分布式队列

                                不赘述,各类消息中间件已经很成熟了,不一定要用到Zk

                                6.2 Zk在大型分布式系统中的应用

                                6.2.1 Hadoop
                                6.2.2 HBase
                                6.2.3 Kafka
                                • 注:在 Kafka 的早期版本中,Kafka 是基于 ZooKeeper 的。从 Kafka 2.8.0 版本开始,Kafka 引入了 KRaft 模式(Kafka Raft Metadata mode)这是一个不依赖于 ZooKeeper 的元数据管理模式。在 KRaft 模式下,Kafka 可以使用自己的内部 Raft 实现来管理集群元数据,从而摆脱对 ZooKeeper 的依赖。

                                  Zk在kafka的应用体现在以下几方面

                                  • 管理所有Broker节点:所有Broker节点启动上线时,都会在(路径/brokers/ids)下进行注册创建属于自己的节点,并按ID排序

                                    • 例如/brokers/ids/1和/brokers/ids/2代表了两个Broker服务器

                                    • 创建完broker节点后,会把ip地址和端口写入该节点

                                    • 由于注册的是临时节点,Broker宕机或下线后会自动删除

                                    • Topic注册

                                      • 每一个Topic都会记录在(路径/brokers/topics)下

                                        • 例如/brokers/topics/topic1和/brokers/topics/topic2代表了两个Topic

                                        • /brokers/topics/login/3->2,这个节点表明了 BrokerID=3的一个服务器,对于login的topic,提供了两个分区进行存储

                                    • 生产者的负载均衡(如何将消息合理的发送到分布式Broker上):Kafka提供了两种负载均衡方案

                                      • 传统的四层负载均衡:生产者IP地址和端口 —> 关联Broker

                                        • 优点:实现简单,生产者直接TCP维护到Broker

                                        • 缺点:写死,无法真正意义上的负载均衡,实际过程中,不同生产者的生产速率不一致

                                      • 基于Zk进行负载均衡:能实现动态负载均衡

                                    • 消费者的负载均衡

                                      6.3 Zk在阿里的实践与应用

                                      • Metamorphosis:消息中间件

                                        • Dubbo:RPC服务框架

                                          • Canal:基于MySQL Binlog的增量订阅和消费组件

                                          • ......