for {
select {
case isMaster = <-isMasterChan:
if isMaster {
// do some job on master
fmt.Println("do some job on master")
}
}
}
}
其中,main函数的ip改写成上面查到的虚拟机ip。
在Xshell5中输入:
ls /
我们可以看到目前根目录下只有一个zookeeper。
要使用golang程序成功调用zookeeper,还需要关掉我们CentOS系统下的防火墙。
在Xshell5中输入:
systemctl | grep fire
可以看到防火墙正在运行。
我们先停止防火墙:
stop firewalld
然后禁用防火墙:
disable firewalld
保存修改:
iptables-save
成功关掉防火墙之后,运行上述go程序,我们可以看到第一个进程成功成为了leader:
GOROOT=C:\Go
GOPATH=D:/golang
C:\Go\bin\go.exe build -i -o C:\Users\renjiashuo\AppData\Local\Temp\Build_main_go_and_rungo D:/golang/src/leader/main.go
"C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.5\bin\runnerw.exe" C:\Users\renjiashuo\AppData\Local\Temp\Build_main_go_and_rungo
connect to zookeeper server success!
2017/07/27 21:02:38 Connected to 192.168.40.129:2181
2017/07/27 21:02:38 Authenticated: id=72057981844586499, timeout=4000
2017/07/27 21:02:38 Re-submitting `0` credentials after reconnect
elect master success!
do some job on master
watch children result, [] &{9 9 1501160558009 1501160558009 0 0 0 72057981844586499 0 0 9}
不要关闭这个程序,再执行一个此go程序,我们可以看到,因为有第一个进程已经成为了leader,第二个进程只能等待:
GOROOT=C:\Go
GOPATH=D:/golang
C:\Go\bin\go.exe build -i -o C:\Users\renjiashuo\AppData\Local\Temp\Build_main_go_and_run1go D:/golang/src/leader/main.go
"C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.5\bin\runnerw.exe" C:\Users\renjiashuo\AppData\Local\Temp\Build_main_go_and_run1go
connect to zookeeper server success!
2017/07/27 21:05:29 Connected to 192.168.40.129:2181
2017/07/27 21:05:29 Authenticated: id=72057981844586500, timeout=4000
2017/07/27 21:05:29 Re-submitting `0` credentials after reconnect
elect master failure, %!(EXTRA *errors.errorString=zk: node already exists)watch children result, [] &{9 9 1501160558009 1501160558009 0 0 0 72057981844586499 0 0 9}
此时我们关闭第一个进程,可以看到第二个进程的变化:
GOROOT=C:\Go
GOPATH=D:/golang
C:\Go\bin\go.exe build -i -o C:\Users\renjiashuo\AppData\Local\Temp\Build_main_go_and_run1go D:/golang/src/leader/main.go
"C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.5\bin\runnerw.exe" C:\Users\renjiashuo\AppData\Local\Temp\Build_main_go_and_run1go
connect to zookeeper server success!
2017/07/27 21:05:29 Connected to 192.168.40.129:2181
2017/07/27 21:05:29 Authenticated: id=72057981844586500, timeout=4000
2017/07/27 21:05:29 Re-submitting `0` credentials after reconnect
elect master failure, %!(EXTRA *errors.errorString=zk: node already exists)watch children result, [] &{9 9 1501160558009 1501160558009 0 0 0 72057981844586499 0 0 9}
receive znode delete event, {EventNodeDeleted Unknown /ElectMasterDemo/master <nil> }
start elect new master ...
connect to zookeeper server success!
2017/07/27 21:06:28 Connected to 192.168.40.129:2181
2017/07/27 21:06:28 Authenticated: id=72057981844586501, timeout=4000
2017/07/27 21:06:28 Re-submitting `0` credentials after reconnect
elect master success!
do some job on master
watch children result, [] &{14 14 1501160787685 1501160787685 0 0 0 72057981844586501 0 0 14}
第二个进程成功成为了leader。
程序代码的注释比较详细,这里不做详解,所有调用的api接口都可以进入查看其go源码。
自此,CentOS环境安装zookeeper服务并用golang实现分布式系统的Leader选举实现完毕。