参考:从Paxos到Zookeeper分布式一致性原理与实践(倪超)
1. 安装Java环境
我们采用Docker compose构建集群。为了只安装一次Java环境,我们先在宿主OS上安装Java环境,然后映射到Docker容器中。Java安装的具体做法参照《安装OpenJDK1.8》。
2.下载解压Zookeeper
参照http://zookeeper.apache.org/releases.html
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
$ tar xvf zookeeper-3.4.12.tar.gz
为了避免重复下载安装zookeeper,我们也采用docker映射的方式将已下载并解压的zookeeper映射到容器中。
3. 编写Docker compose脚本
docker-compose.yml文件如下
version: '2'
networks:
thinking:
services:
test_1.thinking.com:
image: ubuntu
ports:
- "3333:3333"
container_name: test_1.thinking.com
command: /bin/bash
tty: true
networks:
- thinking
volumes:
- /etc/java-8-openjdk:/etc/java-8-openjdk
- /usr/lib/jvm/java-8-openjdk-amd64:/usr/lib/jvm/java-8-openjdk-amd64
- /home/yong/Desktop/ZK-test/zookeeper-3.4.12:/home/zookeeper-3.4.12
environment:
- JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
- PATH=${PATH}:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin
test_2.thinking.com:
image: ubuntu
ports:
- "4444:4444"
container_name: test_2.thinking.com
command: /bin/bash
tty: true
networks:
- thinking
volumes:
- /etc/java-8-openjdk:/etc/java-8-openjdk
- /usr/lib/jvm/java-8-openjdk-amd64:/usr/lib/jvm/java-8-openjdk-amd64
- /home/yong/Desktop/ZK-test/zookeeper-3.4.12:/home/zookeeper-3.4.12
environment:
- JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
- PATH=${PATH}:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin
test_3.thinking.com:
image: ubuntu
ports:
- "5555:5555"
container_name: test_3.thinking.com
command: /bin/bash
tty: true
networks:
- thinking
volumes:
- /etc/java-8-openjdk:/etc/java-8-openjdk
- /usr/lib/jvm/java-8-openjdk-amd64:/usr/lib/jvm/java-8-openjdk-amd64
- /home/yong/Desktop/ZK-test/zookeeper-3.4.12:/home/zookeeper-3.4.12
environment:
- JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
- PATH=${PATH}:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin
4.编写Zookeeper配置
由于zookeeper集群中每台机器都需要感知整个集群是由那些机器组成的,所以每台机器的信息都需要配置在配置文件中,而且所有机器的配置文件都必须是相同的。所以,我们用Docker文件映射的方式来实现。
在docker-compose.yml中添加映射
/home/yong/Desktop/ZK-test/zookeeper-3.4.12:/home/zookeeper-3.4.12
然后编辑zookeeper-3.4.12/conf/zoo.cfg文件如:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=test_1.thinking.com:2888:3888
server.2=test_2.thinking.com:2888:3888
server.3=test_3.thinking.com:2888:3888
5.启动集群
先启动Docker集群
$ docker-compose -f docker-compose.yml up -d
然后进入各个docker容器,启动zookeeper
$ docker exec -it test_1.thinking.com /bin/bash
# mkdir -p /tmp/zookeeper
# cd /tmp/zookeeper
# echo 1 > myid
# cd /home/zookeeper-3.4.12/bin/
# sh zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: follower
其他两个zookeeper服务器类似。注意,myid里面只需要将zookeeper服务器的id写入。
如果出现错误如:
# sh zkServer.sh start
zkServer.sh: 81: /home/zookeeper-3.4.12/bin/zkEnv.sh: Syntax error: "(" unexpected (expecting "fi")
解决:
# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 May 26 00:44 /bin/sh -> dash
# ln -sf bash /bin/sh
# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jul 13 06:12 /bin/sh -> bash
验证zookeeper是否成功启动:
# apt-get update
# apt-get install telnetd telnet openbsd-inetd net-tools
# /etc/init.d/openbsd-inetd restart
* Restarting internet superserver inetd [ OK ]
# netstat -a | grep telnet
tcp 0 0 0.0.0.0:telnet 0.0.0.0:* LISTEN
# telnet 127.0.0.1 2181
telnet连上之后,输入start
据说这个方法是可以的,但是我没有试成功。