zookeeper初探

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
云原生网关 MSE Higress,422元/月
简介: 大数据解决方案里面有一个组件是zookeeper,最开始看到这个的时候,脑海里不由得闪现出一个职业,动物园管理员。打开Apache里面的项目介绍,发现和我想的也差不多,看里面的测试目录确实都是各种动物,得管管了。

大数据解决方案里面有一个组件是zookeeper,最开始看到这个的时候,脑海里不由得闪现出一个职业,动物园管理员。打开Apache里面的项目介绍,发现和我想的也差不多,看里面的测试目录确实都是各种动物,得管管了。

现在谈到大数据,必然会谈到分布式,zookeeper就是分布式里面的一种解决方案,主要面向分布式应用程序协调服务,是Google的Chubby一个开源的实现,

ZooKeeper的目标比较单纯,就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

  zookeeper的技术基因很不错,是以Fast Paxos算法为基础的,而我们熟知的MySQL Group Replication是基于Paxos实现,所以从长远来说,高可用方案我很看好MGR,尽管目前InnoDB Cluster也在改进,MGR自身也在改进,方向是光明的。就如同zookeeper如今已从原本的子项目剥离出来,成为了Apache的顶级项目之一。

    如果对zookeeper一无所知,需要对它有一个整体的认识是很重要的。我们就通过一个简单的小示例来说一下。

    首先就是老生常谈的安装部署了。基本就是解压和简单的配置。

关于版本的选择,3.5还是alpha版本,所以基本不考虑,往前退一个版本,那就是3.4.9

解压后的目录结构还是比较清晰的。我们直接到conf目录下,做个配置。

加入下面的配置,生成配置文件zoo.cfg。

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/zookeeper/zookeeper-3.4.9/data
clientPort=2181
server.1=192.168.253.129:2888:3888
server.2=192.168.253.128:2888:3888
server.3=192.168.253.131:2888:3888

其中data目录是自己需要手工创建的,下面的3个节点server.1-server.3是我们模拟测试的3套环境。客户端访问的默认端口为2181,其他的网络端口为2888,3888,需要提前开通。zookeeper可以支持单机也可以支持集群,我们测试的是集群的环境,最少需要3个节点。

使用如下的方式启动zookeeper

$ ./zkServer.sh  start
ZooKeeper JMX enabled by default
Using config: /home/xxx/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

启动之后ps -ef|grep zoo是可以看到对应的进程的,或者使用netstat来看看网络服务是否正常。

$ echo ruok | nc localhost 2181
imok

如果现实为imok就证明I am ok了。

在节点1上面这样部署,节点2,节点3上面也是如法炮制。安装目录很IAO,所以整个过程还是比较简单的。

我们可以根据zkServer.sh staus来看到每个节点的角色,比如领导者(leader),选举者(follower)

# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: leader

说几个安装部署中的简单错误吧。

2017-10-08 04:11:37,671 [myid:] - WARN  [main:QuorumPeerConfig@305] - No server failure will be tolerated. You need at least 3 servers.

这里的原因是需要最少3个节点。

Caused by: java.lang.IllegalArgumentException: /root/zookeeper/zookeeper-3.4.9/data/myid file is missing

这里的原因是在data目录下需要有一个myid的文件,就和MySQL里面的server-id差不多。

Caused by: java.lang.IllegalArgumentException: serverid this is a test is not a number
这里的原因是myid是整数,不能配置字符等。

使用zkCli.sh登录客户端,我们通过这种方式连接到任意的节点,还能保持数据的同步,这也是zookeeper的魅力所在。

比如./zkCli.sh -server 192.168.253.128

查看根目录下的目录情况。

[zk: 192.168.253.128(CONNECTED) 1] ls /
[zookeeper, mgr]

查看mgr目录的结构,可以看到lion和tiger

[zk: 192.168.253.128(CONNECTED) 6] ls /mgr
[lion, tiger]

目录mgr的标签对应的数据是test

[zk: 192.168.253.128(CONNECTED) 7] get /mgr
test
cZxid = 0x100000002
ctime = Tue Oct 10 08:55:41 CST 2017
mZxid = 0x100000002
mtime = Tue Oct 10 08:55:41 CST 2017
pZxid = 0x10000000c
cversion = 2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 2

查看/mgr/tiger目录的标签数据,是tiger_test,当然还有其他丰富的属性。

[zk: 192.168.253.128(CONNECTED) 9] get /mgr/tiger
tiger_test
cZxid = 0x100000009
ctime = Tue Oct 10 09:03:35 CST 2017
mZxid = 0x100000009
mtime = Tue Oct 10 09:03:35 CST 2017
pZxid = 0x100000009
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 0

我们创建一个目录money,对应的值为money_test

[zk: 192.168.253.128(CONNECTED) 11] create /mgr/monkey monkey_test
Created /mgr/monkey

得到的值为,在其他任意的节点上查看都会看到同样的数据,这些数据很小巧,都在内存里面。

[zk: 192.168.253.128(CONNECTED) 13] get /mgr/monkey
monkey_test
cZxid = 0x300000007
ctime = Tue Oct 10 09:59:06 CST 2017
mZxid = 0x300000007
mtime = Tue Oct 10 09:59:06 CST 2017
pZxid = 0x300000007
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

至于后续的补充,那就值得深入实践了,保证技术的可控。

当然zookeeper实现的功能数据的同步只是其中之一,还有很多不错的选择,比如在并发中如果解决锁的问题等,这些都是zookeeper称为一个实用项目的考验。


个人微信公众号,欢迎扫码关注。


目录
相关文章
|
SQL 安全 数据库
SQLServer 实现数据库表复制到另一个数据库_kaic
SQLServer 实现数据库表复制到另一个数据库_kaic
|
6月前
|
机器学习/深度学习 运维 自然语言处理
当深度学习遇上故障根因分析:运维人的绝佳拍档
当深度学习遇上故障根因分析:运维人的绝佳拍档
279 17
|
存储 数据管理 数据库
理解数据库中的参照完整性
【6月更文挑战第13天】数据库设计旨在创建和维护企业的数据管理系统,确保数据完整性和消除冲突。好的数据库设计应减少冗余,保证信息准确完整,并满足处理和报告需求。设计工具包括E-R图和UML等。
1074 2
理解数据库中的参照完整性
|
运维 前端开发 API
耗时一下午,我终于上线了我的 GPT 终端!(内含详细部署方案记录)
耗时一下午,我终于上线了我的 GPT 终端!(内含详细部署方案记录)
621 0
|
Java 程序员 开发工具
Java开发——19.异常
异常:指的是程序在执行的过程中,出现的非正常的情况,最终会导致Java虚拟机(JVM)非正常停止。
Java开发——19.异常
|
JavaScript 前端开发 程序员
项目提成计算器——JavaScript原型链的使用
项目提成为只读模式,要求有3个角色可以选择,分别为程序员、项目经理、销售人员。效果图如下,要按照每个角色,点击“计算”按钮,可以进行计算。
项目提成计算器——JavaScript原型链的使用
|
Linux API
Linux中的工作队列
工作队列(work queue)是Linux kernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。
1106 0
|
定位技术 C#
游戏开发 人物部分透明
假设你已经完成排序功能,那么,拓展一下思维,结合这两种方式,如果提供两张人物图,一张放在建筑后,一张放在建筑前(就是两张一模一样的图把建筑夹在中间),那把前一张图的alpha值设为0.5的话,因为叠加的关系,表现出来就是和建筑重合的部分变为半透明,而其它部分仍旧是不透明。