【分布式协调器】Paxos的工程实现-cocklebur简介(一)
初识分布式协调器
分布式协调器的“协调”二字让人摸不到头脑,怎么就协调了,用的着协调吗?实际上这个东西在之前就是为了提供分布式锁服务而设计的,伟大的google公司发明了chubby,雅虎随后也推出了chubby的开源实现zookeeper。由于其高可用高容错的特性逐渐的衍生出了非常丰富的功能。目前来说最重要的三个功能是分布式锁、选主节点、命名服务。
比如选主时,为了让集群的所有节点达成一致,必须要通过选举算法来实现,可能有人会问,我直接配置好不就行了,已启动大家都知道谁是主节点。但是master挂了咋办?那你的HA就不能保证了,这叫single point of failure(单点故障)。那有人可能又说了,轮流来当master不就行了?但是动态增加删除节点你的集群怎么做到Scalable(可伸缩)。总之别问了,人择原理,存在即是合理的,所以请听我细细道来…
关于cocklebur的开发目的
我闲暇时间开发了一个叫做cocklebur的东西,已经开源到github。其实当初在看了一些关于paxos的文章之后觉得很困惑,于是就去看zookeeper的源码,以及一些源码剖析的文章,但依然觉得不得要领。所以就打算自己去搞一下,因为在开发过程中,你能够正面的遇到问题,然后去解决问题,而不是旁观别人提出问题,然后直接去看答案。
开发cocklebur,完全是为了学习,而并没有期望把它打造成向zookeeper那样的项目,本人水平有限,接触分布式领域也不过1年半,所以有写的不对不好的地方,还望各路高手指点一二。
Cocklebur概述
首先cocklebur可以部署成为一个集群,每个节点都维护着所有节点的地址信息;Cocklebur集群刚刚启动时,每个节点都会提议自己是master(因为它们不知道彼此的情况),经过一个选举过程,最终达成一致。选出master之后,整个集群就开始同步数据,每个节点都保存了一份类似Unix文件系统的数据结构,里面存放着目录、文件。同步的目的就是保证集群每个节点都持有最新且一致的数据,之后集群就可以对外服务了。外界的客户端可以向集群提交一些对文件系统修改的一些操作(创建目录,删除目录,上传文件等等),而要求就是节点的每一个节点的数据在任何时候都要保证最终一致(可以不马上一致,但逻辑上最终数据都会一致,所以client的操作顺序肯定需要保证)。服务的方式不光是可读写,而且还提供了订阅机制,也就是说,client告诉集群(实际上是注册到某个节点,一般是Follower)我关注了那个文件(或目录),它只要发生了变化,集群(接受注册的那个Follower)就能立马(其实有一定的时间窗口)通知client发生了什么样的变化。所以从这方面看他更像信号量的机制,所以称之为分布式“锁”。
也就是说最终每个节点都会维护了一份最新而且一致的数据,无论集群发生宕机(整体宕机也算)还是个别机器坏掉,只要client向集群的任意一个节点提交了修改(create,delete,upload file)请求,那么一定不会保证数据丢失,当然你整个机房都被炸掉了那就没办法了...补充一句,可能已经向集群订阅的client接受通知与某client提交修改有一定的时间窗口,延迟嘛,你懂的。
一些可能存在的疑问
选举都考虑那些因素?Leader是不是永远都是拥有最新数据的那个?
要考虑的就是每个节点保存数据的版本,原则上最新的要当选Leader。但是出于容错和性能考虑,可以不必是最新的,只是在某个多数派中是最新就可以了(这尼玛也太随便了吧,随便一个多数派就行么?听我把话说完~)。说到这,有人就搞不懂了,数据不是最新就能当选Leader?没错!因为你启动集群后不能保证拥有最新数据的节点启动成功了;那如果成功了呢?那也没这个必要!如果它启动的慢了影响大家的进度怎么办,而且如果在集群服务之前,拥有最新数据的节点只要被Leader发现,那么Leader也会善解人意的从这个节点上同步最新数据,然后分发给每个Follower。这就是为什么Zookeeper在提出当选Leader前要等待200ms。其实等多长时间要看你的需求,这没有办法太绝对。正如有些人为了爱情可以苦等一辈子,有些人牵牵手就像旅游~麻痹的又不正经了,原谅我吧~
为啥能够实现分布式的观察者模式?(那个订阅机制是怎么实现的)
其实这个是通过客户端异步实现的。大家肯定很熟悉本地的观察者模式,观察者向发布者注册后,发布者只要更新了观察者所关注的信息就会直接调用观察者的引用,从而产生一个观察者方法的回调。其实分布式的观察者模式实现的关键在客户端(观察者)这里。传统的方式就是轮询,服务端的数据变化了,就可以做其他事情了。但是现在需要自动的通知,所谓通知就是回调client端的一个函数去处理返回的结果即可。大家可以参考我写的这篇文章:利用thrift实现一个非阻塞带有回调机制的客户端。
为何无论怎么宕机,出故障都能保证数据最终一致切完整?
其实这并不是绝对的,只能尽可能的把丢失数据的概率减少到最少,并且尽可能的让集群对外服务。
理论上来讲,只要有一个节点有最新数据,并且已经持久化到磁盘,磁盘还没坏,那么就一定能让整个集群恢复到最新的状态,只是时间长短的问题。所以本着这样的思路,我们就采用了Paxos的理念。另外,只要集群总数存活的节点数量超过一半,就能构成一个多数派,所以集群就能够对外提供服务。
文件系统数据内存和磁盘是如何交换的?
这个问题比较实在。其实现机制很简单,定期的把内存数据序列化到磁盘上形成快照,而且每执行一个操作之前就先写日志。这样我们就能以快照作为时间节点并利用日志去恢复数据了。有人可能会说“尼玛,这么粗暴!直接把文件系统全部序列化到磁盘了?”。是的!因为所谓“文件系统”并不是你想象中的那种服务器上的文件系统,它只是利用文件系统这种数据结构去管理少量的数据,比如配置文件,命名空间(就是一些目录结构),或者写个ip在某个目录下这种。定位不同,所以设计越简单越好。
更有思维缜密的同学问道,如果Leader接受完收据,还没同步到Follower却挂了,那么剩下的Follower组成新的集群,后续一来新的操作,不就漏掉了之前的操作了吗?
别忘了我们有数据版本这一说,数据的操作版本号必须是连续的,如果不连续说明中间漏掉了操作,所以,这就需要客户端可以缓存操作以便重试。如果有人问,如果客户端也挂了呢?缓存的操作不就没了吗?答客户端没接到成功它自己知道,只要重新读取任务就行了,所以多虑啦!另外补充一句,发生任何灾难性的情况都有可能,只不过是概率问题。我们能做的就是尽最大可能把能避免的问题避免,正如前面所说的,所有节点都坏了,那肯定完了。你咋不说世界末日呢,别说机房数据了,自己本本上备份的种子也没了呢!
【分布式协调器】Paxos的工程实现-cocklebur简介(一)的更多相关文章
- 【分布式协调器】Paxos的工程实现-cocklebur简介(二)
Cocklebur集群的工作原理 在集群正常工作时,整个集群只会有一个Leader,其他都是Follower.Client可以注册到某个Follower,当然也可以注册到Leader,为了减轻Lead ...
- 中小研发团队架构实践之分布式协调器.Net版ZooKeeper
原文:中小研发团队架构实践之分布式协调器.Net版ZooKeeper 一.ZooKeeper是什么 Apache ZooKeeper是由Apache Hadoop的子项目发展而来,于2010年11月 ...
- 中小研发团队架构实践之分布式协调器ZooKeeper
一.ZooKeeper是什么 Apache ZooKeeper是由Apache Hadoop的子项目发展而来,于2010年11月正式成为了Apache的顶级项目. ZooKeeper是一个开放源代码 ...
- 【分布式协调器】Paxos的工程实现-cocklebur选举
其实整个项目中一个最主要的看点就是选举算法,而这部分也是逻辑最复杂最难理解的部分.不同的实现在不同的场景下的策略也不尽相同,而且场景非常之多.接下来我们一起来看一下Cocklebur的实现思路. 一个 ...
- 【分布式协调器】Paxos的工程实现-Cocklebur状态转移
集群中的主机经过选举过程由Looking状态变为了Leadering或Following状态.而这些状态之间转移的条件是什么呢?先来个直观的,上状态图. 图 4.1 Cocklebur选举过程中的状态 ...
- 中小型研发团队架构实践:分布式协调服务ZooKeeper
一.ZooKeeper 是什么 Apache ZooKeeper 由 Apache Hadoop 的子项目发展而来,于 2010 年 11 月正式成为了 Apache 的顶级项目. 相关厂商内容 优秀 ...
- 【分布式协调】之理解paxos
感叹一下 不得不说近几年国内软件行业发生了巨大的变化,之前几乎所有应用都围绕桌面展开,而近几年很多让人神魂颠倒的关键词一个接一个的映入眼帘:web2.0.移动应用.云计算.大数据.互联网的浪潮一波接着 ...
- SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)
原文:SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC) 在可更新订阅中,在订阅设置更新方法,将 "排队更新" 设置为 " ...
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
随机推荐
- Sql Server之旅——第三站 解惑那些背了多年聚集索引的人
说到聚集索引,我想每个码农都明白,但是也有很多像我这样的猥程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引, 然后又扯到了目录查找来帮助读者记忆....问题就在这里,我们不是学文科,, ...
- HTML5游戏开发引擎,初识CreateJS
CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...
- javascript 基础教程[温故而知新一]
子曰:“温故而知新,可以为师矣.”孔子说:“温习旧知识从而得知新的理解与体会,凭借这一点就可以成为老师了.“ 尤其是咱们搞程序的人,不管是不是全栈工程师,都是集十八般武艺于一身.不过有时候有些知识如果 ...
- Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结
Exercise 1:Linear Regression---实现一个线性回归 关于如何实现一个线性回归,请参考:http://www.cnblogs.com/hapjin/p/6079012.htm ...
- 【转】分布式数据层 TDDL 来自:阿里巴巴
淘宝根据自己的业务特点开发了TDDL(Taobao Distributed Data Layer 外号:头都大了 ©_Ob)框架,主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制,它是一个 ...
- Linux 开机自启动脚本详解
以kibana为例 以下为skibana名称的脚本内容 #!/bin/bash #chkconfig: 2345 80 90 #description:kibana kibana=" ...
- Java里面的转义字符
转义字符是指,用一些普通字符的组合来代替一些特殊字符,由于其组合改变了原来字符表示的含义,因此称为“转义”. 常见的转义字符: \n 回车(\u000a) \t 水平制表符(\u0009) \b 空格 ...
- Mysql数据库笔记
出错记录: 1.mysql服务启动不了,进程意外终止 1067 错误显示:can not connect to mysql server on local hosts(1061) 解决方法 ...
- python 缩进语法,优缺点
Python的语法比较简单——采用缩进方式 缩进有利有弊: 好处之一是强迫你写出格式化的代码,但没有规定缩进是几个空格还是Tab.按照约定俗成的管理,应该始终坚持使用4个空格的缩进. 其二是强迫你写出 ...
- ORA-00020: No more process state objects available故障一例
今天公司一大早收到通知,昨天数据库数据未生成.当时查看跑批的日志,发现平常只需运行半个小时的过程,今天整整运行了7个小时(明显存在问题),导致后续数据正常时间读取失败.为了了解起因,查看了oracle ...