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

目录

[第五章 使用Zookeeper](#第五章 使用Zookeeper)

[5.1 服务端部署与运行](#5.1 服务端部署与运行)

[5.2 客户端相关](#5.2 客户端相关)

[5.2.1 客户端运行](#5.2.1 客户端运行)

[5.2.2 客户端命令](#5.2.2 客户端命令)

[5.3 Java客户端API](#5.3 Java客户端API)

[5.4 开源客户端](#5.4 开源客户端)

[第六章 经典应用场景](#第六章 经典应用场景)

[6.1 典型应用场景及实现](#6.1 典型应用场景及实现)

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

[6.1.2 负载均衡(Load Balance)](#6.1.2 负载均衡(Load Balance))

[6.1.3 命名服务](#6.1.3 命名服务)

[6.1.4 分布式协调/通知](#6.1.4 分布式协调/通知)

[6.1.5 集群管理](#6.1.5 集群管理)

[6.1.6 Master选举](#6.1.6 Master选举)

[6.1.7 分布式锁](#6.1.7 分布式锁)

[6.1.8 分布式队列](#6.1.8 分布式队列)

[6.2 Zk在大型分布式系统中的应用](#6.2 Zk在大型分布式系统中的应用)

[6.2.1 Hadoop](#6.2.1 Hadoop)

[6.2.2 HBase](#6.2.2 HBase)

[6.2.3 Kafka](#6.2.3 Kafka)

[6.3 Zk在阿里的实践与应用](#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的增量订阅和消费组件

  • ......

相关推荐
Data跳动4 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
Java程序之猿6 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
来一杯龙舌兰6 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
Karoku0667 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
节点。csn8 小时前
Hadoop yarn安装
大数据·hadoop·分布式
NiNg_1_2349 小时前
基于Hadoop的数据清洗
大数据·hadoop·分布式
隔着天花板看星星11 小时前
Spark-Streaming集成Kafka
大数据·分布式·中间件·spark·kafka
探索云原生12 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳12 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
技术路上的苦行僧15 小时前
分布式专题(8)之MongoDB存储原理&多文档事务详解
数据库·分布式·mongodb