分布式网站架构后续:zookeeper技术浅析-程序员宅基地

技术标签: 大数据学习之路  zookeeper  Zookeeper  hadoop  

  Zookeeper是hadoop的一个子项目,虽然源自hadoop,但是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用越来越多。今天我想谈谈zookeeper,本文不谈如何使用zookeeper,而是zookeeper到底有哪些实际的运用,哪些类型的应用能发挥zookeeper的优势,最后谈谈zookeeper对分布式网站架构能产生怎样的作用。

  Zookeeper是针对大型分布式系统的高可靠的协调系统。由这个定义我们知道zookeeper是个协调系统,作用的对象是分布式系统。为什么分布式系统需要一个协调系统了?理由如下:

  开发分布式系统是件很困难的事情,其中的困难主要体现在分布式系统的“部分失败”。“部分失败”是指信息在网络的两个节点之间传送时候,如果网络出了故障,发送者无法知道接收者是否收到了这个信息,而且这种故障的原因很复杂,接收者可能在出现网络错误之前已经收到了信息,也可能没有收到,又或接收者的进程死掉了。发送者能够获得真实情况的唯一办法就是重新连接到接收者,询问接收者错误的原因,这就是分布式系统开发里的“部分失败”问题。

  Zookeeper就是解决分布式系统“部分失败”的框架。Zookeeper不是让分布式系统避免“部分失败”问题,而是让分布式系统当碰到部分失败时候,可以正确的处理此类的问题,让分布式系统能正常的运行。

  下面我要讲讲zookeeper的实际运用场景:

  场景一:有一组服务器向客户端提供某种服务(例如:我前面做的分布式网站的服务端,就是由四台服务器组成的集群,向前端集群提供服务),我们希望客户端每次请求服务端都可以找到服务端集群中某一台服务器,这样服务端就可以向客户端提供客户端所需的服务。对于这种场景,我们的程序中一定有一份这组服务器的列表,每次客户端请求时候,都是从这份列表里读取这份服务器列表。那么这分列表显然不能存储在一台单节点的服务器上,否则这个节点挂掉了,整个集群都会发生故障,我们希望这份列表时高可用的。高可用的解决方案是:这份列表是分布式存储的,它是由存储这份列表的服务器共同管理的,如果存储列表里的某台服务器坏掉了,其他服务器马上可以替代坏掉的服务器,并且可以把坏掉的服务器从列表里删除掉,让故障服务器退出整个集群的运行,而这一切的操作又不会由故障的服务器来操作,而是集群里正常的服务器来完成。这是一种主动的分布式数据结构,能够在外部情况发生变化时候主动修改数据项状态的数据机构。Zookeeper框架提供了这种服务。这种服务名字就是:统一命名服务,它和javaEE里的JNDI服务很像。

  场景二:分布式锁服务。当分布式系统操作数据,例如:读取数据、分析数据、最后修改数据。在分布式系统里这些操作可能会分散到集群里不同的节点上,那么这时候就存在数据操作过程中一致性的问题,如果不一致,我们将会得到一个错误的运算结果,在单一进程的程序里,一致性的问题很好解决,但是到了分布式系统就比较困难,因为分布式系统里不同服务器的运算都是在独立的进程里,运算的中间结果和过程还要通过网络进行传递,那么想做到数据操作一致性要困难的多。Zookeeper提供了一个锁服务解决了这样的问题,能让我们在做分布式数据运算时候,保证数据操作的一致性。

  场景三:配置管理。在分布式系统里,我们会把一个服务应用分别部署到n台服务器上,这些服务器的配置文件是相同的(例如:我设计的分布式网站框架里,服务端就有4台服务器,4台服务器上的程序都是一样,配置文件都是一样),如果配置文件的配置选项发生变化,那么我们就得一个个去改这些配置文件,如果我们需要改的服务器比较少,这些操作还不是太麻烦,如果我们分布式的服务器特别多,比如某些大型互联网公司的hadoop集群有数千台服务器,那么更改配置选项就是一件麻烦而且危险的事情。这时候zookeeper就可以派上用场了,我们可以把zookeeper当成一个高可用的配置存储器,把这样的事情交给zookeeper进行管理,我们将集群的配置文件拷贝到zookeeper的文件系统的某个节点上,然后用zookeeper监控所有分布式系统里配置文件的状态,一旦发现有配置文件发生了变化,每台服务器都会收到zookeeper的通知,让每台服务器同步zookeeper里的配置文件,zookeeper服务也会保证同步操作原子性,确保每个服务器的配置文件都能被正确的更新。

  场景四:为分布式系统提供故障修复的功能。集群管理是很困难的,在分布式系统里加入了zookeeper服务,能让我们很容易的对集群进行管理。集群管理最麻烦的事情就是节点故障管理,zookeeper可以让集群选出一个健康的节点作为master,master节点会知道当前集群的每台服务器的运行状况,一旦某个节点发生故障,master会把这个情况通知给集群其他服务器,从而重新分配不同节点的计算任务。Zookeeper不仅可以发现故障,也会对有故障的服务器进行甄别,看故障服务器是什么样的故障,如果该故障可以修复,zookeeper可以自动修复或者告诉系统管理员错误的原因让管理员迅速定位问题,修复节点的故障。大家也许还会有个疑问,master故障了,那怎么办了?zookeeper也考虑到了这点,zookeeper内部有一个“选举领导者的算法”,master可以动态选择,当master故障时候,zookeeper能马上选出新的master对集群进行管理。

  下面我要讲讲zookeeper的特点:

