我们物理部署三台zookeeper,因为是本地启动,所以需要三份配置文件。
配置文件都是类似的。
开放2181端口服务器的配置
tickTime=2000
dataDir=/Users/olifer/middle/zk/1/data
dataLogDir=/Users/olifer/middle/zk/1/datalog
clientPort=2181
initLimit=5
syncLimit=2
server.1=127.0.0.1:10001:20001
server.2=127.0.0.1:10002:20002
server.3=127.0.0.1:10003:20003
开放2182端口服务器的配置
tickTime=2000
dataDir=/Users/olifer/middle/zk/2/data
dataLogDir=/Users/olifer/middle/zk/2/datalog
clientPort=2182
initLimit=5
syncLimit=2
server.1=127.0.0.1:10001:20001
server.2=127.0.0.1:10002:20002
server.3=127.0.0.1:10003:20003
开放2183端口服务器的配置
tickTime=2000
dataDir=/Users/olifer/middle/zk/3/data
dataLogDir=/Users/olifer/middle/zk/3/datalog
clientPort=2183
initLimit=5
syncLimit=2
server.1=127.0.0.1:10001:20001
server.2=127.0.0.1:10002:20002
server.3=127.0.0.1:10003:20003
我们会发现,这三份配置文件,不同点端口不同和存放数据的文件夹以及存放log的文件夹不同。但是我们发现这三份配置文件有一个相同的配置
server.1=127.0.0.1:10001:20001
server.2=127.0.0.1:10002:20002
server.3=127.0.0.1:10003:20003
server 1,2,3组成一个集群,但是我们知道server 1,server 2,server 3?通过创建在dataDir里添加myid文件,里面的内容就是server的标示1或2或3,这样就给server增加了物理的标识,所以在配置文件中,server.1就知道是在集群中的哪台机器。server.NUM=IP:port1:port2 ,NUM表示本机为第几号服务器,IP 为 这个server的ip地址,port1为leader与follower通信端口,port2为参与竞选leader的通信端口。
配置文件解释完毕,我们就开始启动了。
zkServer start /Users/olifer/middle/zk/1/zoo.conf
zkServer start /Users/olifer/middle/zk/2/zoo.conf
zkServer start /Users/olifer/middle/zk/3/zoo.conf
每台启动时如果开到下面的日志,说明配置成功了
JMX enabled by default
Using config: /Users/olifer/middle/zk/3/zoo.conf
Starting zookeeper ... STARTED
我们看一下每台zk的角色
zkServer status /Users/olifer/middle/zk/1/zoo.conf
JMX enabled by default
Using config: /Users/olifer/middle/zk/1/zoo.conf
Mode: follower
zkServer status /Users/olifer/middle/zk/2/zoo.conf
JMX enabled by default
Using config: /Users/olifer/middle/zk/2/zoo.conf
Mode: leader
zkServer status /Users/olifer/middle/zk/3/zoo.conf
JMX enabled by default
Using config: /Users/olifer/middle/zk/3/zoo.conf
Mode: follower
我们可以看到server_id=2的zk是leader,其他的都是follower。我们连接上2182(leader)的机器
zkCli -server 127.0.0.1:2182
Connecting to 127.0.0.1:2182
Welcome to ZooKeeper!
JLine support is enabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2182(CONNECTED) 0]
在此机器上创建一个永久节点
[zk: 127.0.0.1:2182(CONNECTED) 1] create /linyang olifer
Created /linyang
[zk: 127.0.0.1:2182(CONNECTED) 2] ls /linyang
[]
[zk: 127.0.0.1:2182(CONNECTED) 3] get /linyang
olifer
cZxid = 0x300000002
ctime = Tue Dec 05 09:26:49 CST 2017
mZxid = 0x300000002
mtime = Tue Dec 05 09:26:49 CST 2017
pZxid = 0x300000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: 127.0.0.1:2182(CONNECTED) 4]
ls 查看路径下的节点,create 创建节点并且指明节点存储的内容,get 获取节点存储的内容等。在leader上进行了存储的操作,我们可以看一下,在follower上的反应,连接上2181的机器
zkCli -server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
Welcome to ZooKeeper!
JLine support is enabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTED) 0] ls /
[zookeeper, linyang]
[zk: 127.0.0.1:2181(CONNECTED) 1] ls /linyang
[]
[zk: 127.0.0.1:2181(CONNECTED) 2] get /linyang
olifer
cZxid = 0x300000002
ctime = Tue Dec 05 09:26:49 CST 2017
mZxid = 0x300000002
mtime = Tue Dec 05 09:26:49 CST 2017
pZxid = 0x300000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 3]
可以看到数据已经同步过来了。我们尝试在follower上进行写操作,看看结果怎么样
[zk: 127.0.0.1:2181(CONNECTED) 4] create /follower test
Created /follower
[zk: 127.0.0.1:2181(CONNECTED) 5] get /follower
test
cZxid = 0x300000004
ctime = Tue Dec 05 09:32:56 CST 2017
mZxid = 0x300000004
mtime = Tue Dec 05 09:32:56 CST 2017
pZxid = 0x300000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 6]
也是可以创建成功的,这一点和redis不同,redis默认的是从节点是只读的操作。follower进行的修改,leader可以看到吗?试一下
[zk: 127.0.0.1:2182(CONNECTED) 4] get /follower
test
cZxid = 0x300000004
ctime = Tue Dec 05 09:32:56 CST 2017
mZxid = 0x300000004
mtime = Tue Dec 05 09:32:56 CST 2017
pZxid = 0x300000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: 127.0.0.1:2182(CONNECTED) 5]
答案是可以的。zk的数据复制模式就讲到这里。