分布式系统的基石之ZooKeeper——基本原理+场景应用+集群搭建(最强万字入门指南

本文详细介绍了ZooKeeper的安装过程,配置参数解释,包括心跳时间、同步限制、数据存储目录等,并展示了如何搭建伪集群,进行leader选举以及模拟故障恢复。还提及了ZooKeeper的核心设计和应用场景。
摘要由CSDN通过智能技术生成

cd /usr/local/

mkdir zookeeper

cd zookeeper

下载

wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz

解压在当前目录

tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz

下载的zk安装,解压之后就可以用了:

zk-解压

修改解压之后的目录名称(也可以不修改)

mv apache-zookeeper-3.7.0-bin apache-zookeeper-3.7.0

cd apache-zookeeper-3.7.0

data/zoo用于存储zk数据

mkdir -p data/zoo

修改zoo_sample.cfg 为zoo.cfg,因为bin/zkServer.sh默认用的是zoo.cfg

mv conf/zoo_sample.cfg conf/zoo.cfg

修改zoo.cfg 中的dataDir为/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo

不能用/tmp 存储zk数据,因为机器会定时清理/tmp目录下的数据

vim conf/zoo.cfg

zoo.cfg

启动,默认使用的conf/zoo.cfg启动,单机版。

bin/zkServer.sh start

bin/zkServer.sh start

直接运行bin/zkServer.sh,可以看到该命令的使用说明,常用的有startstatusrestartstop,还可以在启动时指定配置文件,如:

指定配置文件启动,配置文件路径必须放在后面

bin/zkServer.sh start conf/zoo.cfg

2、配置说明

ZooKeeper的启动配置文件zoo.cfg的配置内容说明:

The number of milliseconds of each tick

通信心跳时间,Leader和Follower或者Zookeeper服务器与客户端心跳时间,单位毫秒

tickTime=2000

The number of ticks that the initial

synchronization phase can take

Leader和Follower初始连接时能容忍的最多心跳数(tickTime的数量)

initLimit=10

The number of ticks that can pass between

sending a request and getting an acknowledgement

Leader和Follower之间通信时间如果超过syncLimit * tickTime,

Leader认为Follwer死掉,从服务器列表中删除Follwer。

syncLimit=5

the directory where the snapshot is stored.

do not use /tmp for storage, /tmp here is just

example sakes.

保存zk数据的目录,默认是/tmp,一般要修改为其他路径,因为Linux系统会定期请求/tmp下的数据

dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo

the port at which the clients will connect

客户端连接的端口

clientPort=2181

the maximum number of client connections.

increase this if you need to handle more clients

最大客户端连接数,默认60

#maxClientCnxns=60

The number of snapshots to retain in dataDir

dataDir中保留的快照数量

#autopurge.snapRetainCount=3

Purge task interval in hours

Set to “0” to disable auto purge feature

自动清除任务运行时间间隔,单位为小时,

若设置为 0 则禁用自动清除功能

#autopurge.purgeInterval=1

zk 指标监控提供者,官方推荐用prometheus普罗米修斯

Metrics Providers

https://prometheus.io Metrics Exporter

#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider

#metricsProvider.httpPort=7000

#metricsProvider.exportJvmInfo=true

zoo.cfg配置内容最后面是ZooKeeper指标数据监控配置,官方推荐用prometheus,如果用生产中用influxdb存储zk指标数据,本人推荐用Telegraf

五、ZooKeeper集群搭建


ZooKeeper集群中只要有半数以上节点存活,就能正常对外提供服务,所以Zookeeper集群一般运行奇数个服务端。由于学习用的Linux只有一台,只能搭建一个伪集群,不过理论上都是一样的。

1、伪集群

搭建ZooKeeper集群至少需要同时运行三个zk服务实例,如果其中一个挂了,依然可以正常对外提供服务。

(1)准备myid文件

为三个ZK实例创建数据存储目录。

在/usr/local/zookeeper/apache-zookeeper-3.7.0/data目录下

创建zoo-1、zoo-2、zoo-3

mkdir data/zoo-1 && mkdir data/zoo-2 && mkdir data/zoo-1

为三个目录分别创建myid文件,其内容只有一个数字编号,分别为1、2、3。myid文件中的编号唯一标识服务节点,用于Leader投票选举。

(2)配置zoo-.cfg文件

复制修改三份zoo.cfg,分别为zoo-1.cfgzoo-2.cfgzoo-3.cfg

zoo-1.cfg

没有显示的配置项和zoo.cfg一致

dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo-1

clientPort=2191

server.1 = 127.0.0.1:2888:3888

server.2 = 127.0.0.1:2889:3889

server.3 = 127.0.0.1:2890:3890

zoo-2.cfg

没有显示的配置项和zoo.cfg一致

dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo-2

clientPort=2192

server.1 = 127.0.0.1:2888:3888

server.2 = 127.0.0.1:2889:3889

server.3 = 127.0.0.1:2890:3890

zoo-3.cfg

没有显示的配置项和zoo.cfg一致

dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.0/data/zoo-3

clientPort=2193

server.1 = 127.0.0.1:2888:3888

server.2 = 127.0.0.1:2889:3889

server.3 = 127.0.0.1:2890:3890

由于三个伪实例在一台机器上运行,所以clientPort不一样,实际生产中三个zk实例会运行在不同机器上,clientPort建议一致(2181)。

每个配置中都有相同的三行配置,表示这是一个集群关系配置:

server.A=B:C:D

  • A是一个数字,就是每个zk实例的myid文件中的编号。

  • B是ip地址,每个zk实例所在的机器ip。

  • C是集群中 LeaderFollower通信的端口,如LeaderFollower发送同步写指令,Follower将写请求转发给Leader。(通信端口)

  • D是集群中用于投票选举Leader的端口。(选举端口)

实际生产中,不同的zk实例运行在不同机器上,所以通信端口和选举端口各需要一个即可。

2、集群启动第一次Leader选举

依次执行如下命令,启动集群:

在/usr/local/zookeeper/apache-zookeeper-3.7.0目录下

bin/zkServer.sh start conf/zoo-1.cfg

bin/zkServer.sh start conf/zoo-2.cfg

bin/zkServer.sh start conf/zoo-3.cfg

为了看清楚三个zk实例启动时的Leader选举过程,特意在每次start之后穿插status

  • 启动zoo-1时,发起一次投票,zoo-1给自己投一票,此时服务实例不够半数以上,无法对外提供服务。status显示Error contacting service

  • 启动zoo-2时,再发起一次投票,status显示zoo-2leader,zoo-1显示follower,说明zoo-2给自己投了一票,zoo-1也给zoo-2投了一票,服务实例数超过半数,leader选举完成,此时可以对外提供服务。

  • 启动zoo-3时,status显示zoo-3follower。说明后来者zoo-3把选票投给了已经当上了leaderzoo-2

调整启动顺序,zoo-2zoo-1zoo-3

leader依然是zoo-2。

zoo-3放在前两次启动,leader就是zoo-3,最后启动实例都是Follower(演示省略),可得出结论:

  • myid小的投票给myid大的实例。

  • 已经完成leader选举后,后来者会直接把选票投给现任leader,自己甘为Follower

(leader投票选举的更多细节还需要后续看了源码才知道。)

3、模拟服务实例宕机leader重选

Follower实例宕机,只要集群实例个数在半数以上,依然可以对外提供服务,leader的地位也不会动摇,只有当身为leader的实例宕机了,此时就需要重新投票选leader

此时leaderzoo-2,将其stop,再次查看zoo-1zoo-3的状态,zoo-3变成了leader

(更多leader重选细节还需后续看了源码才知道。)

4、编写集群批量启动脚本

集群中每个实例手动一个个执行启动命令,确实比较麻烦,特编写一个批量启动脚本,如果多实例运行在不同机器上,可改成ssh的方式:

#!/bin/bash

case $1 in

“start”){

for i in zoo-1.cfg zoo-2.cfg zoo-3.cfg

do

echo ---------- zookeeper $i 启动 ------------

/usr/local/zookeeper/apache-zookeeper-3.7.0/bin/zkServer.sh start /usr/local/zookeeper/apache-zookeeper-3.7.0/conf/$i

done

};;

