1. ZooKeeper应用实践

qdice007@gmail.com 2017-12-21 21:17

写在前面的废话

大数据之所以日渐崛起,是因为海量数据的处理,必须依靠集群的威力,而集群又带来了一个新问题,那就是成百上千的这么多机器,如何协调一致,如何满足既可用又一致的要求? ZooKeeper就是其中一个答案.
推荐一本书可以看看,阿里的人写的


s28377338.jpg

开始

ZooKeeper环境搭建前提条件

  • 已经按照之前的文章装好了三台虚拟机,并已配置好CentOS 7,保证三台机器之间可以网络互通,可以ssh免密登录
  • JDK已安装,并配好环境变量
  • 在ZooKeeper官网下载了软件包(zookeeper-3.4.10.tar.gz),并放在 /home/libing/softwares 目录下

ZooKeeper环境搭建步骤(都以提前建好的普通用户libing来操作)

1. 解压软件包至用户libing的家目录下
[libing@bd-1 ~]$ tar -xzf softwares/zookeeper-3.4.10.tar.gz -C /home/libing/
[libing@bd-1 ~]$ ll
总用量 8
drwxr-xr-x.  8 libing libing  255 9月  14 17:27 jdk1.8.0_152
drwxrwxr-x.  2 libing libing  148 12月 20 20:09 softwares
drwxr-xr-x  10 libing libing 4096 3月  23 2017 zookeeper-3.4.10
2. 编辑 /etc/profile 文件,给系统增加环境变量ZOOKEEPER_HOME,以及修改PATH环境变量
[libing@bd-1 ~]$ sudo vi /etc/profile
[sudo] libing 的密码:

在文件内容的最后添加以下内容

# Added for ZooKeeper
ZOOKEEPER_HOME=/home/libing/zookeeper-3.4.10
export ZOOKEEPER_HOME
PATH=${ZOOKEEPER_HOME}/bin:$PATH
export PATH

保存退出vi

3. 使之马上生效,以及进行验证
[libing@bd-1 ~]$ source /etc/profile
[libing@bd-1 ~]$ env | grep ZOOK
ZOOKEEPER_HOME=/home/libing/zookeeper-3.4.10
[libing@bd-1 ~]$ ls zookeeper-3.4.10/bin
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh
[libing@bd-1 ~]$ which zkServer.sh
~/zookeeper-3.4.10/bin/zkServer.sh

简单解释一下上面的命令

  • source是执行脚本的命令,将读取/etc/profile的内容,并逐一执行
  • env是输出当前用户所有的环境变量
  • grep是搜索过滤的命令,env | grep ZOOK 表示把env的输出,作为grep命令的输入,并在其中查找包含ZOOK字符的行,打印出来
  • which命令可以在当前的PATH环境变量包含的所有路径中,寻找某个文件,如果找到了,就把这个文件的路径加文件名打印出来
