当前位置: 首页 > 编程日记 > 正文

zookeeper快速入门——部署

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台机器系统可用率
200
3100%0
4100%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连接到上述三台机器中的一台,可以看到如下显示


相关文章:

2020,人工智能和深度学习未来的五大趋势

来源 | forbes编译 | Shawn编辑 | Carol出品 | AI科技大本营(ID:rgznai100)虽然近年来人工智能经常成为热门议题,但它还远未实现真正的成就。人工智能技术发展的主要障碍在于投资成本,投资成本影响短期内的回报。而当时…

电脑常见故障 1

死机恐怕是所有电脑故障里面最常见的一种了,但是死机的原因是多种多样的。 如果从硬件入手,先是看看机箱里的温度是否很高,要检查CPU的风扇是否正常运转,并要注意电脑的散热问题;其次可检查内存,检查完内存…

linux常用命令-date-clock-hwclock-type-whois--help-man-info-cal

date:时间管理电子表:晶体震荡器 石英震荡器Linux:rtc 硬件时间NTP:网络时间协义硬件时间(命令:clock)系统时间(命令:date)type COMMAND 判断命令是内部命令…

内存、性能问题分析的利器——valgraind

valgrind是一个知名的分析软件集。我们可以使用它进行内存、多线程及性能等各种问题的分析。它采用非侵入方式,所谓非侵入方式是指:我们不用在代码中插入分析工具的库。这对于开发者来说是友好的。因为如果要将工具编译到文件中,或者要调用其…

这是我见过最卡通的 Python 算法了,通俗易懂

普通程序员,不学算法,也可以成为大神吗?对不起,这个,绝对不可以。可是算法好难啊~~看两页书就想睡觉……所以就不学了吗?就一直当普通程序员吗?如果有一本算法书,看着很轻松……又有…

WebService(Axis2)视频教程与QQ交流群发布

Axis2是目前比较流行的WebService引擎。WebService被应用在很多不同的场景。例如,可以使用WebService来发布服务端 Java类的方法,以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。WebService还经常被使用在SOA中&#x…

fragment类onresume里面刷新操作处理

今天项目中涉及fragment中嵌套多个fragment,但是要根据tag去展示对应的fragment,而不是默认展示的第一个fragment,如果使用activity很容易想到onpause(),onResume()中进行处理,但是你会发现fragment的onpause和onresume只调用一次…

内存问题分析的利器——valgrind的memcheck

在《内存、性能问题分析的利器——valgrind》一文中我们简单介绍了下valgrind工具集,本文将使用memcheck工具分析各种内存问题。(转载请指明出于breaksoftware的csdn博客) 本文所有的代码都是使用g -O0 -g mem_error.c -o mem_erro编译&#…

类项目中的配置文件app.config在打包安装后的信息获取的问题

在一个项目中碰到这样的一个问题,做一个WORD插件,功能在类库项目中实现了,配置信息存在类库项目的配置文件app.config中,在进行打包后,获取的配置文件中的DocType节点信息时,使用以下方法 ConfigurationMa…

AAAI 2020论文解读:商汤科技提出新弱监督目标检测框架

来源 | Object Instance Mining for WeaklySupervised Object Detection编辑 | Carol出品 | AI科技大本营(ID:rgznai100)商汤科技视频大数据团队发表论文《Object Instance Mining forWeakly Supervised Object Detection》,该论文…

20135306黄韧 信息安全系统设计基础期中学习总结

信息安全系统设计基础第八周学习总结 知识点总结 第1章 计算机系统漫游 △计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位.它们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式&…

使用SQL Server维护计划实现数据库定时自动备份

在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库。而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员每天守到晚上1点去备份数据库。要实现数据库的定时自动备份,最常用的方式就是使用SQL S…

AI 医疗公司“战疫”在前线

作者 | Just来源 | CSDN(CSDNnews)紧急驰援疫区,涉足AI医疗领域的公司也出动了。截止到2月6日,随着新冠病毒肺炎疫情的不断发展,全国累计已有31161例确诊病例,26359例疑似病例。不过,由于医疗资…

动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind

在《内存、性能问题分析的利器——valgrind》一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析。(转载请指明出于breaksoftware的csdn博客) 之前的《利器》系列中,我们介绍了两种…

CentOS6.3编译安装Nginx1.4.7 + MySQL5.5.25a + PHP5.3.28

2019独角兽企业重金招聘Python工程师标准>>> 【准备工作】 01 #在编译安装lnmp之前,首先先卸载已存在的rpm包。 02 rpm -e httpd 03 rpm -e mysql 04 rpm -e php 05 06 yum -y remove httpd 07 yum -y remove mysql-server mysql 08 yum -y remove php 0…

GitHub标星14000+,阿里开源的SEATA如何应用到极致?

作者简介:袁鸣凯,家乐福技术总监, 高知特有限技术公司中国区架构师,HP上海研发技术专家,夸客金融首席架构师,现任家乐福中国区技术总监。多年互联网、企业级SOA、微服务、全渠道中台方面的架构设计实战经验…

C++拾趣——有趣的操作符重载

