zookeeper有两种运行模式:独立模式和仲裁模式。独立模式就是只运行一个Zookeeper Server,这自然没法解决服务崩溃导致系统不可用的问题。仲裁模式就是以集群的方式运行Zookeeper Server,这样在Leader不可用时,集群内部会发起选举,而推选一个新的Leader。既然我们要使用zookeeper,肯定是有分布式协作需求,所以本文只讲述仲裁模式的部署。(转载请指明出于breaksoftware的csdn博客)

为了方便大家测试,我们将Zookeeper Server部署在同一台机器上,通过对外提供不同的端口号来模拟多机部署。

首选我们要选择部署几个Server服务(不考虑Observer)。2个?3个?4个?如果一定要在三个数字中选,大部分建议是选择3个。

如果选择2,那么依据少数服从多数的原则,要求Leader的必须获得2票。如果坏了一台机器,剩下的那台机器肯定得不到2票,那么整个系统将不可用。于是损失一台机器的系统可用率是0。

如果选择是3,要求Leader的票数也必须>=2。如果坏了一台机器,剩下的两台机器可以抉择出哪台可以得到2票,从而系统可用。如果又坏了一台,剩下一台机器不可能得到2票。于是损失一台机器的系统可用率是100%,损失两台机器的系统可用率是0。

如果选择4,要求Leader的票数>=3。如果坏了一台机器,剩下的三台机器可以抉择出哪台可以得到3票,从而系统可用。如果又坏了一台,剩下的两台机器不可能得到3票。于是损失一台机器的系统可用率是100%,损失两台机器的系统可用率是0。

集群机器数 损失1台机器系统可用率 损失2台机器系统可用率
2 0 0
3 100% 0
4 100% 0

可以看出来在损失2台机器的情况下,集群部署3台或者4台的系统可用率是相等的。部署4台并不比部署3台要可靠。

也许有人开始质疑“少数服从多数”这个选举原则。如果4台机器只要有机器获得2票,就可以被认为是Leader,那不就提高了可用率了么?答案是这样的设计会导致严重的问题。

如下图,ABCD构成了一个集群,其中A是Leader。开始时甲连接的是A机器,ABCD各机器上服务保持了数据一致性。假如此时乙用户要连接任何一台服务,那么甲乙对数据的修改是彼此透明的。

但是,如果此时CD和AB断开了连接。以获得2票成为Leader的原则,很有可能CD选举出C为Leader,D从此和C同步数据。AB选举出A为Leader,B只和A同步数据。假如此时乙用户要接入,而不巧接入到C或者D。那么甲乙对数据的修改就是隔离的。这样一个系统中出现两个Leader的现象称之为“脑裂”,这当然是不能接受的。

选择好数量后,我们从https://www.apache.org/dyn/closer.cgi/zookeeper/下载并解压压缩包。以我环境为例,解压后文件路径为

$ pwd
/home/work/fangliang/zookeeper-3.4.11

进入该目录,新建一个叫multi_server的文件夹。然后在其下新建z1、z2和z3三个目录,这三个目录分别用于保存三个Zookeeper Server的信息。

mkdir multi_server
cd multi_server
mkdir -p z1/data
mkdir -p z2/data
mkdir -p z3/data
echo 1 >  z1/data/myid
echo 2 >  z2/data/myid
echo 3 >  z3/data/myid

myid文件的内容是其对应的服务id。

然后在z1、z2和z3下分别创建z1.cfg,z2.cfg,z3.cfg三个文件。以z1.cfg为例,我们在文件中填充

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/work/fangliang/zookeeper-3.4.11/multi_server/z1/data
clientPort=2181
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445

相应的,我们需要将z2.cfg和z3.cfg文件中dataDir指向自己目录,clientPort指向其他的端口

dataDir=/home/work/fangliang/zookeeper-3.4.11/multi_server/z2/data
clientPort=2182
dataDir=/home/work/fangliang/zookeeper-3.4.11/multi_server/z3/data
clientPort=2183

整个文件的目录树如下

multi_server/
|-- z1
|   |-- data
|   |   |-- myid
|   |-- z1.cfg
|-- z2
|   |-- data
|   |   |-- myid|
|   |-- z2.cfg
`-- z3|-- data|   |-- myid`-- z3.cfg

接下来我们开始启动各个服务。

首先启动z1。

且到z1目录下,执行

../../bin/zkServer.sh start ./z1.cfg 

当前目录下会生成一个日志文件zookeeper.out。

第三行我们看到它发起了一次选举,但是由于其他两个服务没有启动,所以整个系统还不可用。

然后我们启动z2。

切到z2目录下,执行

../../bin/zkServer.sh start ./z2.cfg

我们查看下z2目录下日志文件

第三行显示z2也发起了一次选举,由于此时z3没有启动,所以它只能和z1进行通信。最终它们使用FastLeaderElection协商出z2作为Leader。

然后z2和z1进行了数据同步。

我们再看下z1日志的变化。

z1仍然和z3通信失败。但是和z2通信后,自己成为了follower。

最后我们启动z3。

切到z3目录下执行

../../bin/zkServer.sh start ./z3.cfg

查看z3的日志

z3发起了一次选举,但是z2此时已经是leader了,所以z3顺理成章的成为follower,并从z2服务同步了一份数据快照

此时看下z1的日志,它发现了z3

再看下z2的日志,它发现z3后,给z3同步了一次数据

我们切换到bin目录,执行

./zkCli.sh  -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

让Client连接到上述三台机器中的一台,可以看到如下显示

zookeeper快速入门——部署相关推荐

  1. zookeeper快速入门——应用(两种分布式锁)

    在<zookeeper快速入门--简介>一文中,我们介绍了zookeeper的机制.但是还是比较抽象,没有直观感受到它在分布式系统中的应用.本文我们使用一个例子,三次迭代演进,来说明Zoo ...

  2. python 操作 zookeeper 快速入门

    python 操作 zookeeper 快速入门 文章目录 python 操作 zookeeper 快速入门 什么是zookeeper python 操作 zk 快速入门 zk节点 创建节点 查询节点 ...

  3. Windows Server 2016快速入门部署远程桌面服务

    打开服务器管理器,然后单击管理 -> 添加角色和功能 在" 开始之前"页面上的向导中,单击"下一步". 在" 选择安装类型"页面上,选 ...

  4. zookeeper快速入门——简介

    在几十年前,一个独立的计算机上往往部署着一套完整的应用系统.当时因为网络稳定性及速度的限制,将相关联的服务部署在一台机器上,让它们使用系统机制通信--比如管道,文件等,往往是最稳定和最高效的.然而随着 ...

  5. 【一篇入魂】redis快速入门—部署、数据类型、持久化、事务、集群

    Redis简介 简单介绍 Redis:开源.免费.非关系型数据库.K-V数据库.内存数据库,支持持久化.事务和备份,集群(支持16个库)等高可用功能.并且性能极高(可以达到100000+的QPS),易 ...

  6. zookeeper快速入门,配置虚拟机ip、mac、虚拟机免密,jdk的安装与卸载

    zookeeper里的每一个节点叫znode,他们既是目录的功能也有自己的文本信息. 下面进行的集群配置并没有实现高可用效果(内存空间有限) 此次搭建要准备三台虚拟机,准备必备jar包. 虚拟机 ip ...

  7. ZooKeeper快速入门

    1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务. 名字服务.分布式同步.组服务等. 它有如下的一些特点: 简单 Zookeeper的 ...

  8. 1分钟 Zookeeper 快速入门_windows环境

    下载zookeeper 官网链接:https://zookeeper.apache.org/ 修改conf/zoo.cfg 文件名

  9. 软件架构-zookeeper快速入门

    上次在配置zookeeper分布式的时候,有个很重要的文件zoo.cfg,里面重点配置了几个信息clientPort,server.1的端口号.实际用到了2个端口号2181,2888,还有个2888这 ...

最新文章

  1. IIC总线的时钟同步和总线仲裁
  2. Angularjs 中select回显后重复选项的解决
  3. python两个list合并成字典_Python将两个list合并为一个字典
  4. Intel 平台编程总结----缓存的优化
  5. 速卖通店铺流量少的原因分析以及解决办法
  6. android ImageView 之 android:scaleTye=
  7. Transformer and set Trasformer
  8. centos7 安装java和tomcat9
  9. Android 系统(197)---USB VID
  10. 优化篇-“移动端”图片上传架构的变迁
  11. windows加域后的问题
  12. 动力系统 —— 液压与气压
  13. WI-FI密码破解-奶瓶
  14. MySQL:JDBC基础及连接数据库的方式
  15. 201671010406 词频统计软件项目报告
  16. cron每小时执行一次_crontab每小时运行一次
  17. cpu天梯图2022年11月 cpu排行榜天梯图2022
  18. 【Python】Windows微信清理工具
  19. mermaid与flowchart.js绘制流程图分支结构试验
  20. 掌门人共话根技术 | 麒麟信安高级副总裁陈松政参加2022长沙·中国1024程序员节“岳麓对话”

热门文章

  1. 一文看懂docker容器技术架构及其中的各个模块
  2. Excel 计算除法并显示为万分之几,如0.15‱
  3. ROS系统——重要参考资料
  4. 一、网页端文件流的传输
  5. blender动画全面学习教程
  6. LTE PUCCH Format1
  7. Python爬虫2-GET_POST与开发者工具
  8. 性能定位常用命令整理
  9. 使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容
  10. laravel5.8的使用