zookeeper环境搭建.md

zookeeper

简介

ZooKeeper是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。

集群角色

  • 领导者(leader),用于负责进行投票的发起和决议,更新系统状态。
  • 学习者(learner),包括跟随者(follower)和观察者(observer)。

其中follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票。
而observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度。

安装

jdk安装

通用二进制包安装:

# tar xf jdk-7u79-linux-x64.tar.gz -C /usr/local/
# ln -sv /usr/local/jdk1.7.0_79 /usr/local/java
"/usr/local/java" -> "/usr/local/jdk1.7.0_79"
# cat /etc/profile.d/java.sh 
export JAVA_HOME=/usr/local/java
export JAVA_CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
# . /etc/profile.d/java.sh
# java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (rhel-2.5.5.4.el6-x86_64 u79-b14)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

yum 安装:

# yum install -y java-1.7.0-openjdk

zookeeper安装

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/

# tar xf zookeeper-3.4.10.tar.gz -C /opt/
# cd /opt/
# chown -R root.root zookeeper-3.4.10/

单实例配置

# cd /opt/zookeeper-3.4.10/conf/
# cp zoo_sample.cfg zoo.cfg
# mkdir /data/zookeeper/log -p
# grep -v '^#' zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
dataLogDir=/data/zookeeper/log
clientPort=2181

配置参数说明

  • tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  • initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。
  • syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
  • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  • dataLogDir:这个操作将管理机器把事务日志写入到“ dataLogDir ”所指定的目录,而不是“ dataDir ”所指定的目录。这将允许使用一个专用的日志设备并且帮助我们避免日志和快照之间的竞争。
  • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

启动

# /opt/zookeeper-3.4.10/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

查看状态

# /opt/zookeeper-3.4.10/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: standalone

连接

# /opt/zookeeper-3.4.10/bin/zkCli.sh -server  localhost:2181
Connecting to localhost:2181
......
[zk: localhost:2181(CONNECTED) 0]

伪集群搭建

配置前请将单实例的zookeeper给关闭。

# grep -v '^#' z1.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/z1/
clientPort=2181
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
# grep -v '^#' z2.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/z2/
clientPort=2182
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
# grep -v '^#' z3.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/z3/
clientPort=2183
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
# mkdir -p /data/zookeeper/z{1,2,3}
  • server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。

# echo 1>/data/zookeeper/z1/myid
# echo 2>/data/zookeeper/z2/myid
# echo 3>/data/zookeeper/z3/myid

启动

# ./zkServer.sh start z1.cfg
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.10/bin/../conf/z1.cfg
Starting zookeeper ... STARTED
# ./zkServer.sh start z2.cfg
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.10/bin/../conf/z2.cfg
Starting zookeeper ... STARTED
# ./zkServer.sh start z3.cfg
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.10/bin/../conf/z3.cfg
Starting zookeeper ... STARTED

状态查看

# ./zkServer.sh status z1.cfg
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.10/bin/../conf/z1.cfg
Mode: follower
# ./zkServer.sh status z2.cfg
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.10/bin/../conf/z2.cfg
Mode: leader
# ./zkServer.sh status z3.cfg
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.10/bin/../conf/z3.cfg
Mode: follower

四字命令

ZooKeeper 支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息。用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令。 ZooKeeper 常用四字命令见下表 :

四字命令 功能描述
conf 输出相关服务配置的详细信息。
cons 列出所有连接到服务器的客户端的完全的连接/会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。
dump 列出未经处理的会话和临时节点。
envi 输出关于服务环境的详细信息(区别于 conf 命令)。
reqs 列出未经处理的请求
ruok 测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应。
stat 输出关于性能和连接的客户端的列表。
wchs 列出服务器 watch 的详细信息。
wchc 通过 session 列出服务器 watch 的详细信息,它的输出是一个与watch 相关的会话的列表。
wchp 通过路径列出服务器 watch 的详细信息。它输出一个与 session相关的路径。

使用举例

# echo conf |nc 192.168.197.61 2181
clientPort=2181
dataDir=/data/zookeeper/z1/version-2
dataLogDir=/data/zookeeper/z1/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=1
initLimit=10
syncLimit=5
electionAlg=3
electionPort=2223
quorumPort=2222
peerType=0

命令行操作

[zk: 192.168.197.61:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 192.168.197.61:2181(CONNECTED) 1] create /zk myDate
Created /zk
[zk: 192.168.197.61:2181(CONNECTED) 2] ls /
[zk, zookeeper]
[zk: 192.168.197.61:2181(CONNECTED) 3] get /zk
myDate
cZxid = 0x300000002
ctime = Thu May 18 18:36:41 CST 2017
mZxid = 0x300000002
mtime = Thu May 18 18:36:41 CST 2017
pZxid = 0x300000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: 192.168.197.61:2181(CONNECTED) 4] set /zk yourDate
cZxid = 0x300000002
ctime = Thu May 18 18:36:41 CST 2017
mZxid = 0x300000003
mtime = Thu May 18 18:37:10 CST 2017
pZxid = 0x300000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
[zk: 192.168.197.61:2181(CONNECTED) 5] get /zk         
yourDate
cZxid = 0x300000002
ctime = Thu May 18 18:36:41 CST 2017
mZxid = 0x300000003
mtime = Thu May 18 18:37:10 CST 2017
pZxid = 0x300000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
[zk: 192.168.197.61:2181(CONNECTED) 6] delete /zk
[zk: 192.168.197.61:2181(CONNECTED) 7] ls /
[zookeeper]
原文地址:https://www.cnblogs.com/cuchadanfan/p/6874953.html