操作符重载是C语言中一个非常有用的特性。它可以让我们比较优雅的简化代码&#xff0c;从而更加方便的编写逻辑。 为什么要使用操作符重载一种常见的用法是重载<<运算符&#xff0c;让标准输出可以输出自定义的类型。比如 #include <iostream>class Sample {friend…

urlparse模块(专门用来解析URL格式)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #urlparse模块&#xff08;专门用来解析URL格式&#xff09;#URL格式&#xff1a; #protocol ://hostname[:port] / path / [;parameters][?query]#fragment #parameters&#xff1a;特殊参数&#xff0c;一般用的很少。#1、url…

使用Boost的Serialization库序列化STL标准容器

使用Boost做对象序列化是非常方便的&#xff0c;本文将介绍一种序列化STL标准容器的方法。这是之前设计的异步框架的一个子功能&#xff1a;过程A将标准容器数据序列化成二进制流&#xff0c;然后将该二进制数据发送到过程B&#xff0c;过程B将数据反序列化为标准容器。&#x…

连登GitHub TOP榜,中国开发者在行动!

作者 | 唐小引数据 | 于瑞洋出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;中国开发者正在走向世界中文开源项目正在不断登上 GitHub TOP 榜不久前&#xff0c;一个名叫「wuhan2020」的开源项目进入了 GitHub Trending TOP 榜&#xff0c;截至到现在&#xff0c;已经…

Merge into的使用

用途 merge 命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于on子句的条件。该语句可以在同一语句中执行两步操作&#xff0c;可以减少执行多条insert 和update语句。merge是一个确定性的语句&#xff0c;即不会在同一条merge语句中去对同一条…

PHP和MySQL Web开发从新手到高手,第8天-创建categories管理页面

1. 创建categories管理页面 主要包含以下几个页面: A. index.php, 准备各种变量数据.供展示页面使用. B. categories.html.php, 显示categories. C. form.html.php, 用于编缉或添加作者的页面. 页面郊果: 2. categories页面的主要流程 2.1 是否已登录 if (!user_is_login()){in…

堆状态分析的利器——valgrind的DHAT

在《堆问题分析的利器——valgrind的massif》一文中&#xff0c;我们介绍了如何使用massif查看和分析堆分配/释放的问题。但是除了申请和释放&#xff0c;堆空间还有其他问题&#xff0c;比如堆空间的使用率、使用周期等。通过分析这些问题&#xff0c;我们可以对程序代码进行优…

cisco2950交换机密码恢复

在实际工作中可能会忘记交换机密码&#xff0c;导致不能对交换机进行配置的情况。cisco提供了密码恢复的方法。以下是关于交换机密码恢复说明&#xff1a;如果忘记密码&#xff0c;这时我们如果要配置交换机就必须在启动时绕过config.text的配置【密码保存在config.text中】然后…

程序员SQL都不会?能干啥?资深研发:别再瞎努力了!

国外有人曾做过调查显示&#xff1a;“SQL的使用人数仅次于JavaScript”。更有统计&#xff0c;世界上一流的互联网公司中&#xff0c;排名前 20 的有 80% 都是 MySQL 的忠实用户。为什么这项技术仍有这么多人在用&#xff1f;又为什么值得我们学习&#xff1f;1、无论你是前端…

OC管理文件方法

1、常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path  //从一个文件读取数据 -(BOOL)createFileAtPath: path contents:(NSData *)data attributes:attr  //向一个文件写入数据 -(BOOL)removeItemAtPath:path error:err  //删除一个文件 -(BOOL)moveItemAtPa…

堆状态分析的利器——gperftools的Heap Profiler

在《内存泄漏分析的利器——gperftools的Heap Checker》一文中&#xff0c;我们介绍了如何使用gperftools分析内存泄漏。本文将介绍其另一个强大的工具——Heap Profiler去分析堆的变化过程。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 我们使用类似于《堆…

亲戚称呼关系表

直系血亲父系曾曾祖父--曾祖父--祖父--父亲曾曾祖母--曾祖母--祖母--父亲母系曾曾外祖父--曾外祖父--外祖父--母亲曾曾外祖母--曾外祖母--外祖母--母亲儿子&#xff1a;夫妻间男性的第一子代。女儿&#xff1a;夫妻间女性的第一子代。孙&#xff1a;夫妻间的第二子代&#xff0…

技术驰援抗疫一线, Python 线上峰会免费学!

截至截止2月9号24时&#xff0c;新型冠状病毒在全国已确诊42714例&#xff0c;疑似病例已达21675例。而专家所说的“拐点”始终未至&#xff0c;受疫的影响&#xff0c;各大公司开启远程办公模式&#xff0c;将返回工作场所办公的时间一延再延。在抗疫前线&#xff0c;中国医疗…

ZeroMq实现跨线程通信

ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码&#xff0c;现在就将阅读的心得与成果记录一下&#xff0c;并重新模仿实现了一下经理的异步队列。 1、对外接口 //主要接口&#xff08;1&#xff09;void *ymq_attach (void *ctx_, int oid, voi…