ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。同时,Kafka也依赖Zookeeper。
概念:
* ZooKeeper 本身就是一个分布式程序(只要半数以上节点存活,ZooKeeper 就能正常服务)。
* 为了保证高可用,最好是以集群形态来部署 ZooKeeper,这样只要集群中大部分机器是可用的(能够容忍一定的机器故障),那么 ZooKeeper 本身仍然是可用的。
* ZooKeeper 将数据保存在内存中,这也就保证了 高吞吐量和低延迟(但是内存限制了能够存储的容量不太大,此限制也是保持 Znode 中存储的数据量较小的进一步原因)。
* ZooKeeper 是高性能的。在“读”多于“写”的应用程序中尤其的高性能,因为“写”会导致所有的服务器间同步状态。(“读”多于“写”是协调服务的典型场景。)
* ZooKeeper 有临时节点的概念。当创建临时节点的客户端会话一直保持活动,瞬时节点就一直存在。而当会话终结时,瞬时节点被删除。持久节点是指一旦这个 ZNode 被创建了,
除非主动进行 ZNode 的移除操作,否则这个 ZNode 将一直保存在 Zookeeper 上。
* ZooKeeper 底层其实只提供了两个功能:①管理(存储、读取)用户程序提交的数据;②为用户程序提交数据节点监听服务。
集群:
* ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器。
Leader负责进行投票的发起和决议,更新系统状态。
* Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,Follower 和 Observer 都只能提供读服务。
* Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略。
因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。
- 安装java环境:
tar zxf jdk-8u191-linux-x64.tar.gz && mv jdk1.8.0_191/ /usr/local/jdk
vim /etc/profile
JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib
export JAVA_HOME PATH CLASSPATH
source !$
java -version
ln -s /usr/local/jdk/bin/java /usr/local/bin/java
- 安装:
mkdir /software && cd /software
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
tar zxf zookeeper-3.4.9.tar.gz
mv zookeeper-3.4.9 /home/zookeeper
cp /home/zookeeper/conf/zoo_sample.cfg /home/zookeeper/conf/zoo.cfg
- 配置:
vim /home/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/zookeeper/data
clientPort=2181
maxClientCnxns=1024
tickTime:Zookeeper中最小时间单元的长度
initLimit:默认值为10,表示是tickTime的10倍。Leader服务器等待Follower启动,并完成数据同步的时间
syncLimit:默认值为5,表示是tickTime的5倍。Leader服务器和Follower之间进行心跳检测的最大延时时间
dataDir:Zookeeper服务器存储快照文件的目录
clientPort:Zookeeper对外的服务端口,集群中无须保持一致
maxClientCnxns:默认是60,从Socket层面限制单个客户端与单台服务器之间的并发连接数
如果是集群,建议奇数台机器集群,每台机器这样配置:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/zookeeper/data
clientPort=2181
maxClientCnxns=1024
server.1=192.168.30.128:2888:3888
server.2=192.168.30.129:2888:3888
server.3=192.168.30.130:2888:3888
- 指明id:
mkdir /home/zookeeper/data
echo 1 > /home/zookeeper/data/myid #集群则分别指明,不同即可
- 启动:
/home/zookeeper/bin/zkServer.sh start
netstat -lntp |grep java
- 停止:
/home/zookeeper/bin/zkServer.sh stop
- 重启:
/home/zookeeper/bin/zkServer.sh restart
- 查看状态:
/home/zookeeper/bin/zkServer.sh status
为了方便管理zookeeper服务,可以做个软链接:
ln -s /home/zookeeper/bin/zkServer.sh /usr/local/bin/zookeeper
- zookeeper命令行:
telnet 127.0.0.1 2181
dump
或
echo dump | nc 127.0.0.1 2181
- dubbo使用:
dubbo.registry.address=zookeeper://192.168.30.128:2181?backup=192.168.30.129:2181,192.168.30.130:2181
或
<dubbo:registry protocol="zookeeper" address="192.168.30.128:2181,192.168.30.129:2181,192.168.30.130:2181" />
- kafka使用:
zookeeper.connect=192.168.30.128:2181,192.168.30.129:2181,192.168.30.130:2181
更多资料参考: