我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Zookeeper集群搭建以及python操作zk

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Zookeeper集群搭建以及python操作zk

ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

1341090-20181211173019039-503730897.png

Zookeeper设计目的

  • 最终一致性:client不论连接到那个Server,展示给它的都是同一个视图。

  • 可靠性:具有简单、健壮、良好的性能、如果消息m被到一台服务器接收,那么消息m将被所有服务器接收。

  • 实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

  • 等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。

  • 原子性:更新只能成功或者失败,没有中间状态。

  • 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

Zookeeper工作原理

1、在zookeeper的集群中,各个节点共有下面3种角色和4种状态:

角色:leader,follower,observer
状态:leading,following,observing,looking

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议(ZooKeeper Atomic Broadcast protocol)。Zab协议有两种模式,它们分别是恢复模式(Recovery选主)和广播模式(Broadcast同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。

为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。

每个Server在工作过程中有4种状态:

LOOKING:当前Server不知道leader是谁,正在搜寻。

LEADING:当前Server即为选举出来的leader。

FOLLOWING:leader已经选举出来,当前Server与之同步。

OBSERVING:observer的行为在大多数情况下与follower完全一致,但是他们不参加选举和投票,而仅仅接受(observing)选举和投票的结果。

Zookeeper集群节点

  • Zookeeper节点部署越多,服务的可靠性越高,建议部署奇数个节点,因为zookeeper集群是以宕机个数过半才会让整个集群宕机的。

  • 需要给每个zookeeper 1G左右的内存,如果可能的话,最好有独立的磁盘,因为独立磁盘可以确保zookeeper是高性能的。如果你的集群负载很重,不要把zookeeper和RegionServer运行在同一台机器上面,就像DataNodes和TaskTrackers一样。

 

实验环境

操作系统docker镜像docker ipzookeeper版本
ubuntu-16.04.5-server-amd64ubuntu:16.04172.168.0.23.4.13
ubuntu-16.04.5-server-amd64ubuntu:16.04172.168.0.23.4.13
ubuntu-16.04.5-server-amd64ubuntu:16.04172.168.0.23.4.13

 

 

 

 

 


由于机器有限,本文在一台服务器上面,开启了3个docker容器。

使用网桥连接3个docker容器。这样,就可以模拟3台服务器了!

 

创建网桥

bridge有以下好处:

  1. 好的隔离性和互操作性:连到同一自定义的bridge的各个容器默认相互之间曝露所有端口,并且不对外部曝露

  2. 自动提供容器之间的DNS解析服务:连到同一自定义的bridge的各个容器不用做特殊DNS配置,可直接通过hostname访问

  3. 运行中容器联网配置:可对运行中的容器配置自定义或取消配置自定义bridge

  4. bridge之间相互独立:用户可创建N多个bridge,且连接于不同的bridge之上的容器相互独立

 

创建自定义bridge,名字叫br1

docker network create --driver=bridge --subnet=172.168.0.0/16 br1

 

语法解释:

--driver=bridge 表示使用桥接模式

--subnet 表示网络地址

 

为容器配置静态IP,可以使用以下命令

docker run -it --network my-net --ip 172.18.0.250 imageID bash

 

Zookeeper核心要点

1. Zookeeper节点必须是奇数

2. 修改zoo.cfg

末尾增加3行参数。表示有3个zk节点!

server.X=A:B:C
server.X=A:B:C
server.X=A:B:C

 

官方解释

The entries of the form server.X list the servers that make up the ZooKeeper service. When the server starts up, it knows which server it is by looking for the file myid in the data directory. That file has the contains the server number, in ASCII.
Finally, note the two port numbers after each server name: " 2888" and "3888". Peers use the former port to connect to other peers. Such a connection is necessary so that peers can communicate, for example, to agree upon the order of updates. More specifically, a ZooKeeper server uses this port to connect followers to the leader. When a new leader arises, a follower opens a TCP connection to the leader using this port. Because the default leader election also uses TCP, we currently require another port for leader election. This is the second port in the server entry.

 

蹩脚翻译

表单server.X的条目列出构成ZooKeeper服务的服务器。当服务器启动时,它通过查找数据目录中的文件myid来知道它是哪个服务器 。该文件包含服务器编号,以ASCII格式显示。
最后,请注意每个服务器名称后面的两个端口号:“2888”和“3888”。对等体使用前端口连接到其他对等体。这样的连接是必要的,使得对等体可以进行通信,例如,以商定更新的顺序。更具体地说,一个ZooKeeper服务器使用这个端口来连接追随者到领导者。当新的领导者出现时,追随者使用此端口打开与领导者的TCP连接。因为默认领导选举也使用TCP,所以我们目前需要另外一个端口进行领导选举。这是服务器条目中的第二个端口。

 

大概意思

server.X=A:B:C

X-代表服务器编号

A-代表ip

B和C-代表端口,这个端口用来系统之间通信


 

3. 创建ServerID标识

除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir目录下。

这个文件里面有一个数据就是A的值(该A就是zoo.cfg文件中server.A=B:C:D中的A),在zoo.cfg文件中配置的dataDir路径中创建myid文件

 

Zookeeper运行需要java环境,需要安装jdk,注:每台服务器上面都需要安装zookeeper、jdk。

基于docker安装

新建空目录

mkdir /opt/zookeeper_cluster

 

dockerfile

FROM ubuntu:16.04
# 修改更新源为阿里云
ADD sources.list /etc/apt/sources.list
ADD zookeeper-3.4.13.tar.gz /
ADD zoo.cfg / 
# 安装jdk
RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all && \ 
    cd /zookeeper-3.4.13 && \
    mkdir data log && \
    mv /zoo.cfg conf
EXPOSE 2181
# 添加启动脚本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

 

run.sh

#!/bin/bash
if [ -z "${SERVER_ID}" ];then
    echo "SERVER_ID 变量缺失"
    exit 1
fi
if [ -z "${ZOOKEEPER_CONNECT}" ];then
        echo "ZOOKEEPER_CONNECT环境变量缺失"
        echo "比如: 192.168.1.1,192.168.1.2,192.168.1.3"
        exit 2
fi
# 配置集群
# 写入server.X对应的X
echo $SERVER_ID > /zookeeper-3.4.13/data/myid
# 写入文件zoo.cfg
id=0  # 初始值
hosts_array=(${ZOOKEEPER_CONNECT//,/ })  # 以逗号来切割,转换为数组
for ip in ${hosts_array[@]};do
    ((id++))  # id自增1
    echo "server.$id=$ip:2888:3888" >> /zookeeper-3.4.13/conf/zoo.cfg
done
# 启动zookeeper
cd /zookeeper-3.4.13/
bin/zkServer.sh start
tail -f /zookeeper-3.4.13/conf/zoo.cfg

 

注意:此脚本需要2个变量,否则会直接退出。它会在zoo.cfg写入3行内容!

除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir目录下

/zookeeper-3.4.13/data/myid 这个文件的数值,待会由docker启动时,传入进去。

 

 sources.list

deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

 

zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper-3.4.13/data
dataLogDir=/zookeeper-3.4.13/log
clientPort=2181

 

initLimit 这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。

syncLimit 这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。

注意:上面的2行红色部分参数,一定要加。否则会导致启动zookeeper失败,因为启动时,它会尝试连接server.X=A:B:C。有多少个,都会连接。

如果连接失败数大于集群总数一半,会认为集群不可用。

那么配置这2个参数之后,就会有时间缓解一下。因为我不是闪电侠,我不能在一瞬间同时启动3个zookeeper。而且你还得确保,zookeeper检查其他节点时,其他节点运行是正常的!

因此,只要你在10秒内,启动3个zookeeper,就可以了!

 

此时,目录结构如下:

./
├── dockerfile
├── run.sh
├── sources.list
├── zoo.cfg
└── zookeeper-3.4.13.tar.gz

 

生成镜像

docker build -t zookeeper_cluster /opt/zookeeper_cluster

 

启动docker

在启动之前,请确保已经创建了网桥br1

 

启动第一个docker

docker run -it -e SERVER_ID=1 -e ZOOKEEPER_CONNECT=172.168.0.2,172.168.0.3,172.168.0.4 -p 2181:2181 --network br1 --ip=172.168.0.2 zookeeper_cluster

 

启动第二个docker

docker run -it -e SERVER_ID=2 -e ZOOKEEPER_CONNECT=172.168.0.2,172.168.0.3,172.168.0.4 -p 2182:2181 --network br1 --ip=172.168.0.3 zookeeper_cluster

 

启动第二个docker

docker run -it -e SERVER_ID=3 -e ZOOKEEPER_CONNECT=172.168.0.2,172.168.0.3,172.168.0.4 -p 2183:2181 --network br1 --ip=172.168.0.4 zookeeper_cluster

 

注意红色部分,是需要修改的,其他的参数都是一样的!

查看每个节点状态

先来查看一下docker进程


root@jqb-node128:/opt/zookeeper_cluster# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
217e012c9566        3f3a8090dcb6        "/run.sh"           15 hours ago        Up 15 hours         0.0.0.0:2183->2181/tcp   gallant_golick
3b4861d2fef9        3f3a8090dcb6        "/run.sh"           15 hours ago        Up 15 hours         0.0.0.0:2182->2181/tcp   jovial_murdock
ed91c1f973d2        3f3a8090dcb6        "/run.sh"           15 hours ago        Up 15 hours         0.0.0.0:2181->2181/tcp   dazzling_hamilton


 

查看每个节点状态,使用命令 zkServer.sh status 查看


root@jqb-node128:~# docker exec -it 217e012c9566 /zookeeper-3.4.13/bin/zkServer.sh statusZooKeeper JMX enabled by default
Using config: /zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: followerroot@jqb-node128:~# docker exec -it 3b4861d2fef9 /zookeeper-3.4.13/bin/zkServer.sh statusZooKeeper JMX enabled by default
Using config: /zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: leaderroot@jqb-node128:~# docker exec -it ed91c1f973d2 /zookeeper-3.4.13/bin/zkServer.sh statusZooKeeper JMX enabled by default
Using config: /zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: follower


 

可以发现,第二台,也就是id为3b4861d2fef9 的容器,就是leader模式。其它容器是follow模式

 

四、Zookeeper集群连接

 Zookeeper集群搭建完毕之后,可以通过客户端脚本连接到zookeeper集群上面,对客户端来说,zookeeper集群是一个整体,连接到zookeeper集群实际上感觉在独享整个集群的服务。

 

指定第一台节点

docker exec -it 217e012c9566 /zookeeper-3.4.13/bin/zkCli.sh -server 172.168.0.2:2181

 

使用ls / 查看根节点,默认只有一个zookeeper节点。

WatchedEvent state:SyncConnected type:None path:null[zk: 172.168.0.2:2181(CONNECTED) 0] ls /[zookeeper]
[zk: 172.168.0.2:2181(CONNECTED) 1]

 

kazoo 介绍

zookeeper的开发接口以前主要以java和c为主,随着python项目越来越多的使用zookeeper作为分布式集群实现,python的zookeeper接口也出现了很多,现在主流的纯python的zookeeper接口是kazoo。因此如何使用kazoo开发基于python的分布式程序是必须掌握的。

 

安装kazoo

pip3 install kazoo

 

基本操作

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就写127.0.0.1zk.start()    #与zookeeper连接
zk.stop()    #与zookeeper断开

 

创建节点

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就写127.0.0.1
zk.start()    #与zookeeper连接
#makepath=True是递归创建,如果不加上中间那一段,就是建立一个空的节点
zk.create('/abc/JQK/XYZ/0001',b'this is my house',makepath=True)
node = zk.get_children('/')  # 查看根节点有多少个子节点
print(node)
zk.stop()    #与zookeeper断开

 

执行输出:

['abc', 'zookeeper']

 

注意:空节点的值不能用set修改,否则执行报错!

 

删除节点

如果要删除这个/abc/JQK/XYZ/0001的子node,但是想要上一级XYZ这个node还是存在的,语句如下:

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就写127.0.0.1
zk.start()    #与zookeeper连接
#recursive=True是递归删除,就是无视下面的节点是否是空,都干掉,不加上的话,会提示子节点非空,删除失败
zk.delete('/abc/JQK/XYZ/0001',recursive=True)
node = zk.get_children('/')  # 查看根节点有多少个子节点
print(node)
zk.stop()    #与zookeeper断开

 

执行输出:

['abc', 'zookeeper']

 

更改节点

现在假如要在0001这个node里更改value,比如改成:"this is my horse!",

由于上面节点已经被删除掉了,需要先创建一次。

语句如下:

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就写127.0.0.1
zk.start()    #与zookeeper连接
zk.create('/abc/JQK/XYZ/0001',b'this is my house',makepath=True)
zk.set('/abc/JQK/XYZ/0001',b"this is my horse!")
node = zk.get('/abc/JQK/XYZ/0001')  # 查看值
print(node)
zk.stop()    #与zookeeper断开

 

执行输出:

(b'this is my horse!', ZnodeStat(czxid=4294967449, mzxid=4294967452, ctime=1544598301273, mtime=1544598308267, version=1, cversion=0, aversion=0, ephemeralOwner=0, dataLength=17, numChildren=0, pzxid=4294967449))

 

注意!set这种增加节点内容的方式是覆盖式增加,并不是在原有基础上增添。而且添加中文的话可能在ZooInspecter里出现的是乱码

 

查看节点

由于所有节点,都是在/ 节点上面的,直接查看根节点,就可以知道所有节点了

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就写127.0.0.1
zk.start()    #与zookeeper连接
node = zk.get_children('/')
print(node)
zk.stop()    #与zookeeper断开

 

执行输出:

['abc', 'zookeeper']

 

一键清空zookeeper

有些时候,需要将zookeeper的数据全部清空,可以使用以下代码

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就写127.0.0.1
zk.start()    #与zookeeper连接
jiedian = zk.get_children('/')  # 查看根节点有多少个子节点
print(jiedian)
for i in jiedian:
    if i != 'zookeeper':  # 判断不等于zookeeper
        print(i)
        # 删除节点
        zk.delete('/%s'%i,recursive=True)
zk.stop()    #与zookeeper断开

 

注意:默认的zookeeper节点,是不允许删除的,所以需要做一个判断。

 

 

 

本文参考链接:

https://www.cnblogs.com/linuxprobe/p/5851699.html

http://www.cnblogs.com/LUA123/p/7222216.html

http://blog.51cto.com/chenx1242/2053627


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Zookeeper集群搭建以及python操作zk

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Zookeeper集群搭建以及python操作zk

ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zookeeper设计目的最终一致性:client不论连接到那个Server,展示给它的都是同一个
2023-01-31

ZooKeeper集群操作及集群Master选举搭建启动

这篇文章主要为大家介绍了ZooKeeper集群操作及集群Master选举搭的建启动详解,<BR>有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

Zookeeper集群的搭建及介绍

本篇内容主要讲解“Zookeeper集群的搭建及介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Zookeeper集群的搭建及介绍”吧!1.搭建怎么搭建单机无安全校验的就不说了,百度一搜一大堆
2023-06-19

redis 集群搭建以及redisli

实现3主3从的集群 虚拟机单机ip:192.168.40.128集群基本搭建简单下载通过 wget http://download.redis.io/releases/redis-4.0.10.tar.gz解压缩 tar zxvf redi
2023-01-31

Hadoop集群怎么搭建及如何进行Python操作

这期内容当中小编将会给大家带来有关Hadoop集群怎么搭建及如何进行Python操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。最近项目中在做千亿大数据存储检索需求,要把10T的文本数据进行解析处理存入
2023-06-15

ZooKeeper在单机和集群环境下怎么安装搭建及使用

这篇文章主要讲解了“ZooKeeper在单机和集群环境下怎么安装搭建及使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ZooKeeper在单机和集群环境下怎么安装搭建及使用”吧!1、下载首
2023-06-29

zabbix集群搭建分布式监控的操作步骤

zabbix通过zabbix proxies为IT基础设施提供有效的可用的风不是监控代理(proxy)可用于代替zabbix server本地手机数据,然后将数据报告给服务器,对zabbix分布式监控操作步骤感兴趣的朋友一起看看吧
2022-11-13

集群和负载均衡的概念以及用apache和tomcat搭建集群的方法

本篇内容介绍了“集群和负载均衡的概念以及用apache和tomcat搭建集群的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、集群和负
2023-06-05

Python如何制作简易聊天器以及搭建UDP网络通信模型

这篇文章将为大家详细讲解有关Python如何制作简易聊天器以及搭建UDP网络通信模型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言:互联网的本质是什么?其实就是信息的交换。就比如我们常用
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录