paxos算法:
basic paxos(读帕克索斯)实现的,另外一种是基于fast paxos算法。

1)问题描述
分布式中有这么一个疑难问题,客户端向一个分布式集群的服务端发出一系列更新数据的消息,由于分布式集群中的各个服务端节点是互为同步数据的,所以 运行完客户端这系列消息指令后各服务端节点的数据应该是一致的,但由于网络或其他原因,各个服务端节点接收到消息的序列可能不一致,最后导致各节点的数据 不一致。举一个实例来说明这个问题,下面是客户端与服务端的结构图:


当client1、client2、client3分别发出消息指令A、B、C时,Server1~4由于网络问题,接收到的消息序列就可能各不相 同,这样就可能由于消息序列的不同导致Server1~4上的数据不一致。对于这么一个问题,在分布式环境中很难通过像单机里处理同步问题那么简单,而 Paxos算法就是一种处理类似于以上数据不一致问题的方案。
2)算法本身
算法本身我就不进行完整的描述和推导,网上有大量的资料做了这个事情,但我学习以后感觉莱斯利·兰伯特(Leslie Lamport,paxos算法的奠基人,此人现在在微软研究院)的Paxos Made Simple 是学习paxos最好的文档,它并没有像大多数算法文档那样搞一堆公式和数学符号在那里吓唬人,而是用人类语言让你搞清楚Paxos要解决什么问题,是如 何解决的。这里也借机抨击一下那些学院派的研究者,要想让别人认可你的成果,首先要学会怎样让大多数人乐于阅读你的成果,而这个描述Paxos算法的文档 就是我们学习的榜样。
言归正传,透过Paxos算法的各个步骤和约束,其实它就是一个分布式的选举算法,其目的就是要在一堆消息中通过选举,使得消息的接收者或者执行者 能达成一致,按照一致的消息顺序来执行。其实,以最简单的想法来看,为了达到大伙执行相同序列的指令,完全可以通过串行来做,比如在分布式环境前加上一个 FIFO队列来接收所有指令,然后所有服务节点按照队列里的顺序来执行。这个方法当然可以解决一致性问题,但它不符合分布式特性,如果这个队列down掉 或是不堪重负这么办?而Paxos的高明之处就在于允许各个client互不影响地向服务端发指令,大伙按照选举的方式达成一致,这种方式具有分布式特 性,容错性更好。
说到这个选举算法本身,可以联想一下现实社会中的选举,一般说来都是得票者最多者获胜,而Paxos算法是序列号更高者获胜,并且当尝试提交指令者 被拒绝时(说明它的指令所占有的序列号不是最高),它会重新以一个更好的序列参与再次选举,通过各个提交者不断参与选举的方式,达到选出大伙公认的一个序 列的目的。也正是因为有这个不断参与选举的过程,所以Paxos规定了三种角色(proposer,acceptor,和 learner)和两个阶段(accept和learn),三种角色的具体职责和两个阶段的具体过程就见Paxos Made Simple ,另外一个国内的哥们写了个不错的PPT ,还通过动画描述了paxos运行的过程。不过还是那句话不要一开始就陷入算法的细节中,一定要多想想设计这些游戏规则的初衷是什么。
Paxos算法的最大优点在于它的限制比较少,它允许各个角色在各个阶段的失败和重复执行,这也是分布式环境下常有的事情,只要大伙按照规矩办事即可,算法的本身保障了在错误发生时仍然得到一致的结果。
3)算法的实现
Paxos的实现有很多版本,最有名的就是google chubby ,不过看不了源码。开源的实现可见libpaxos 。另外,ZooKeeper 也基于paxos解决数据一致性问题,也可以看看它是如果实现paxos的。
4)适用场景
弄清楚paxos的来龙去脉后,会发现它的适用场景非常多,Tim有篇blog《Paxos在大型系统中常见的应用场景》 专门谈这个问题。我所见到的项目里,naming service是运用Paxos最广的领域,具体应用可参考ZooKeeper

一致性哈希算法:

一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。

因此,引入了一致性哈希算法:

把数据用hash函数(如MD5),映射到一个很大的空间里,如图所示。数据的存储时,先得到一个hash值,对应到这个环中的每个位置,如k1对应到了图中所示的位置,然后沿顺时针找到一个机器节点B,将k1存储到B这个节点中。

如果B节点宕机了,则B上的数据就会落到C节点上,如下图所示:

这样,只会影响C节点,对其他的节点A,D的数据不会造成影响。然而,这又会造成一个“雪崩”的情况,即C节点由于承担了B节点的数据,所以C节点的负载会变高,C节点很容易也宕机,这样依次下去,这样造成整个集群都挂了。

为此,引入了“虚拟节点”的概念:即把想象在这个环上有很多“虚拟节点”,数据的存储是沿着环的顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点,如下图所使用:

