《Zookeeper系列二》-Zookeeper环境搭建

Zookeeper环境一共有三种搭建形式:单机模式、伪分布式模式、分布式模式。Zookeeper是通过复制(各个服务里存储的数据都是相同的,相当于多个备份)实现其高可用、高稳定性的,只要集群中超过半数以上(这里建议集群中机器的个数为奇数,因为奇数更容易分区半数以上)的机器处于可用状态,其就可以保证服务可用。Zookeeper中的更新操作都必须保证在半数以上的机器中进行了更新,该更新操作才算是成功。

Zookeeper压缩包下载

  • 手动下载

可以去Zookeeper的官方网站下载稳定版本http://www.apache.org/dyn/closer.cgi/zookeeper/
任意点击一个镜像链接下载,选择下载的版本下载即可,本文下载的是zookeeper-3.4.9版本
下载完成后,将压缩包上传至linux服务器

  • 命令下载
 wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz

目录结构

对压缩包解压,解压完成后删除压缩包

tar -zxvf zookeeper-3.4.9.tar.gz 
rm zookeeper-3.4.9.tar.gz 

简单看几个目录即可:

  • bin
    该目录下存放着zk服务端和客户端相关的命令,服务的启动和停止就是使用该目录下的脚本
  • conf
    配置文件目录,zk服务启动时会读取配置文件,服务的配置信息可以通过配置文件进行修改,其中zoo_sample.cfg是一个配置的模板,可以根据改文件创建配置文件进行配置
  • src
    zk源码,包含c和java两种语言的实现
    -lib
    依赖的jar文件

单机模式

以下所有的操作都是在zookeeper-3.4.9目录下进行
直接使用命令启动zk服务

bin/zkServer.sh start

会发现服务启动失败,看日志会发现提示找不到配置文件,默认读取的是conf/zoo.cfg文件,进入conf目录,发现改文件不存在。
因此,在启动服务之前我们应该先创建配置文件

cd conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg 
  • 介绍一下默认配置文件中的各个参数的含义
  1. tickTime:zk中最小的时间单位,其initLimit和syncLimit等都是以该时间为单位的倍数,每隔tickTime,服务器之间以及服务器与客户端之间进行心跳检查,探测服务是否正常
  2. initLimit:follower(非Leader)链接并同步Leader的初始化连接时间,值为tickTime的倍数,超过该值表示连接失败,单机模式下不用配置该参数
  3. syncLimit:Leader与follower同步信息的时间,包括请求和应答,超过改时间,follower会被认为死掉被丢弃,单机模式下不用配置该参数
  4. dataDir:内存数据库快照存储位置,最好单独一个物理盘,其性能会影响到zk服务的性能
  5. clientPort:默认2181,可以自己修改
  6. maxClientCnxns 客户端的最大连接数量,并限制并发连接数量,通过Ip区分不同的客户端可以阻止某些类别的Dos攻击。设置为0或者不配置表示不限制

除此之外,我们还应该添加一个参数
dataLogDir:存放事务日志,如果不配置,会默认写到dataDir下
修改后的配置文件如下:

tickTime=2000
dataDir=/tmp/zkdata
dataLogDir=/tmp/zkLog
clientPort=2181

执行启动命令,启动zk服务

bin/zkServer.sh start

发现服务可以正常启动,可以通过如下命令检测服务是否启动

#查看zk进程
ps aux | grep zookeeper
#使用zk命令查看, 会发现Mode: standalone,表明单机模式
bin/zkServer.sh  status

关闭zk服务,使用如下命令

bin/zkServer.sh stop

伪分布式模式

  • 与单机模式的不同
  1. zk服务启动不能使用默认的配置文件,需要指定配置文件执行,一个配置文件对应一个服务
  2. 由于同一台机器上一个端口只能被一个服务使用,所以多个服务需要使用不同的端口号
  3. 日志目录dataDir与dataLogDir,不同的服务日志存放到不同的位置,防止冲突和混乱
  4. 需要在dataDir对应的目录中新建myid文件,指定该服务在集群中对应的实例

我们配置3台服务,分布式集群至少需要三台服务,配置信息如下:

  1. 配置文件分别为zoo1.cfg zoo2.cfg zoo3.cfg
  2. 端口分别为 2182 2183 2184
  3. 针对每一个服务的日志,新建一个/tmp/zk1 /tmp/zk2 /tmp/zk3(不建议放在该目录下,自己决定)
  4. 对应的目录下新建myid文件,内容分别为0, 1, 2

下面值贴出一个服务的配置文件的内容和myid文件的内容,剩余两个服务自行完善

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zk1/zkData
dataLogDir=/tmp/zk1/zkLog
clientPort=2182

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

先解释一下server.x=A:B:C的含义:

  1. x:代表每个服务实例对用的dataDir下myid的内容
  2. A:对用服务所在机器的IP地址
  3. B: leader选举端口(伪分布式环境下所有的端口都不要相同)
  4. C: zk服务器之间通信的端口,服务器之间同步信息

启动三台服务:

bin/zkServer.sh start conf/zoo1.cfg 
bin/zkServer.sh start conf/zoo2.cfg  
bin/zkServer.sh start conf/zoo3.cfg  

查看服务状态:

#Mode: follower
bin/zkServer.sh status conf/zoo1.cfg 
#Mode: leader
bin/zkServer.sh status conf/zoo2.cfg 
#Mode: follower
bin/zkServer.sh status conf/zoo3.cfg   

从日志中可以看出,第二台机器被选为主节点leader,第一台和第三天为follower节点
注意:伪分布式集群和单机模式是可以并存的,因为集群模式是通过配置文件中的server.x识别集群中的机器,如果没有改配置,不会被识别为集群中的一个机器

分布式模式

与伪分布式模式的不同:
由于服务部署在不同的机器上,因此服务端口不会冲突,所有涉及到端口的地方都可以使用相同的端口,日志目的也可以相同。myid文件还是要进行区分。其他的没有任何区别。
配置文件中不要使用相对路径

欢迎扫描下方二维码,关注公众号,我们可以进行技术交流,共同成长

《《Zookeeper系列二》-Zookeeper环境搭建》 qrcode_for_gh_5580beb3cba1_430.jpg

    原文作者:逍遥无极
    原文地址: https://www.jianshu.com/p/67dde02ee95b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