一、安装环境
1.1、系统环境
zk对不同系统环境支持都很好,在绝大多数主流的操作系统上都能够正常运行,如:GNU/linux、Sun Solaris、Win32以及MacOSX等。需要注意的是,Zookeeper官方文档中特别强调,由于FreeBSD系统的JVM对Java的NIO Selector支持得不是很好,所以不建议在该系统上部署生产环境的Zookeeper服务器。由于当前只是演示,所以2种安装方式都在Win上面进行。
1.2、Java环境
Java1.6或以上版本(建议下载Oracle官方发布的Java,下载地址是:http://www.java.com/download/)。我用的是jdk1.8。
二、集群模式(伪)
现在,我们开始使用三台机器来搭建一个Zookeeper集群。由于没有多余的服务器,这里就将三个Zk都安装到本地机器上,故称谓伪集群模式更合适,伪集群模式只是便于开发、普通测试,不能用于生产环境。
2.1、下载Zookeeper安装包
建议去官方网站上下载稳定版本,地址:http://zookeeper.apache.org/releases.html,这里我用到的是3.4.9
2.2、配置文件zoo.cfg
将解压后的Zk复制三份到工作目录并重命名为zk2281,zk2282,zk2283,在创建三个文件夹zk2281data,zk2282data,zk2283data,如:
三份zookeeper的目录都在E:\learning\dubbo\zookeeperCloud/ 下,然后需要将E:\learning\dubbo\zookeeperCloud{zk2281,zk2282,zk2283}\conf目录下的zoo_sample.cfg文件重命名为zoo.cfg,并且按照下面的方式简单配置:
zk2281的zoo.cfg配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=E:\learning\dubbo\zookeeperCloud\zk2281data
clientPort=2281
#2881是zk的通信端口
#3881是zk的投票选举端口
server.1=192.168.2.100:2881:3881
server.2=192.168.2.100:2882:3882
server.3=192.168.2.100:2883:3883
zk2282的zoo.cfg配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=E:\learning\dubbo\zookeeperCloud\zk2282data
clientPort=2282
#2881是zk的通信端口
#3881是zk的投票选举端口
server.1=192.168.2.100:2881:3881
server.2=192.168.2.100:2882:3882
server.3=192.168.2.100:2883:3883
zk2283的zoo.cfg配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=E:\learning\dubbo\zookeeperCloud\zk2283data
clientPort=2283
#2881是zk的通信端口
#3881是zk的投票选举端口
server.1=192.168.2.100:2881:3881
server.2=192.168.2.100:2882:3882
server.3=192.168.2.100:2883:3883
关于zoo.cfg的配置,这里简单说明下:
在集群模式下,集群中每台机器都需要感知到整个集群是由哪几台机器组成的,在配置文件中,可以按照这样的格式进行配置,每一行都代表一个机器配置:server.id=host:port:port,其中,id被称为Server ID,用来标识该机器在集群中的机器序列号。同时,在每台Zookeeper机器上,我们都需要在数据目录(即dataDir参数指定的那个目录)下创建一个myid文件,该文件只有一行内容,并且是一个数字,即对应于每台机器的Server ID 数字。
上面也提到了,myid文件中只有一个数字,即一个Server
ID。例如,server.1的myid文件内容就是”1”。注意,清确保每个服务器的myid文件中的数字不同,并且和自己所在机器的zoo.cfg中server.id=houst:port:port的id一致。另外,id的范围是1~255。参数的意义:
tickTime:默认值为3000,单位是毫秒(ms),可以不配置。参数tickTime用于配置Zookeeper中最小时间单元的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示的。例如,Zk中会话的最小超时时间默认是2*tickTime。
dataDir:该参数无默认值,必须配置。参数dataDir用于配置Zookeeper服务器存储快照文件的目录。
clientPort:参数clientPort用于配置当前服务器对外的服务端口,客户端会通过该端口和Zk服务器创建连接,一般设置为2181。
initLimit:该参数默认值:10,表示是参数tickTime值的10倍,必须配置,且为正整数。该参数用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器在启动过程中,会与Leader建立连接并完成对数据的同步,从而确定自己对外提高服务的起始状态。leader服务器允许Follower在initLimit时间内完成这个工作。
syncLimit:该参数默认值:5,表示是参数tickTime值的5倍,必须配置,且为正整数。该参数用于配置Leader服务器和Follower之间进行心跳检测的最大延时时间。在Zk集群运行的过程中,Leader服务器会与所有的Follower进行心跳检测来确定该服务器是否存活。如果Leader服务器在syncLimit时间内无法获取到Follower的心跳检测响应,那么Leader就会认为该Follower已经脱离了和自己的同步。
server.id:该参数无默认值,在单机模式下可以不配置。该参数用于配置组成Zk集群的机器列表,其中id即为Server ID,与每台服务器myid文件中的数字相对应。同时,在该参数中,会配置两个端口:第一个端口用于指定Follower服务器与Leader进行运行时通信和数据同步时所使用的端口,第二个端口测专门用于进行Leader选举过程中的投票通信。
2.3、创建myid文件
在dataDir所配置的目录下,创建一个名为myid的文件,在该文件的第一行写上一个数字,和zoo.cfg中当前机器的编号对应上。即:
在E:\learning\dubbo\zookeeperCloud\zk2281data\文件夹下创建值为"1"的myid文件。
在E:\learning\dubbo\zookeeperCloud\zk2281data\文件夹下创建值为"2"的myid文件。
在E:\learning\dubbo\zookeeperCloud\zk2281data\文件夹下创建值为"3"的myid文件。
下图是zk2281data文件夹下myid文件和其内容,zk2282data,zk2283data只是文件里的值不一样。
三、创建启动zk集群脚本
我呢比较懒,就把几个启动命令和到一个命令里了。创建一个start-all-zookeeper.bat文件,里面的内容如下:
@echo off
rem 运行zk3
start E:\learning\dubbo\zookeeperCloud\zk2881\bin\zkServer.cmd & start E:\learning\dubbo\zookeeperCloud\zk2882\bin\zkServer.cmd & start E:\learning\dubbo\zookeeperCloud\zk2883\bin\zkServer.cmd
四、验证集群是否成功
双击我们的start-all-zookeeper.bat 文件 ,如下图所示
通过控制台我们发现zk2283是leader,zk2281 和zk2282是follewer 。
此时发们把zk2283停掉,看有什么变化。
此时发们发现,zk2282变成了leader,zk2281还是follewer。说明进行的重新的选主。集群配置成功!