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台机器系统可用率 |
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连接到上述三台机器中的一台,可以看到如下显示
相关文章:
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语言中一个非常有用的特性。它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑。 为什么要使用操作符重载一种常见的用法是重载<<运算符,让标准输出可以输出自定义的类型。比如 #include <iostream>class Sample {friend…

urlparse模块(专门用来解析URL格式)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #urlparse模块(专门用来解析URL格式)#URL格式: #protocol ://hostname[:port] / path / [;parameters][?query]#fragment #parameters:特殊参数,一般用的很少。#1、url…
使用Boost的Serialization库序列化STL标准容器
使用Boost做对象序列化是非常方便的,本文将介绍一种序列化STL标准容器的方法。这是之前设计的异步框架的一个子功能:过程A将标准容器数据序列化成二进制流,然后将该二进制数据发送到过程B,过程B将数据反序列化为标准容器。&#x…
连登GitHub TOP榜,中国开发者在行动!
作者 | 唐小引数据 | 于瑞洋出品 | AI科技大本营(ID:rgznai100)中国开发者正在走向世界中文开源项目正在不断登上 GitHub TOP 榜不久前,一个名叫「wuhan2020」的开源项目进入了 GitHub Trending TOP 榜,截至到现在,已经…

Merge into的使用
用途 merge 命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于on子句的条件。该语句可以在同一语句中执行两步操作,可以减少执行多条insert 和update语句。merge是一个确定性的语句,即不会在同一条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》一文中,我们介绍了如何使用massif查看和分析堆分配/释放的问题。但是除了申请和释放,堆空间还有其他问题,比如堆空间的使用率、使用周期等。通过分析这些问题,我们可以对程序代码进行优…

cisco2950交换机密码恢复
在实际工作中可能会忘记交换机密码,导致不能对交换机进行配置的情况。cisco提供了密码恢复的方法。以下是关于交换机密码恢复说明:如果忘记密码,这时我们如果要配置交换机就必须在启动时绕过config.text的配置【密码保存在config.text中】然后…
程序员SQL都不会?能干啥?资深研发:别再瞎努力了!
国外有人曾做过调查显示:“SQL的使用人数仅次于JavaScript”。更有统计,世界上一流的互联网公司中,排名前 20 的有 80% 都是 MySQL 的忠实用户。为什么这项技术仍有这么多人在用?又为什么值得我们学习?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》一文中,我们介绍了如何使用gperftools分析内存泄漏。本文将介绍其另一个强大的工具——Heap Profiler去分析堆的变化过程。(转载请指明出于breaksoftware的csdn博客) 我们使用类似于《堆…

亲戚称呼关系表
直系血亲父系曾曾祖父--曾祖父--祖父--父亲曾曾祖母--曾祖母--祖母--父亲母系曾曾外祖父--曾外祖父--外祖父--母亲曾曾外祖母--曾外祖母--外祖母--母亲儿子:夫妻间男性的第一子代。女儿:夫妻间女性的第一子代。孙:夫妻间的第二子代࿰…
技术驰援抗疫一线, Python 线上峰会免费学!
截至截止2月9号24时,新型冠状病毒在全国已确诊42714例,疑似病例已达21675例。而专家所说的“拐点”始终未至,受疫的影响,各大公司开启远程办公模式,将返回工作场所办公的时间一延再延。在抗疫前线,中国医疗…

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