图中的A1、A2、B1、B2、C1、C2、D1、D2都是虚拟节点,机器A负载存储A1、A2的数据,机器B负载存储B1、B2的数据,机器C负载存储C1、C2的数据。由于这些虚拟节点数量很多,均匀分布,因此不会造成“雪崩”现象。

(五)实际项目中分布式系统设计涉及算法总结相关推荐

  1. 最近项目中遇到的一个算法挑战

    在企业信息化进程中,各类智能化运算在不断挑战着我们,最近又遇到一个应用,归纳一下需要实现以下算法 //算法设计         /*          *计算是否存在值X1,X2,...,Xm,使等式 ...

  2. day82_淘淘商城项目_15_项目总结 + 项目中的问题_匠心笔记

    项目总结 第一天 1.电商行业的背景,b2b.b2c.b2b2c.c2c.o2o2. 2.系统的架构.基于SOA的架构. 3.工程搭建.使用maven管理工程. 4.svn的使用. 第二天 1.ssm ...

  3. MySQL基本增删改查以及搭配node在项目中的操作

    目录 一.数据库简单介绍 二.进一步了解MySQL 三.安装MySQL并配置 四.使用SQL语句管理数据库 1.SQL语言中的注释 2.SELECT查询语句 3.INSERT INTO插入语句 4.U ...

  4. 如何在项目中利用 git 提高工作效率

    文/陈灵 华为无线网络产品线五级软件专家,在大型软件架构设计.性能优化方面有丰富的成功经验,多次荣获公司/产品线优秀软件架构实践表彰. 华为的明星博主,原创软件技术博客超过一百篇,愈十万字,促进了软件 ...

  5. Vue - 项目中使用iconfont(阿里图标库)

    项目中如何使用iconfont(阿里图标库) 一. 登陆iconfont官网: https://www.iconfont.cn/ 二. 创建一个图标项目 1.点击"图标管理"子目录 ...

  6. 团队作业第五次—项目系统设计与数据库设计

    作业描述 所属课程 软件工程1916|W(福州大学) 作业要求 团队作业第五次-项目系统设计与数据库设计 团队名称 待就业六人组 作业目标 宏观的对系统的整体结构设计,并在此基础上,进行数据库设计 系 ...

  7. (五)Redis在项目中应用

    目录 1. redis实现分布式锁 2. 订单或任务缓存 3. Redis和DB数据一致性 4. 大并发Redis穿透直接访问DB 5. 接口限流器 参考: Redis在项目中的运用总结 1. red ...

  8. xgboost简单介绍_好文干货|全面理解项目中最主流的集成算法XGBoost 和 LightGBM

    点击上方"智能与算法之路",选择"星标"公众号 第一时间获取价值内容 本文主要介绍基于 Boosting 框架的主流集成算法,包括 XGBoost 和 Ligh ...

  9. 设计模式在项目中的应用案例_项目化学习案例(五):菊花种植的秘密——项目化学习在菊种植课程中的应用设计案例...

    △ 戳蓝字,关注我△ 让孩子像科学家一样思考,像工程师一样解决问题. [引言] 今天推荐的是陈素平名师工作室陈芳芳老师分享的案例是基于农村学校拓展课程"一菊一世界"系列课程,以解决 ...

最新文章

  1. MySQL流程控制函数
  2. C#.net调用动态库dll注意事项
  3. Groovy预览--文本处理
  4. linux 几个文件夹作用,linux下每一个文件夹的作用.docx
  5. Flutter布局锦囊---简单的应用栏
  6. Ajax+PHP快速上手及简单应用
  7. 秒杀系统架构分析与实战(14155字,26图)
  8. listview mysql源码_用ListView实现对数据库的内容显示
  9. 2008 iis php mysql_2008服务器配置iis7+php+mysql
  10. 最新谷歌本地搜索api
  11. 新浪igame连连看游戏截图
  12. 微信小程序选项卡原理
  13. arduino编码器计数_基于Arduino开发环境的光电编码器检测仪设计方案
  14. java将英语单词进行词性分类排序_史上最全讲解,必须牢记的英语十类词性分类及用法!(上)...
  15. Google guava之Table简介说明
  16. iOS 通过数字拼音快速搜索股票
  17. 谷歌浏览器翻译插件使用不了,替代品 AnyTranslation
  18. ROS学习总结一:talker and listener
  19. [MTK] 平板项目,进入工程模式
  20. PHP解析错误 PHP Parse error: syntax error, unexpected '[' in

热门文章

  1. VS Code Remote Development插件的需求分析和逆向工程
  2. 用宏实现Excel批量打印第一页工作表
  3. sum, group by
  4. 关于 sum+=i与sum=sum+i
  5. 人工智能常用Python模块
  6. hibernate中联合主键的定义方式
  7. ubuntu 安装 Clang/LLVM 15.0.4
  8. 海康威视摄像头播放录像视频(RTSP协议)
  9. 你真的了解WIFI吗?
  10. python3如何使用边缘分割图像_python – 基于边缘像素图的图像分割