“stop”){

for i in zoo-1.cfg zoo-2.cfg zoo-3.cfg

do

echo ---------- zookeeper $i 停止 ------------

/usr/local/zookeeper/apache-zookeeper-3.7.0/bin/zkServer.sh stop /usr/local/zookeeper/apache-zookeeper-3.7.0/conf/$i

done

};;

“restart”){

for i in zoo-1.cfg zoo-2.cfg zoo-3.cfg

do

echo ---------- zookeeper $i 重启 ------------

/usr/local/zookeeper/apache-zookeeper-3.7.0/bin/zkServer.sh restart /usr/local/zookeeper/apache-zookeeper-3.7.0/conf/$i

done

};;

“status”){

for i in zoo-1.cfg zoo-2.cfg zoo-3.cfg

do

echo ---------- zookeeper $i 状态 ------------

/usr/local/zookeeper/apache-zookeeper-3.7.0/bin/zkServer.sh status /usr/local/zookeeper/apache-zookeeper-3.7.0/conf/$i

done

};;

esac

六、要点回顾


ZooKeeper集群搭建好了,就该用客户端连接上集群进行操作了,后续篇章会对客户端操作做详细讲解。

本篇总结如下:

  1. Zookeeper有两个核心设计:Watch机制和ZAB一致性算法。基于此,Zookeeper成为很多分布式系统的基石。

  2. Zookeeper放弃可用性A,保证CP。数据全局强一致性,并且能在几秒内快速同步,具有不错的实时性体验。

  3. Zookeeper数据结构是类UNIX文件系统目录的树状结构,每个ZNode通过其路径(Path)唯一标识,每个ZNode可以存储少量二进制数据,默认最大为1MB。

  4. ZNode有四种类型:持久节点(配置中心,注册中心)、临时节点(服务上下线感知)、时序节点(分布式ID)、临时时序节点(分布式锁)。

  5. Zookeeper的典型的应用场景:配置中心,命名服务,服务注册中心,服务上下线感知,集群通信与控制系统,分布式锁等。

  6. leader选举没有完成前,选票会投给myid较大的实例,选举完成后,后来启动的实例会将选票直接投给现任leader,自己为Follower

知其然不知其所以然,大厂常问面试技术如何复习?

1、热门面试题及答案大全

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer

2、多线程、高并发、缓存入门到实战项目pdf书籍

3、文中提到面试题答案整理

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

88126712)]

[外链图片转存中…(img-6BxvBu8Q-1714188126712)]

3、文中提到面试题答案整理

[外链图片转存中…(img-9a9M7ilp-1714188126713)]

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入

[外链图片转存中…(img-JpDifJAO-1714188126713)]

[外链图片转存中…(img-dgLHKcXv-1714188126713)]

[外链图片转存中…(img-FeQagqE8-1714188126714)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值