zookeeper初探
大数据解决方案里面有一个组件是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称为一个实用项目的考验。
- 14(02)正则表达式,Pattern,Mactcher,Math,BigInteger,BigDeximal,System等
- R语言 判别分析
- Apache、struts1、struts2文件上传下载的3种方式
- 解析实时的DB time过程分析(r6笔记第35天)
- sql嵌入html格式显示报表(r6笔记第34天)
- hive计算日期差函数datediff,hive修改日期连接符
- 深度学习界的 “吃鸡挂”——目标检测 SSD 实验
- Hadoop查看所有JOB以及如何Kill指定用户的所有Job
- Java基础-23(01)总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程
- ORA-01427问题的分析和解决(r6笔记第51天)
- 从编程实现角度学习 Faster R-CNN(附极简实现)
- Java基础-23(02)总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程
- 8 个最好的 Java RESTful 框架
- 【C++基础】C++11 lambda 表达式解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 不可忽视的CSS布局
- 让小黑窗口听你指挥
- Element表单嵌套数据验证
- 摸鱼的新发现,滚动条无限滚动
- 理解装饰器是怎么使用的
- 第十一节:Activiti6.0——定时器开始事件、消息开始事件和错误开始事件介绍
- linux centos 安装mailx邮件服务器并测试发送一封邮件
- 深入分析Vue-Router原理,彻底看穿前端路由
- linux LVM 一键分区脚本自动扩容
- 再谈构造函数、原型、原型链之间的关系
- Java ConcurrentHashMap 高并发安全实现原理解析
- 第十二节:Activiti6.0——四种边界事件:定时器、错误、信号、补偿
- parted 磁盘分区-挂载-删除-shell脚本进行磁盘分区
- Ubuntu18.04——安装MySQL
- 八种 Vue 组件间通讯方式合集