ZooKeeper可以作为分布式存储系统搭建么

巧用zookeeper实现分布式并行计算
云计算的技术话题中少不了“分布式”,“并行计算” 这些个关键词,我们知道硬件扩展的条件(Scale-up)始终是有限制的,将计算分散到网络中更多机器的CPU上提供更高的计算性能(Scale-out),并在这基础上能将计算同时进行,那么总体计算瓶颈会减小,计算的性能会显著提高,也就是说将串行计算变为并行计算,将大量的计算在同一时间发生,,将任务分配到每一个处理器上。这里面需要一个重要的角色,分布式计算资源中的协调者。
有这样一个场景:系统中有大约100w的用户,每个用户平均有3个邮箱账号,每隔5分钟,每个邮箱账需要收取100封邮件,最多3亿份邮件需要下载到服务器中(不含附件和正文)。用20台机器划分计算的压力,从多个不同的网路出口进行访问外网,计算的压力得到缓解,那么每台机器的计算压力也不会很大了。
通过我们的讨论和以往的经验判断在这场景中可以实现并行计算,但我们还期望能对并行计算的节点进行动态的添加/删除,做到在线更新并行计算的数目并且不会影响计算单元中的其他计算节点,但是有4个问题需要解决,否则会出现一些严重的问题:
1.20台机器同时工作时,有一台机器down掉了,其他机器怎么进行接管计算任务,否则有些用户的业务不会被处理,造成用户服务终断。
2.随着用户数量增加,添加机器是可以解决计算的瓶颈,但需要重启所有计算节点,如果需要,那么将会造成整个系统的不可用。
3.用户数量增加或者减少,计算节点中的机器会出现有的机器资源使用率繁忙,有的却空闲,因为计算节点不知道彼此的运行负载状态。
4.怎么去通知每个节点彼此的负载状态,怎么保证通知每个计算节点方式的可靠性和实时性。
先不说那么多专业名词,白话来说我们需要的是:1记录状态,2事件通知 ,3可靠稳定的中央调度器,4易上手、管理简单。
采用Zookeeper完全可以解决我们的问题,分布式计算中的协调员,观察者,分布式锁& 都可以作为zookeeper的关键词,在系统中利用Zookeeper来处理事件通知,队列,优先队列,锁,共享锁等功能,利用这些特色在分布式计算中发挥重要的作用。
zookeeper的服务器端是采用Java编写,而zookeeper的客户端不仅可以支持java还可以支持C语言的客户端,在zookeeper服务端可以创建一个树状的Key/Vaule 存在着父子节点之间的关系。
Zookeeper允许多个Client对一个或多个ZNode数据进行监控,当ZNode有变化时能够通知到监控这个ZNode的各个Client,所有监听这个节点的成员都会知道了,Zookeeper使用Watcher察觉事件信息,当客户端接收到事件信息,比如连接超时,节点数据改变,子节点改变,可以调用相应的行为来处理业务逻辑。相反,如果zookeeper客户端对服务端的znode不关注,不Watcher,那么发生任何变化zookeeper的客户端都不会收到事件通知。
zookeeper中znode的数据模型
每次zookeeper客户端与服务器端连接后都会创建一个session ID 给客户端,客户端将会定期心跳协议到服务器端验证这个连接的有效性。如果由于某种原因,客户端无法发送心跳到服务器,将导致服务器验证过期的会话,会话ID将变为无效。客户持有的连接/对象将不可用,因此应用程序必须创建一个新的客户对象。如果zookeeper客户端连接到服务器没有任何响应,首先客户端会作抛出的异常并且被捕获,清除当前与Server相关的网络资源和连接会话,然后客户端逐个尝试配置列表中Server的连接地址,选择可用的服务器继续进行工作。
上述Zookeeper客户端和服务器端的关系又是一个典型的“观察者”模式,客户端关注自己关心的对象(znode),一旦发送变化就立刻通知。在《Head First设计模式》中有这样的一张图来表达 观察者模式的。
如图所示,此系统中的三个部分是气象站(获取实际气象数据的物理装置)、WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板,再来看看百度百科对“观察者”模式的解释:/view/1854779.htm
通过对Zookeeper的了解,实现我们系统中需要的Failure detection和Load detection 功能,只需要在每个计算的节点中实现zookeeper客户端程序,计算节点关注zookeeper服务器上znode节点变化。可以在zookeeper服务器的znode上创建一个根节点/clusterA,下面根据计算节点机器名创建对应的子节点,子节点中的value就是这台计算节点的ip地址。
如:/clusterA/node1,/clusterA/node2,/clusterA/nodeN,这些节点都是临时节点(EPHEMERAL),一旦连接断开,创建的节点自动会被删除,关注/clusterA这个根节点/clusterA的机器都会知道现在哪台机器离开计算单元了,并且获知现在有多少个计算节点在这个计算单元中。
如果有新的计算节点添加,在程序运行的第一步将会到zookeeper服务器上的/clusterA 的znode上创建一个子节点/clusterA/nodeZ,这样关注 /clusterA这个znode的机器都会知道现在多了一个计算节点。
通过zookeeper客户端API中的getChildren()方法对应的数据类型是java.util.List,其返回/clusterA下面的机器列表,这样还能判断出自己在这个列表中排行位置,通过列表中排行位置可以对应用户列表中的数目,这样就知道自己去获得需要计算总数中的几分之分。
例如:有100w用户,20个节点时,每个节点处理5w用户进行同时计算,node3计算节点承载用户总数中10w-15w用户之间的计算压力,有200w用户,20个节点时,每个节点处理10w个用户的业务进行同时计算,node3计算节点承载用户总数中30w-40w用户的计算压力,以此类推。
这样一来无论计算节点的数目发生变化还是,需要计算的数目发生变化,都可以保证计算压力的平均分载。
我的废话:
1.根据节点数对应用户数算出百分比之后进行计算分载,貌似我们通常的分页查询,只不过将每页的分页结果同时显示在N多个显示器上输出,希望这样比喻能让您更好的理解。
2.在计算的中间有新的用户数量增加,将会通知每个计算节点 下次轮询时需要重新统计用户数量,因为用户所有用户的数据分块拿走以后放入本地的静态hashmap(缓存),没有发生变化就从本地加载,操作数据库发生变化后,通知zookeeper的znode节点 每个计算节点重新从数据库中加载一次。
3.在并行计算中时间同步也是一个需要注意的地方,如果每台机器上的时间不一致会导致潜在的隐患,可以找些工具通过时间服务器同步每台机器上的当前时间和时区。
4.使用zookeeper对计算节点的状态管理只是zookeeper实现的一部分,zookeeper还可以对外提供分组,配置管理,命名空间等服务等,这里只是做了一个抛砖引玉的作用。
对于zookeeper的可靠性和性能而言,有足够的机器那么稳定性就会越高,但是性能会降低,因为ZooKeeper在运行时全部的数据都会加载到内存中,集群中每一台服务器都包含全量的数据,每个节点实时保持数据的同步。因此整个集群中Follower数量越多,整个集群写入的性能越差。后来zookeeper Server为了避免这个问题,可以将ZooKeeper集群中部分服务器指定为Observer。
更多相关文章
摘要:Fourinone是一个分布式并行计算框架,以轻量的方式提供了一个四合一的分布式框架功能以及简单易用的API,通过实现对多台计算机资源的统一利用,来获得强大的计算能力.本期我们采访了项目创始人彭渊. Fourinone(即Four-in-one,中文名字“四不像”)是一个分布式计算框架,提供了 ...
今天在微博上看到 @陈利人 分享的关于分布式Lucene的文章,评论里也出现了一些新的基于Lucene和Hadoop的搜索框架,比如这个Nulta.因为自己的毕设是关于分布式索引的,自己也使用过Lucene,Hadoop,一直很关注也很感兴趣,就大致了解了下Nulta这个框架. 根据主页里的介绍,N ...
从出版社联系到如今出版,将近一年半时间,现在终于上市了,希望对有需要的同行朋友有帮助.读者朋友有任何关于本书的问题或建议,都可以通过以下途径来进行反馈: 论坛:/AGFzp (QQ或新浪微博账号均可登录) 通过微信: 联系到我. 书名:&从Paxos到 ...
关于matlab并行计算文章来自百度博客:水知道答案,在此表示感谢 MATLAB分布式并行计算环境(一)
前言:之前在本博客上发过一些关于matlab并行计算的文章,也有不少网友加我讨论关于这方面的一些问题,比如matlab并行计算环境的建立,并行计算效果,数据传递等等,由于本人在研究生期间做 ...
ZooKeeper实现分布式队列Queue 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务. 现在硬件越来越便宜,一台非品牌服务器,2颗24核CPU,配48G内存,2T的硬盘,已经降到2万块人民币以下了.这 ...
认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被动 物所观赏.为了让各种不同的动物呆在它们应该呆的地方,而不是相互串门,或是相互厮杀,就需要动物园管 ...
转自:http://blog.fens.me/hadoop-zookeeper-intro/
前言 ZooKeeper是Hadoop家族的一款高性能的分布式协作的产品.在单机中,系统协作大都是进程级的操作.分布式系统中,服务协作都是跨服务器才能完成的.在ZooKeeper之前,我们对于协作服务大 ...
今年是处理器的“双核年”.多年以来,Intel和AMD都在持续努力提升CPU计算能力,在单芯片频率达到近乎极限后,终于将CPU推入多内核时代. 现今的个人计算机,运算能力是早期大型计算机的百倍以上,这是拜软件业与硬件业互相促进之赐.众所周知的例子,是所谓“微软-英特尔”联盟,即操作系统和处理器相互 ...
paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现 ...
以一颗平常的心,来面对无常的人生. 人生就像骑自行车,想保持平衡就得往前走. 不要轻易述说生活的狼狈,学会面对杂乱无序的现实. 生命需要保持一种激情,激情能让别人感到你是不可阻挡的时候,就会为你的成功让路!一个人内心 ...
全站搜索这里利用的技术是先把数据库的所有内容都导出,然后用字符串匹配的技术找到相应的数据存到一个数组里面去.
还是像往常一样,自己就不要说些乱七八糟的了,直接上代码: search模块: &l ...
先确认证书是否正确 再确认Bundle Indentifier 是否与证书匹配 再确认De ...
&Android Dev Guide&系列教程18:通过适配器给AdapterView绑定数据 懒骨头(/iamlazybone) AdapterView是View ...
不难看出,随着安全威胁的不断变化,越来越多的安全模块表现出了分离主义倾向,这对于传统的UTM也提出了挑战.为了解决这个问题,UTM有二条出路可走. 第一,提高处理器性能.在今年6月,SonicWall和Fortine ...
问题聚焦: 思想:应用程序数据的共享 对数据库的访问仅限于创建它的应用程序,但是事情不是绝 ...
这个家伙很懒,什么都没写 但是有留言,必回
某公司申请一个C类的网络202.60.31.0的ip地址空间,该公司有100名成员在销售部,50名员工在财务部,50名在设计部,请求网络管理员为3各部分分别建立组网. 解题:将个3部门分别三个不同的子网当中. 1.有 ...
能凑合吗? 在一夜狂欢之后,女孩带着自己的新男友回家来.“别出声!”她警告他,“我爸妈就在隔壁睡觉,如果他们发现我们,会把我俩都杀了的.” 于是他们就 ...分布式助手Zookeeper(六) - 推酷
分布式助手Zookeeper(六)
散仙,在关于zookeeper的前几篇文章中,除了记录了zookeeper的一些基础知识,也介绍了怎么使用zookeeper来完成,配置文件同步,和主从自动切换的功能,那么,本篇散仙将会介绍下如何使用,zookeeper来完成分布式锁的功能,其实本质上是与主从切换的实现代码是非常类似的,但是功能上强调的重点不一样。
至于,为什么需要分布式锁(公平锁)?为什么不使用JAVA 自带的锁的应用?
1,为什么需要分布式锁? 因为在分布式环境下,可能会出现一些事务,这时候我们除了可以在存储层的数据库进行控制,也可以在应用层控制,举个例子来讲,中国的飞机路线,我们都知道任何时候,都只能由一架飞机通过,而这个控制这个由谁通过,什么时候通过,是由一个信号控制台来决定的,分布式的环境下由于节点分散在各个地方,各个区域,所以控制起来比较麻烦,这时候我们就可以使用zookeeper来轻松的完成,分布式锁的功能。
2,为什么不使用JAVA自带的锁?JAVA JDK提供了公平锁,与非公平锁,但这种实现是基于同一个JVM来说的,如果同一台机器上,不同的JVM,则可以使用文件锁,来实现,但是这些并不是分布式的模式,虽然可以通过RMI的方式来实现,但比较繁琐。
使用zookeeper来完成分布式锁的步骤如下:
创建一个持久znode
多个程序并发的去zk服务上,创建一个短暂有时序性的节点路径。
各个节点监听,比它小的里面,最大的节点的动态。
如果发现,比它小的里面,最大的节点发生锁释放或退出,就自动接替为独占锁
没发生改变的节点,继续重复步骤,2,3,4
拓扑图如下所示:
注意上图中的master指的就是,获取锁的实例,这其实跟集群环境里只能有一个master的道理一样。
代码如下:
package com.
import java.nio.charset.C
import java.nio.charset.StandardC
import java.text.SimpleDateF
import java.util.C
import java.util.D
import java.util.L
import java.util.concurrent.CountDownL
import org.apache.zookeeper.CreateM
import org.apache.zookeeper.WatchedE
import org.apache.zookeeper.W
import org.apache.zookeeper.ZooDefs.I
import org.apache.zookeeper.ZooK
import org.apache.zookeeper.Watcher.Event.KeeperS
import org.apache.zookeeper.data.S
* 基于zookeeper实现的
* 分布式公平锁
* @author qin dong liang
* QQ技术群交流:
public class Lock1
implements Watcher {
private ZooK
/**原子计数锁,防止在zk没有连上前,执行CURD操作*/
private CountDownLatch down=new CountDownLatch(1);
public Lock1() {
// TODO Auto-generated constructor stub
public Lock1(String host)throws Exception {
this.zk=new ZooKeeper(host, 5000 , new Watcher() {
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
/**链接上zk服务,岂可取消阻塞计数**/
if(event.getState()==KeeperState.SyncConnected){
down.countDown();
* 字符编码
private static final Charset CHARSET=StandardCharsets.UTF_8;
* 此方法是写入数据
* 如果不存在此节点
* 就会新建,已存在就是
public void write(String path,String value)throws Exception{
Stat stat=zk.exists(path, false);
if(stat==null){
zk.create(path, value.getBytes(CHARSET), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zk.setData(path, value.getBytes(CHARSET), -1);
public void check()throws Exception{
List&String& list=zk.getChildren(&/a&, null);
Collections.sort(list);//排序使得节点有次序
if(list.isEmpty()){
System.out.println(&此父路径下面没有节点,分布式锁任务完成或还没启动!&);
String start=list.get(0);//获取第一个节点
String data=new String(zk.getData(&/a/&+start, false,null));
if(data.equals(&a&)){//等于本身就启动作为Master
if(list.size()==1){
startMaster();//作为Master启动
automicSwitch();//对于非第一个启动的节点,会调用此方法,因为他的第一个挂了
//或释放锁了,所以它是抢占的
//非当前节点,就打印当前节点,监控的节点
for(int i=0;i&list.size();i++){
//获取那个节点存的此客户端的模拟IP
String temp=new String(zk.getData(&/a/&+list.get(i), false, null));
if(temp.equals(&a&)){
//因为前面作为首位判断,所以这个出现的位置不可能是首位
//需要监听小节点里面的最大的一个节点
String watchPath=list.get(i-1);
System.out.println(&Lock1监听的是:
&+watchPath);
zk.exists(&/a/&+watchPath, this);//监听此节点的详细情况,如果发生节点注销事件
//则会触发自身的process方法
//结束循环
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
if(event.getType()==Event.EventType.NodeDeleted){
//如果发现,监听的节点,挂掉了,那么就重新,进行监听
System.out.println(&注意有锁退出或释放,公平锁开始抢占........&);
}catch(Exception e){
e.printStackTrace();
* 读取数据,给定一个路径和
* 监听事件
public String read(String path,Watcher watch)throws Exception{
byte[] data=zk.getData(path, watch, null);
return new String(data,CHARSET);
SimpleDateFormat f=new SimpleDateFormat(&yyyy-MM-dd HH:mm:ss&);
* 关闭zk连接
public void close()throws Exception{
zk.close();
* @throws Exception
public void automicSwitch()throws Exception{
// System.out.println(&有节点释放锁,Lock1锁占入.......,
&+f.format(new Date()));
System.out.println(&Lock1的上级锁节点退出或释放锁了,Lock1锁占入.......,
&+f.format(new Date()));
* 创建一个持久node,
public void createPersist()throws Exception{
zk.create(&/a&, &主节点&.getBytes(), Ids.OPEN_ACL_UNSAFE , CreateMode.PERSISTENT);
System.out.println(&创建主节点成功........&);
* 创建锁node,注意是抢占 的
public void createTemp()throws Exception{
zk.create(&/a/b&, &a&.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println(&Lock1注册锁成功,进入公平队列...........&);
public static void main(String[] args)throws Exception {
//Slave s=new Slave(&192.168.120.128:2181&);
Lock1 lock=new Lock1(&192.168.120.128:2181&);
lock.createPersist();//创建主节点
lock.createTemp();//注册临时有序节点
lock.check();
Thread.sleep(Long.MAX_VALUE);
//lock.close();
* 获取锁成功
public void startMaster(){
System.out.println(&Lock1节点获取锁了,其他节点等待........&);
代码如上,所示,测试的时候,需要搭建一个3个节点的zookeeper集群,关于怎么搭建zookeeper集群,散仙前面的文章里有介绍,需要注意的是myid文件不要漏掉。
上面这个类,需要拷贝多份,并改变里面的节点的值,放在不同的eclipse中,进行模拟测试。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示您所在的位置: &
1.2 分布式产品Hadoop、ZooKeeper、HBase概述(2)
1.2 分布式产品Hadoop、ZooKeeper、HBase概述(2)
机械工业出版社
《大规模分布式系统架构与设计实战》第1章概述,本章意在使读者对分布式技术话题的前因后果先有所了解。本节为分布式产品Hadoop、ZooKeeper、HBase概述。
1.2 分布式产品Hadoop、ZooKeeper、HBase概述(2)
2. ZooKeeper
ZooKeeper在Hadoop生态体系中是作为协同系统出现的,为什么会独立出一个协同系统呢?我们看看跟分布式协同相关的一些重要概念。
分布式协同系统:大型分布式应用通常需要调度器、控制器、协同器等管理任务进程的资源分配和任务调度,为避免大多数应用将协同器嵌入调度控制等实现中,造成系统扩充困难、开发维护成本高,通常将协同器独立出来设计成为通用、可伸缩的协同系统。
ZooKeeper:Hadoop生态系统的协同实现,提供协调服务,包括分布式锁、统一命名等。
Chubby:Google分布式系统中的协同实现和ZooKeeper类似。
Paxos算法:1989年由莱斯利&兰伯特提出,此算法被认为是处理分布式系统消息传递一致性的最好算法。
领导者选举:计算机集群中通常需要维持一个领导者的服务器,它负责进行集群管理和调度等,因此集群需要在启动和运行等各个阶段保证有一个领导者提供服务,并且在发生故障和故障恢复后能重新选择领导者。
当前业界分布式协同系统的主要实现有ZooKeeper和Chubby,ZooKeeper实际上是Google的Chubby的一个开源实现。ZooKeeper的配置中心实现更像一个文件系统,文件系统中的所有文件形成一个树形结构,ZooKeeper维护着这样的树形层次结构,树中的结点称为znode,每个znode存储的数据有小于1MB的大小限制。ZooKeeper提供了几种znode类型:临时znode、持久znode、顺序znode等,用于不同的一致性需求。在znode发生变化时,通过&观察&(watch)机制可以让客户端得到通知。可以针对ZooKeeper服务的&操作&来设置观察,该服务的其他操作可以触发观察。ZooKeeper服务的&操作&包括一些对znode添加修改获取操作。ZooKeeper采用一种类似Paxos的算法实现领导者选举,以解决集群宕机的一致性和协同保障。总体上说,ZooKeeper提供了一个分布式协同系统,包括配置维护、名字服务、分布式同步、组服务等功能,并将相关操作接口提供给用户。
ZooKeeper的结构如图1-7所示。
ZooKeeper大致工作过程如下:
1)启动ZooKeeper服务器集群环境后,多个ZooKeeper服务器在工作前会选举出一个Leader,若在接下来的工作中这个被选举出来的Leader死了,而剩下的ZooKeeper服务器会知道这个Leader死掉了,系统会在活着的ZooKeeper集群中会继续选出一个Leader,选举出Leader的目的是在分布式的环境中保证数据的一致性。
2)另外,ZooKeeper 支持watch(观察)的概念。客户端可以在每个znode结点上设置一个watch。如果被观察服务端的znode结点有变更,那么watch就会被触发,这个watch所属的客户端将接收到一个通知包被告知结点已经发生变化。若客户端和所连接的ZooKeeper服务器断开连接时,其他客户端也会收到一个通知,也就是说一个ZooKeeper服务器端可以服务于多个客户端,当然也可以是多个ZooKeeper服务器端服务于多个客户端。
我们这里只是讲述了ZooKeeper协同的基本概念,第3章我们还会详细讲如何实现这样的协同系统,并与ZooKeeper进行一些对比。
HBase是NoSQL技术的产物,NoSQL风行后,很多互联网应用需要一个面向键/值的列存储数据库,并可以支持水平扩充,当然Google在这个领域又走在了前面。
HBase是Google Bigtable的开源实现。Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用ZooKeeper作为对应的功能。
图1-8是HBase的架构,里面的HDFS也就是Hadoop中的分布式文件系统。对里面主要的核心组件简单介绍如下:
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
本书是作者从程序员到首席架构师十多年职业生涯的实战经验总结,
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
本书运用水彩的表现手法呈现了大自然中丰富的色彩与自
这本专家级的Wrox指南最适合于快速上手VisualStudio20
不管为小公司生成发票,还是创建有助于管理跨国公司的
本书是一本介绍Windows系统上的用户态程序排错方法和技巧的书。本书分为4个章节,先介绍最重要的、通用的思考方法,以便制定排错
51CTO旗下网站你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader。Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。
etcd 集群的工作原理基于 raft 共识算法 (The Raft Consensus Algorithm)。etcd 在 0.5.0 版本中重新实现了 raft 算法,而非像之前那样依赖于第三方库
。raft 共识算法的优点在于可以在高效的解决分布式系统中各个节点日志内容一致性问题的同时,也使得集群具备一定的容错能力。即使集群中出现部分节点故障、网络故障等问题,仍可保证其余大多数节点正确的步进。甚至当更多的节点(一般来说超过集群节点总数的一半)出现故障而导致集群不可用时,依然可以保证节点中的数据不会出现错误的结果。
Raft算法可以通过这个来学习下,非常直观。
Zookeeper是一个用户维护配置信息、命名、分布式同步以及分组服务的集中式服务框架,它使用Java语言编写,通过协议来保证节点的一致性。因为Zookeeper是一个CP型系统,所以当网络分区问题发生时,系统就不能注册或查找服务。
etcd是一个用于共享配置和服务发现的高可用的键值存储系统,使用Go语言编写,通过Raft来保证一致性,有基于HTTP+JSON的API接口。etcd也是一个强一致性系统,但是etcd似乎支持从non-leaders中读取数据以提高可用性;另外,写操作仍然需要leader的支持,所以在网络分区时,写操作仍可能失败。
在原生接口和提供服务方式方面,etcd更适合作为集群配置服务器,用来存储集群中的大量数据。方便的REST接口也可以让集群中的任意一个节点在使用Key/Value服务时获取方便。ZooKeeper则更加的适合于提供分布式协调服务,他在实现分布式锁模型方面较etcd要简单的多。所以在实际使用中应该根据自身使用情况来选择相应的服务。
那 Consul 呢?
Consul、ZooKeeper、etcd 应该怎样选择?
桂阳曾经写过一篇文章:,给楼主参考。
Consul和ZooKeeper、Doozerd、Etcd的区别:
搞个详细的文章讲讲啦
要回复问题请先或
DockOne官方账号
浏览: 7543
关注: 12 人

我要回帖

更多关于 分布式存储系统设计 的文章

 

随机推荐