zookeeper是一个精简的文件系统。这点它和hadoop有点像,但是zookeeper这个文件系统是管理小文件的,而hadoop是管理超大文件的。
zookeeper提供了丰富的“构件”,这些构件可以实现很多协调数据结构和协议的操作。例如:分布式队列、分布式锁以及一组同级节点的“领导者选举”算法。
zookeeper是高可用的,它本身的稳定性是相当之好,分布式集群完全可以依赖zookeeper集群的管理,利用zookeeper避免分布式系统的单点故障的问题。
zookeeper采用了松耦合的交互模式。这点在zookeeper提供分布式锁上表现最为明显,zookeeper可以被用作一个约会机制,让参入的进程不在了解其他进程的(或网络)的情况下能够彼此发现并进行交互,参入的各方甚至不必同时存在,只要在zookeeper留下一条消息,在该进程结束后,另外一个进程还可以读取这条信息,从而解耦了各个节点之间的关系。
zookeeper为集群提供了一个共享存储库,集群可以从这里集中读写共享的信息,避免了每个节点的共享操作编程,减轻了分布式系统的开发难度。
zookeeper的设计采用的是观察者的设计模式,zookeeper主要是负责存储和管理大家关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式。
  由此可见zookeeper很利于分布式系统开发,它能让分布式系统更加健壮和高效。

  前不久我参加了部门的hadoop兴趣小组,测试环境的hadoop、mapreduce、hive及hbase都是我来安装的,安装hbase时候安装要预先安装zookeeper,最早我是在四台服务器上都安装了zookeeper,但是同事说安装四台和安装三台是一回事,这是因为zookeeper要求半数以上的机器可用,zookeeper才能提供服务,所以3台的半数以上就是2台了,4台的半数以上也是两台,因此装了三台服务器完全可以达到4台服务器的效果,这个问题说明zookeeper进行安装的时候通常选择奇数台服务器。在学习hadoop的过程中,我感觉zookeeper是最难理解的一个子项目,原因倒不是它技术负责,而是它的应用方向很让我困惑,所以我有关hadoop技术第一篇文章就从zookeeper开始,也不讲具体技术实现,而从zookeeper的应用场景讲起,理解了zookeeper应用的领域,我想再学习zookeeper就会更加事半功倍。

  之所以今天要谈谈zookeeper,也是为我上一篇文章分布式网站框架的补充。虽然我设计网站架构是分布式结构,也做了简单的故障处理机制,比如:心跳机制,但是对集群的单点故障还是没有办法的,如果某一台服务器坏掉了,客户端任然会尝试连接这个服务器,导致部分请求的阻塞,也会导致服务器资源的浪费。不过我目前也不想去修改自己的框架,因为我总觉得在现有的服务上添加zookeeper服务会影响网站的效率,如果有独立的服务器集群部署zookeeper还是值得考虑的,但是服务器资源太宝贵了,这个可能性不大。幸好我们部门也发现了这样的问题,我们部门将开发一个强大的远程调用框架,将集群管理和通讯管理这块剥离出来,集中式提供高效可用的服务,等部门的远程框架开发完毕,我们的网站加入新的服务,我想我们的网站将会更加稳定和高效。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Lnho2015/article/details/46572093

智能推荐

关于 Coremail windows邮箱客户端(Air 版)特定附件名显示不正确问题的说明_寄信邮件写错名字_Coremail邮件安全的博客-程序员宅基地

经确认该问题仅涉及Coremail windows邮箱客户端(Air 版),不影响Coremail邮箱系统Web端、Coremail手机移动端、Coremail 信创客户端(Air 版),不影响Coremail邮件系统服务器安全。不影响反病毒引擎对恶意附件的查杀。............_寄信邮件写错名字

基于Pgpool-II的PostgreSQL集群-程序员宅基地

