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

zookeeper快速入门——简介

在几十年前,一个独立的计算机上往往部署着一套完整的应用系统。当时因为网络稳定性及速度的限制,将相关联的服务部署在一台机器上,让它们使用系统机制通信——比如管道,文件等,往往是最稳定和最高效的。然而随着网络技术的发展,特别是“云计算”和“大数据”的盛行,我们越来越多的谈到“分布式系统”——建立在网络上的软件系统。这样部署在不同机器上的关联服务就依赖于网络以及它们自定义的“协议”和“机制”来构建出更加健壮和系统。之前在单机时代,“机制”是受限于操作系统;而网络时代,“机制”将变得更加自由——不同厂商可以定义自己的“机制”以让分布式系统运转起来。(转载请指明出于breaksoftware的csdn博客)

我们先闭眼冥想下:如果我们去构建分布式系统,需要考虑些什么问题?

  1. 网络通信协议。这个难度相对低些,我们忽略。
  2. 异常处理方案。这个就非常复杂了,异常有来自网络的,有来自系统的,有来自用户错误的使用……
  3. 分布式系统维护方案。如果系统内部发生机器增删行为,怎么处理?如果某台机器变得不稳定了,怎么办?……
  4. CAP。除了上述,我们还会遇到CAP定律(https://en.wikipedia.org/wiki/CAP_theorem):一致性(Consistency),可用性(Availability)和分区容错性(Partition Tolerance)最多只能同时满足两个。

简单的说,就是在一个分布式系统中,如果发生网络故障,我们无法同时满足强一致性和可用性:

  • 如果要满足强一致性。请求落在故障机器上时,要一直等待该机器和其他机器同步完最新数据后才能返回。这就牺牲了可用性。
  • 如果要满足可用性。请求落在故障机器上后立即返回该机器上的数据,但是其数据可能不是最新的。这就牺牲了强一致性。

可见设计一套分布式系统还是要面临很多问题,而且我们设计往往会结合自身业务特征,从而增加了重用的难度。如果每个公司都设计出自己的一套,其场景就像动物园里的动物:琳琅满目。虽然这对看客来说是件好事,但是增加动物园的管理负担——比如喂养老虎的饲养员可能不会喂养兔子,需要雇佣更多的员工或者培训现有的员工。这个时候,一个超级饲养员出现了——zookeeper——动物园(zoo)饲养员(keeper)。

zookeeper设计了一套通用“机制”,提供了少量简单的API,可以让我们便捷的构建分布式协作系统。依然以动物饲养为例,一个饲养员如果是要给兔子去做饭,就可以用zookeeper提供的切割机去切草——多切几次变得比较细;他要是去给老虎做饭,还可以使用zookeeper提供的切割机去切肉——只切一次让老虎可以大口吃肉。

zookeeper为什么大受欢迎?我觉得除了方案具有通用性外,还和其设计特点有关——将复杂的问题简单化,把抽象的问题实例化。

zookeeper并没有让各种信息逻辑糅杂在一个服务中。设想下,如果我们将业务逻辑、分布式系统维护逻辑都放在下面一台机器上,则要求每台机器互联,而且一旦发生某台机器断网,其他机器都将要处理这样的异常。这样看似服务部署变得简单,但是会导致服务内部比较杂乱。

zookeeper则采用“分角色”的方案。在一个经典的zookeeper系统中,业务代码只在Zookeeper Client中,这样开发者只要专心于Client上的业务逻辑实现就行了,而分布式系统中大部分异常可以交由zookeeper提供的Zookeeper Server服务去解决。

那么Client和Server间交互的是什么信息呢? 我们称这样的信息叫做“元信息”。元信息存在于Server上,而Client端通过网络向Server端进行读写,从而达到“分布式协同”的功能。于是元信息的设计关系了整个系统的复杂程度。

zookeeper设计的元信息结构和我们日常使用的文件目录系统很像。这样我们在遇到“分布式协同难题”时,可对照着“文件目录系统”这样“老知识”去梳理和解决,这无疑大大降低了理解的难度。

不同的Client可以同时读写同一个节点信息。Zookeeper Server可以保证信息要么被全部写入,要么写失败。而信息读取方,也只能一次性读到全部数据,而不可以读取部分数据。所以这种类似“原子性”的特性,可以让Client设计者不用去关心脏数据的问题。

Client还可以向Server端注册对节点变动的监视。这样就免除了Client端采用轮训这种低效的模式。这和操作系统提供的监控文件变动功能也很像。当然Zookeeper设计的这套结构自然有自己的特点,比如临时节点、有序节点、节点版本等,这些我们在之后的章节会介绍。

跳出这些微观的设计,我们再看下基于zookeeper的分布式系统整体结构,发现Zookeeper Server之间的并非相互连接的。如果我们让不同Server之间相互连接,会使得每个Server的设计变得非常复杂,因为它要兼顾到每个和其他Server的连接信息。

zookeeper做了一个这样的设计:选举“领导”(leader)。这就像我们选举领导一样,一个集群里有选举权的员工可以相互交流推选出一个领导,落选的自然成为“追随者”(follower)。被推选为“领导”的服务负责维护各个Zookeeper Server的一致性和可用性。比如一个连接到“追随者”的Client提交了一个修改信息的请求,“追随者”会将“修改”提交给“领导”,“领导”要将这个修改同步给其他“追随者”。这样就达到整个系统的信息的一致性。为了让“领导”可以专心做自己的事,所以不太建议Client端直接连接到Leader服务。

在大部分场景下,只有“领导”和“追随者”是足够的。但是如果这个集群的需要承载比较大的请求量,我们就需要增加机器,也就是增加“追随者”。这样虽然解决了问题,但是会带来另外一个问题——太多的“追随者”需要更多的时间去选举“领导”,而且这个耗时会导致系统一段时间内部分功能不可用,最最关键的是这个时耗可能很长。于是我们就剥夺了一些“追随者”的选举权,让它们成为“观察员”。这样在Leader失效时,只有少部分Follower进行投票选举,从而降低了系统不可用的时间。

相关文章:

为TextMate扩展全屏功能

今天看代码,感觉TextMate那个窗口太小了点,越看越不爽,就想把它弄成全屏的。于是搜索啊搜索啊搜索,终于让我找到一款很yd的小软件,叫megazoomer, 下载地址是:[url]http://ianhenderson.org/mega…

hdu1406

一道很水很水的题&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;#include<iostream> using namespace std; int main(){int num1,num2,i,k,j,sum,n;while(cin>>n){ while(n--){cin&g…

zookeeper快速入门——部署

zookeeper有两种运行模式&#xff1a;独立模式和仲裁模式。独立模式就是只运行一个Zookeeper Server&#xff0c;这自然没法解决服务崩溃导致系统不可用的问题。仲裁模式就是以集群的方式运行Zookeeper Server&#xff0c;这样在Leader不可用时&#xff0c;集群内部会发起选举&…

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

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

电脑常见故障 1

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

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

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

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

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

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

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

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

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

fragment类onresume里面刷新操作处理

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

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

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

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

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

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

来源 | Object Instance Mining for WeaklySupervised Object Detection编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;商汤科技视频大数据团队发表论文《Object Instance Mining forWeakly Supervised Object Detection》&#xff0c;该论文…

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

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

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

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

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

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

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

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

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

2019独角兽企业重金招聘Python工程师标准>>> 【准备工作】 01 #在编译安装lnmp之前&#xff0c;首先先卸载已存在的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如何应用到极致?

作者简介&#xff1a;袁鸣凯&#xff0c;家乐福技术总监&#xff0c; 高知特有限技术公司中国区架构师&#xff0c;HP上海研发技术专家&#xff0c;夸客金融首席架构师&#xff0c;现任家乐福中国区技术总监。多年互联网、企业级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; 我们使用类似于《堆…