4. 进入ZooKeeper的conf目录,复制并编辑zoo.cfg配置文件
[libing@bd-1 ~]$ cd zookeeper-3.4.10/conf
[libing@bd-1 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[libing@bd-1 conf]$ cp zoo_sample.cfg zoo.cfg
[libing@bd-1 conf]$ vi zoo.cfg

在文件的最后增加如下内容

# store snapshot files
dataDir=/home/libing/zookeeper-3.4.10/data
# store transaction log files
dataLogDir=/home/libing/zookeeper-3.4.10/log

server.1=bd-1:2888:3888
server.2=bd-2:2888:3888
server.3=bd-3:2888:3888

保存后退出vi.
注意上面内容中的路径,以及bd-1等主机名,需要根据你自己虚拟机的情况进行改动.

5. 在ZooKeeper软件目录下创建data和log目录,并修改权限属性
[libing@bd-1 conf]$ cd ~/zookeeper-3.4.10
[libing@bd-1 zookeeper-3.4.10]$ mkdir data log
[libing@bd-1 zookeeper-3.4.10]$ chmod 755 data log
6. 创建myid文件并填入内容(以bd-1虚拟机上操作为例)
[libing@bd-1 zookeeper-3.4.10]$ echo 1 > data/myid
[libing@bd-1 zookeeper-3.4.10]$ cat data/myid 
1
7. 启动ZooKeeper服务,并查看状态

这是bd-1虚拟机的

[libing@bd-1 zookeeper-3.4.10]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/libing/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[libing@bd-1 zookeeper-3.4.10]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/libing/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

这是bd-2虚拟机的

[libing@bd-2 zookeeper-3.4.10]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/libing/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[libing@bd-2 zookeeper-3.4.10]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/libing/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader

这是bd-3虚拟机的

[libing@bd-3 zookeeper-3.4.10]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/libing/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[libing@bd-3 zookeeper-3.4.10]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/libing/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

可以看到bd-2虚拟机的ZooKeeper是leader,其他两台都是follower.

8. 停止ZooKeeper

在每台虚拟机上执行(以bd-1虚拟机为例)

[libing@bd-1 zookeeper-3.4.10]$ zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /home/libing/zookeeper-3.4.10/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
9. 使用一个脚本实现所有虚拟机的ZooKeeper启动/关闭

创建ZooKeeper集群启动脚本(存放于bd-1虚拟机并执行)

[libing@bd-1 ~]$ vi zkStartAll.sh

脚本内容如下

#!/bin/bash
echo "Start ZooKeeper service ..."
for i in 1 2 3
do
    ssh bd-$i "source /etc/profile ; zkServer.sh start"
done
echo "ZooKeeper started!"

执行

[libing@bd-1 ~]$ chmod u+x zkStartAll.sh 
[libing@bd-1 ~]$ ./zkStartAll.sh 

创建ZooKeeper集群关闭脚本(存放于bd-1虚拟机并执行)

[libing@bd-1 ~]$ vi zkStopAll.sh

脚本内容如下

#!/bin/bash
echo "Stop ZooKeeper service ..."
for i in 1 2 3
do
    ssh bd-$i "source /etc/profile ; zkServer.sh stop"
done
echo "ZooKeeper stopped!"

执行

[libing@bd-1 ~]$ chmod u+x zkStopAll.sh 
[libing@bd-1 ~]$ ./zkStopAll.sh

可以分别在每台虚拟机上使用 zkServer.sh status验证脚本的效果.

注意点: 三台虚拟机之间的ssh免密登录一定要配置好,包括每个虚拟机ssh登录本身自己也要免密

ZooKeeper运维操作实验

1. 进入客户端zkCli.sh

不使用任何参数的话,就是连接本地的ZooKeeper.

[libing@bd-1 ~]$ zkCli.sh
Connecting to localhost:2181
2017-12-25 10:31:20,623 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
2017-12-25 10:31:20,628 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=bd-1
2017-12-25 10:31:20,628 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_152
2017-12-25 10:31:20,633 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2017-12-25 10:31:20,634 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/home/libing/jdk1.8.0_152/jre
2017-12-25 10:31:20,635 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/home/libing/zookeeper-3.4.10/bin/../build/classes:/home/libing/zookeeper-3.4.10/bin/../build/lib/*.jar:/home/libing/zookeeper-3.4.10/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/libing/zookeeper-3.4.10/bin/../lib/slf4j-api-1.6.1.jar:/home/libing/zookeeper-3.4.10/bin/../lib/netty-3.10.5.Final.jar:/home/libing/zookeeper-3.4.10/bin/../lib/log4j-1.2.16.jar:/home/libing/zookeeper-3.4.10/bin/../lib/jline-0.9.94.jar:/home/libing/zookeeper-3.4.10/bin/../zookeeper-3.4.10.jar:/home/libing/zookeeper-3.4.10/bin/../src/java/lib/*.jar:/home/libing/zookeeper-3.4.10/bin/../conf:
2017-12-25 10:31:20,636 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2017-12-25 10:31:20,636 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2017-12-25 10:31:20,636 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2017-12-25 10:31:20,637 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
2017-12-25 10:31:20,637 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
2017-12-25 10:31:20,637 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=3.10.0-693.11.1.el7.x86_64
2017-12-25 10:31:20,638 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=libing
2017-12-25 10:31:20,638 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/home/libing
2017-12-25 10:31:20,638 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/home/libing
2017-12-25 10:31:20,642 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@7aec35a
Welcome to ZooKeeper!
2017-12-25 10:31:20,692 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2017-12-25 10:31:20,836 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@876] - Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session
2017-12-25 10:31:20,855 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x1608b7c924d0001, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]

退出zkCli

[zk: localhost:2181(CONNECTED) 0] quit
Quitting...
2017-12-25 10:31:26,565 [myid:] - INFO  [main:ZooKeeper@684] - Session: 0x1608b7c924d0001 closed
2017-12-25 10:31:26,569 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x1608b7c924d0001
[libing@bd-1 ~]$ 

在bd-1虚拟机上连接bd-2上的ZooKeeper

[libing@bd-1 ~]$ zkCli.sh -server bd-2:2181
Connecting to bd-2:2181
2017-12-25 10:31:57,966 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
2017-12-25 10:31:57,970 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=bd-1
2017-12-25 10:31:57,970 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_152
2017-12-25 10:31:57,972 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2017-12-25 10:31:57,972 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/home/libing/jdk1.8.0_152/jre
2017-12-25 10:31:57,973 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/home/libing/zookeeper-3.4.10/bin/../build/classes:/home/libing/zookeeper-3.4.10/bin/../build/lib/*.jar:/home/libing/zookeeper-3.4.10/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/libing/zookeeper-3.4.10/bin/../lib/slf4j-api-1.6.1.jar:/home/libing/zookeeper-3.4.10/bin/../lib/netty-3.10.5.Final.jar:/home/libing/zookeeper-3.4.10/bin/../lib/log4j-1.2.16.jar:/home/libing/zookeeper-3.4.10/bin/../lib/jline-0.9.94.jar:/home/libing/zookeeper-3.4.10/bin/../zookeeper-3.4.10.jar:/home/libing/zookeeper-3.4.10/bin/../src/java/lib/*.jar:/home/libing/zookeeper-3.4.10/bin/../conf:
2017-12-25 10:31:57,973 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2017-12-25 10:31:57,973 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2017-12-25 10:31:57,973 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2017-12-25 10:31:57,973 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
2017-12-25 10:31:57,973 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
2017-12-25 10:31:57,973 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=3.10.0-693.11.1.el7.x86_64
2017-12-25 10:31:57,974 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=libing
2017-12-25 10:31:57,974 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/home/libing
2017-12-25 10:31:57,974 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/home/libing
2017-12-25 10:31:57,976 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=bd-2:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@7aec35a
Welcome to ZooKeeper!
2017-12-25 10:31:58,022 [myid:] - INFO  [main-SendThread(bd-2:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server bd-2/192.168.206.133:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2017-12-25 10:31:58,152 [myid:] - INFO  [main-SendThread(bd-2:2181):ClientCnxn$SendThread@876] - Socket connection established to bd-2/192.168.206.133:2181, initiating session
2017-12-25 10:31:58,173 [myid:] - INFO  [main-SendThread(bd-2:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server bd-2/192.168.206.133:2181, sessionid = 0x2608b7c91640001, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: bd-2:2181(CONNECTED) 0] 

查看help帮助信息

[zk: bd-2:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history 
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit 
    getAcl path
    close 
    connect host:port

总结:
三台机器的配置和操作几乎完全一样,区别就在于myid文件内容不一样,bd-1虚拟机的myid文件内容是1,bd-2虚拟机的myid文件内容是2,bd-3虚拟机的myid文件内容是3,其他都完全一样.

其他的运维命令什么的,大家就把ZooKeeper集群服务起来后,照着文档慢慢尝试吧.

结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容