安装Pgpool-IIPgpool-II 是一个位于 PostgreSQL服务器和 PostgreSQL数据库客户端之间的中间件,Pgpool-II提供了连接池(Connection Pooling)、复制(Replication)、负载均衡(Load Balancing)、缓存(In Memory Query Cache)、看门狗(Watchdog)、超出限制链接(Limiting Excee...

php 浮点数精准相加,解决js浮点数相加不精准问题_马德阿姨的博客-程序员宅基地

// 相加的方法function add() {// 需要相加的数字let _args = arguments;// 获取到所有小数点的位数let _pointArray = Array.prototype.map.call(_args, (item) => {let _itemArray = item.toString().split(".")return _itemArray.lengt..._php 浮点型如何相加

spring boot 2.0(三):mysql数据库+mybatis+druid连接池 整合实例-程序员宅基地

application.properties配置:#端口server.port=8082#上下文server.servlet.context-path=/nyfz#druid数据源配置spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driverspring.datasource.druid.url=jdbc:my...

Clipper库中文文档(ClipperLib)-程序员宅基地

中文文档链接:https://love2.io/@martinchan3/doc/ClipperDocCNGit仓库:https://github.com/MartinChan3/ClipperDocCNClipper是计算机图形学中常用的库,支持Delphi、C++、C#等多种语言。之前看英文原文文档(http://www.angusj.com/delphi/clipper/docu..._clipperlib

Java异常处理与详解问题合集-程序员宅基地

Java异常处理与详解 作者:华日期:2018年5月30日一次考试考到Java自定义异常,没有做出来,只是简单地了解了一下,为了巩固知识,就从各大网站总结了关于Java异常的处理解释来加深自己的印象。(全部文字虽有雷同但都是亲自手打无复制)Java异常的意义:异常就是可预测但是又没办法消除的一种错误。所以程序员为了在程序当中不发生这样的错误会将容易发生异常的代码用try catch进行处理,或者通...

随便推点

蓝桥杯十一届国赛--扩散(枚举、暴力)_蓝桥杯 扩散__Rikka_的博客-程序员宅基地

一般首先想到的解法应该是bfs,但其实不必这么麻烦。想一下扩散一步其实就是移动距离1,那么扩散10步最远能到的就是离扩散点相距10的点,想通了这里就可以直接暴力了。枚举可能扩散到的点的坐标(图方便x,y取了-10000–10000,绝对够了),看离4个最初扩散点的距离是否小于2020。Code#include <iostream>using namespace std;int main(){ int sum=0; for(int i=-10000;i<=1000_蓝桥杯 扩散

PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_pytorch-neural-style-transfer-程序员宅基地

也就是使用预训练的卷积神经网络来实现艺术家的风格迁移。1.背景介绍Neural_Style也叫做Neural-Transfer,这个算法就是输入一张图片,然后选择一种艺术风格图片,算法会将他们两个融合在一起,让输入的图片达到这种艺术的效果。2.原理分析首先是需要让融合图片和原始图片有尽可能高的相似度,或者说尽可能低的差异性,同时也需要让融合图片和风格图片在风格上尽可能相近。1.内容差异最简单的想法就是将两张图片的每个像素点逐一进行比较,可以看作是均方误差,也就是求一下差,在计算平方的和,在定义风_pytorch-neural-style-transfer

图数据库nebula——搭建linux分布式集群_nebula分布式集群重启_LSY_csdn_的博客-程序员宅基地

目录1、集群架构:2、服务器:3、下载rpm软件包:4、修改服务器打开最大文件数:5、安装nebula:(1)上传rpm软件包:(2)执行rpm软件包:6、修改meta服务配置:(1)配置文件使用方式:(2)修改配置文件参数:① 增加参数local_config:② 修改参数meta_server_addrs:③ 修改参数local_ip:④ 修改参数data_path:⑤ 修改参数log_dir:⑥ 默认参数ws_ip:⑦ 默认参数por_nebula分布式集群重启

Failed to restart network.service: Unit network.service not found.-程序员宅基地

问题说明:使用systemctl restart network 或 service network restart 命令重启网卡失败。原因分析:主要原因为命令用错了,造成了找不到相应的网卡服务。解决方案: 操作系统为Centos 8,则需要用以下命令: nmcli c reload +网卡名例:nmcli c reload ens33如果不行,可尝试以下命令# 重载所有ifcfg或route到connection(不会立即生效)nmcli c reload ...

spark算子总结_rdd show 是什么算子-程序员宅基地

spark算子总结spark的算子分为行动算子和转换算子rdd是调用转换算子是逻辑上的传递,并没有真正运算,实际数据并没有变化,调用行动算子后,才会发给执行器,才会实际在在执行器中执行运算。..._rdd show 是什么算子

php的样式怎么设置字体大小,css中如何改变字体大小_行不深的博客-程序员宅基地

在css中,可以使用font-size属性来改变字体大小,该属性可以设置字体大小,语法格式为“font-size:值;”。实际上font-size属性设置的是字体中字符框的高度,实际的字符字形可能比这些框高或矮(通常会矮)。本教程操作环境:windows7系统、HTML5&&CSS3版、Dell G3电脑。在css中,可以使用font-size属性来改变字体大小。css font-...