分布式理论(四) – 3PC协议

前言 由于二阶段提交存在着诸如同步阻塞、单点问题、脑裂等缺陷。所以,研究者们在二阶段提交的基础上做了改进,提出了三阶段提交。 与两阶段提交不同的是,三阶段提交有两个改动点。 引入超时机制 – 同时在协调者和参与者中都引入超时机制。 在第一阶段和第二阶段中插入一个准备阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。 正文 1. 三阶段提交的定义 三阶段提交(Three-phase commit),也叫三阶段提交协议(Three-phase commit protocol),是二阶段提交(2PC)的改进版本。 所谓的三个阶段分别是:询问,然后再锁资源,最后真正提交。 第一阶段:CanCommit 第二阶段:PreCommit 第三阶段:Do Commit 2. 三阶段提交的过程 2.1. 阶段一:CanCommit 3PC的CanCommit阶段其实和2PC的准备阶段很像。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。 a. 事务询问 协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。 b. 响应反馈 参与者接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态;否则反馈No。 2.2. 阶段二:PreCommit 协调者在得到所有参与者的响应之后,会根据结果执行2种操作:执行事务预提交,或者中断事务。 2.2.1. 执行事务预提交 a. 发送预提交请求 协调者向所有参与者节点发出 preCommit 的请求,并进入 prepared 状态。 b. 事务预提交 参与者受到 preCommit 请求后,会执行事务操作,对应 2PC 准备阶段中的 “执行事务”,也会 Undo 和 Redo 信息记录到事务日志中。 c.… Continue reading 分布式理论(四) – 3PC协议

Published
Categorized as 分布式

分布式理论(三) – 2PC协议

前言 由于BASE理论需要在一致性和可用性方面做出权衡,因此涌现了很多关于一致性的算法和协议。其中比较著名的有二阶提交协议(2 Phase Commitment Protocol),三阶提交协议(3 Phase Commitment Protocol)和Paxos算法。 本文要介绍的2PC协议,分为两个阶段提交一个事务。并通过协调者和各个参与者的配合,实现分布式一致性。 两个阶段事务提交协议,由协调者和参与者共同完成。 角色 XA概念 作用 协调者 事务管理器 协调各个参与者,对分布式事务进行提交或回滚 参与者 资源管理器 分布式集群中的节点 正文 1. 分布式事务 分布式事务是指会涉及到操作多个数据库的事务,其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。 分布式事务处理的关键是: 需要记录事务在任何节点所做的所有动作; 事务进行的所有操作要么全部提交,要么全部回滚。 2. XA规范 2.1. XA规范的组成 XA规范是由 X/Open组织(即现在的 Open Group )定义的分布式事务处理模型。 X/Open DTP 模型( 1994 )包括: 应用程序( AP ) 事务管理器( TM ):交易中间件等 资源管理器( RM ):关系型数据库等 通信资源管理器( CRM ):消息中间件等 2.2. XA规范的定义 XA规范定义了交易中间件与数据库之间的接口规范(即接口函数),交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。而XA接口函数由数据库厂商提供。… Continue reading 分布式理论(三) – 2PC协议

Published
Categorized as 分布式

分布式理论(二) – BASE理论

前言 BASE理论是由eBay架构师提出的。BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网分布式系统实践的总结,是基于CAP定律逐步演化而来。其核心思想是即使无法做到强一致性,但每个应用都可以根据自身业务特点,才用适当的方式来使系统打到最终一致性。 正文 1. CAP的3选2伪命题 实际上,不是为了P(分区容错性),必须在C(一致性)和A(可用性)之间任选其一。分区的情况很少出现,CAP在大多时间能够同时满足C和A。 对于分区存在或者探知其影响的情况下,需要提供一种预备策略做出处理: 探知分区的发生; 进入显示的分区模式,限制某些操作; 启动恢复过程,恢复数据一致性,补偿分区发生期间的错误。 2. BASE理论简介 BASE理论是Basically Available(基本可用),Soft State(软状态)和Eventually Consistent(最终一致性)三个短语的缩写。 其核心思想是: 既是无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。 3. BASE理论的内容 基本可用(Basically Available) 软状态(Soft State) 最终一致性(Eventually Consistent) 下面展开讨论: 3.1. 基本可用 什么是基本可用呢?假设系统,出现了不可预知的故障,但还是能用,相比较正常的系统而言: 响应时间上的损失:正常情况下的搜索引擎0.5秒即返回给用户结果,而基本可用的搜索引擎可以在2秒作用返回结果。 功能上的损失:在一个电商网站上,正常情况下,用户可以顺利完成每一笔订单。但是到了大促期间,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。 3.2. 软状态 什么是软状态呢?相对于原子性而言,要求多个节点的数据副本都是一致的,这是一种“硬状态”。 软状态指的是:允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。 3.3. 最终一致性 上面说软状态,然后不可能一直是软状态,必须有个时间期限。在期限过后,应当保证所有副本保持数据一致性,从而达到数据的最终一致性。这个时间期限取决于网络延时、系统负载、数据复制方案设计等等因素。 而在实际工程实践中,最终一致性分为5种: 3.3.1. 因果一致性(Causal consistency) 因果一致性指的是:如果节点A在更新完某个数据后通知了节点B,那么节点B之后对该数据的访问和修改都是基于A更新后的值。于此同时,和节点A无因果关系的节点C的数据访问则没有这样的限制。 3.3.2. 读己之所写(Read your writes) 读己之所写指的是:节点A更新一个数据后,它自身总是能访问到自身更新过的最新值,而不会看到旧值。其实也算一种因果一致性。 3.3.3. 会话一致性(Session consistency) 会话一致性将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现… Continue reading 分布式理论(二) – BASE理论

Published
Categorized as 分布式

分布式理论(一) – CAP定理

前言 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这三个基本需求,最多只能同时满足其中的2个。 正文 1. CAP原则简介 选项 描述 Consistency(一致性) 指数据在多个副本之间能够保持一致的特性(严格的一致性) Availability(可用性) 指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应(不保证获取的数据为最新数据) Partition tolerance(分区容错性) 分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障 什么是分区? 在分布式系统中,不同的节点分布在不同的子网络中,由于一些特殊的原因,这些子节点之间出现了网络不通的状态,但他们的内部子网络是正常的。从而导致了整个系统的环境被切分成了若干个孤立的区域,这就是分区。 2. CAP原则论证 如图所示,是我们证明CAP的基本场景,网络中有两个节点N1和N2,可以简单的理解N1和N2分别是两台计算机,他们之间网络可以连通,N1中有一个应用程序A,和一个数据库V,N2也有一个应用程序B和一个数据库V。现在,A和B是分布式系统的两个部分,V是分布式系统的数据存储的两个子数据库。 在满足一致性的时候,N1和N2中的数据是一样的,V0=V0。 在满足可用性的时候,用户不管是请求N1或者N2,都会得到立即响应。 在满足分区容错性的情况下,N1和N2有任何一方宕机,或者网络不通的时候,都不会影响N1和N2彼此之间的正常运作。 如图所示,这是分布式系统正常运转的流程,用户向N1机器请求数据更新,程序A更新数据库V0为V1。分布式系统将数据进行同步操作M,将V1同步的N2中V0,使得N2中的数据V0也更新为V1,N2中的数据再响应N2的请求。 根据CAP原则定义,系统的一致性、可用性和分区容错性细分如下: 一致性:N1和N2的数据库V之间的数据是否完全一样。 可用性:N1和N2的对外部的请求能否做出正常的响应。 分区容错性:N1和N2之间的网络是否互通。 这是正常运作的场景,也是理想的场景。作为一个分布式系统,它和单机系统的最大区别,就在于网络。现在假设一种极端情况,N1和N2之间的网络断开了,我们要支持这种网络异常。相当于要满足分区容错性,能不能同时满足一致性和可用性呢?还是说要对他们进行取舍? 假设在N1和N2之间网络断开的时候,有用户向N1发送数据更新请求,那N1中的数据V0将被更新为V1。由于网络是断开的,所以分布式系统同步操作M,所以N2中的数据依旧是V0。这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据V1,怎么办呢? 这里有两种选择: 第一:牺牲数据一致性,保证可用性。响应旧的数据V0给用户。 第二:牺牲可用性,保证数据一致性。阻塞等待,直到网络连接恢复,数据更新操作M完成之后,再给用户响应最新的数据V1。 这个过程,证明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。 3. CAP原则权衡 通过CAP理论,我们知道无法同时满足一致性、可用性和分区容错性这三个特性,那要舍弃哪个呢? 3.1. CA without P 如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA。 3.2. CP without A 如果不要求A(可用),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式。 3.3. AP wihtout C 要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。 小结 对于多数大型互联网应用的场景,主机众多、部署分散。而且现在的集群规模越来越大,所以节点故障、网络故障是常态。这种应用一般要保证服务可用性达到N个9,即保证P和A,只有舍弃C(退而求其次保证最终一致性)。虽然某些地方会影响客户体验,但没达到造成用户流程的严重程度。… Continue reading 分布式理论(一) – CAP定理

Published
Categorized as 分布式

浅谈Linux内存管理那些事儿

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 白日梦蓝 刺猬乐队 – 白日梦蓝 1 前言 内存管理是Linux内核中非常重要的部分,今天和大家一起学习一下。 当我们要学习一个新知识点时,比较好的过程是先理解出现这个技术点的 背景原因,同期其他解决方案,新技术点解决了什么问题以及它存在哪些不足和改进之处,这样整个学习过程是 闭环 的,个人觉得这是个很好的学习思路。 凡事都是相通的,计算机学科的一些问题在现实生活中都可以找到原型,所以我觉得计算机科学家大部分都是善于观察生活并总结归纳的。人类社会就是一台复杂的机器,其中充满了机制和规则,所以有时候跳进代码海洋不如先回到生活之中,寻找原型再探究代码,可能理解会更深刻。 linux内存管理卷帙浩繁,本文只能层层递进地带你领略冰山轮廓,通过本文你将了解到以下内容: 为什么需要管理内存 linux段页管理机制 内存碎片的产生机理 伙伴系统的基本原理 伙伴系统的优势和不足 slab分配器的基本原理 2 为什么需要管理内存 老子的著名观点是无为而治,简单说就是不过多干预而充分依靠自觉就可以有条不紊地运作,理想是美好的,现实是残酷的。 在linux系统中如果以一种原始简单的方式管理内存是存在一些问题的,我们来看几个场景。 2.1 内存管理的问题 进程空间隔离问题 假如现在有ABC三个进程运行在linux的内存空间,设定os给进程A分配的地址空间是0-20M 进程B地址空间30-80M,进程C地址空间90-120M,如图:   在某些时候程序空间的访问可能出现问题,比如进程A访问了属于进程B的空间,进程B访问了属于进程C的空间,甚至修改了空间的值,这样就会造成混乱和错误,所以实际中是不允许这种情况发生的。   内存效率和内存不足问题 机器的内存是有限资源,而进程数量是无法确定的,如果在某些时候已经启动的进程占据了所有内存空间,此时就无法启动新进程了,因为没有新内存可分配了,但是我们观察到已经启动的进程有时候是在睡大觉,也就是给了内存也不用,这样效率确实是有点低,所以我们需要一个管理员把不用的内存倒腾出来,另外连续内存实在是很珍贵,很多时候我们没法有效及时地分配连续内存,因此虚拟化和离散化可能会有效提高内存的使用率。   程序定位调试和编译运行问题 由于程序运行时的位置时不确定的,我们在定位问题、调试代码、编译执行时都会存在很多问题,我们希望每个进程有一致且完整的地址空间,同样的起始位置放置了堆、栈以及代码段等,从而简化编译和执行过程中的 linker 链接器、loader 加载器的使用。 2.2 虚拟地址空间 为了解决上述的一些问题,linux系统引入了虚拟空间的概念,虚拟化的出现和硬件有密不可分的联系,可以说是软硬件组合的结果,虚拟地址空间就是在程序和物理空间所增加的中间层,这也是内存管理的重点。   磁盘 disk 作为一种大容量的存储也作为”内存”的一部分参与程序的运行,内存管理系统会将不常用非活跃内存进行页面换出,可以认为内存是磁盘的缓存,内存中保留了活跃的数据,从而间接扩展了有限的物理内存空间,这部分空间称为虚拟内存是相对于物理内存而言的。 3.段页管理机制 本文并不深入地将分段管理内存和分页管理内存,因为将这些细节的优秀文章很多,感兴趣的使用搜索引擎一键即达。 段页机制也不是一蹴而就的,经历了单纯物理分段、单纯分页、单纯逻辑分段等阶段,最终演进出来了分段和分页结合的内存管理方式,段页结合获得了分段和分页的优势也避免了单一模式的弊端,是一种比较好的管理模式。 本文对于段页管理机制只想通俗地说明一些概念,段页管理机制是分段式管理和分页式管理的组合,段式管理是逻辑上的管理方式,分页管理是偏物理上的管理方式。 计算机里面的一些技术和实现都可以在现实生活中找到缩影,所谓艺术和科技源自生活大概就是这个意思吧。 举个栗子:在进行居民户籍管理时都会有区县市的概念,但是实际上并没有这种实体,都是逻辑上的,增加了这些行政单位之后可以让地址管理更加直接。 对于我们居民来说唯一的实体就是自己的房子住所,这是物理上的单位,是真实存在的,这也是最基本的单位。 对比linux段页时管理来说,段是逻辑上的单位相当于区县市的概念,页是物理上的单位相当于小区/房屋的概念,这样就方便很多。 多级页表也很好理解,总的物理内存假如有4GB,页大小为4KB,那么就总共有2^20个页,数量还是非常大的,这样编号来建立索引寻址比较不方便,所以引入多级页表,来减少存储便于管理。 段页机制加持下的逻辑地址和物理地址的映射关系简图,也就是虚拟地址到物理地址的对应关系:… Continue reading 浅谈Linux内存管理那些事儿

高并发基石|深入理解IO复用技术之epoll

1.写在前面 又到周六了,不过这周有点忙新文章还没有写,为了不跳票,就想着把早期还不错的文章,重新排版修改发一下,因为当时读者很少,现在而言完全可以当作一篇新文章(有种狡辩的意思)… 今天一起来学习一下高并发实现的的重要基础:I/O复用技术 & epoll原理。 通过本文你将了解到以下内容: IO复用的概念 epoll出现之前的IO复用工具 epoll三级火箭 epoll底层实现 ET模式&LT模式 一道腾讯面试题 epoll惊群问题 温馨提示:技术文章涉及很多细节都会比较晦涩,反复琢磨才能掌握。 2.初识复用技术和IO复用 在了解epoll之前,我们先看下复用技术的概念和IO复用到底在说什么? 2.1 复用概念和资源特性 2.1.1 复用的概念 复用技术 multiplexing 并不是新技术而是一种设计思想,在通信和硬件设计中存在频分复用、时分复用、波分复用、码分复用等,在日常生活中复用的场景也非常多,因此不要被专业术语所迷惑。 从本质上来说,复用就是为了解决有限资源和过多使用者的不平衡问题,从而实现最大的利用率,处理更多的问题。 2.1.2 资源的可释放 举个例子:不可释放场景:ICU 病房的呼吸机作为有限资源,病人一旦占用且在未脱离危险之前是无法放弃占用的,因此不可能几个情况一样的病人轮流使用。 可释放场景:对于一些其他资源比如医护人员就可以实现对多个病人的同时监护,理论上不存在一个病人占用医护人员资源不释放的场景。 所以我们可以想一下,多个 IO 共用的资源(处理线程)是否具备可释放性? 2.1.3 理解IO复用 I/O的含义:在计算机领域常说的IO包括磁盘 IO 和网络 IO,我们所说的IO复用主要是指网络 IO ,在Linux中一切皆文件,因此网络IO也经常用文件描述符 FD 来表示。 复用的含义:那么这些文件描述符 FD 要复用什么呢?在网络场景中复用的就是任务处理线程,所以简单理解就是多个IO共用1个处理线程。 IO复用的可行性:IO请求的基本操作包括read和write,由于网络交互的本质性,必然存在等待,换言之就是整个网络连接中FD的读写是交替出现的,时而可读可写,时而空闲,所以IO复用是可用实现的。 综上认为:IO复用技术就是协调多个可释放资源的FD交替共享任务处理线程完成通信任务,实现多个fd对应1个任务处理线程的复用场景。 现实生活中IO复用就像一只边牧管理几百只绵羊一样: 图片来自网络:多只绵羊共享1只边牧的管理 2.1.4 IO复用的出现背景 业务需求是推动技术演进的源动力。 在网络并发量非常小的原始时期,即使 per req… Continue reading 高并发基石|深入理解IO复用技术之epoll

Published
Categorized as 网络

浅谈分布式系统一致性问题(一)

0.写在前面 前几天在pyq发起了约稿,分布式一致性问题的选题呼声最高,分布式系统的内容是非常庞杂的,所以我们从其中几个重点的部分切入,慢慢展开。 今天重点来一起学习分布式系统一致性问题,不过内容比较多需要分几次写完。 1.为什么要学分布式 作为后端从业人员,我们在找工作写简历的时候除了高并发经验,一般还会写上自己熟悉|了解|掌握|精通分布式系统,所以高并发和分布式大多是成对出现的。 在拉勾上搜了个后端岗位: 分布式系统是个多金的知识点,那还不抓紧行动! 2. 熵增的分布式系统 关于什么是分布式系统,有很多文章介绍,其实这个并不难理解,大白话讲就是:工厂活多了一个人撑不住,那就多找些工人一起干,要让这么多人为了一个目标干得快干得好,就需要一些规矩和套路,否则就乱了。 从实践来看分布式系统属于重要的架构模式,对于互联网工程架构的演进,简单提一下为什么会出现分布式系统以及什么是分布式系统: 业务量的迅速增大,普通的单机系统无法满足要求,要么垂直扩展升级机器硬件,要么水平扩展堆廉价服务器,这也是主流可以想到的解决方法,目前来看互联网领域选择了后者-水平扩展。 水平扩展机器多机房部署升级服务集群规模来应对业务的增长,也就出现了分布式系统,这些分布式系统中的物理节点可能是多机房多网络场景部署的,相互之间通过网络进行通信和协作。 分布式系统就是为了解决巨大业务量和数据量而生的,但是庞大数量的节点来一起正确有序的完成共同的目标是需要理论和实践来锤打的,这也是分布式系统的重点内容。 一般我们常接触的分布式系统包括两大类:分布式存储和分布式计算。 分布式系统那么多机器要一起协调去完成任务也不是一件容易的事情,所以我们通常认为分布式系统是个熵增过程。 熵是描述一个系统内在混乱程度的物理量,对于一个宏观熵看孤立的系统来说,在没有外力干预做功的前提下,系统内在混乱程度是会不断增加的,也就是熵是增加的。 为了让系统保持有序就必须对其进行外力干涉,对于分布式系统而言,我们必须使用相应的策略和算法使整个系统保持有序和正确,所以认为分布式系统是个熵增过程。 这个并不难理解,就像我们为了保持房屋整洁,定期必须打扫,要不然就乱成一锅粥了。 如果对于系统不加以控制和干预,系统将自主走向混乱和无序。 3.分布式一致性问题的理解 分布式一致性到底是什么一致? 分布式的一致性可以表现在很多方面,这些都是个性问题,然而无论这些个性问题有多少,任何行为和状态的展示必然是以数据为基础的,所以这些个性的一致性问题最终都会映射到一个共性问题—分布式数据的一致性。 分布式系统中拥有很多独立的节点,这些节点一般来说可以独立进行存储和计算任务,这两项是最主要的任务类型,本质上计算和存储的过程仍然是围绕数据展开的,所以最终还是数据一致性。 在中心化结构中,存在管理节点和任务节点的区别,也就是每个节点的权利和义务是不一样的,管理节点可能负责分配任务给下属节点和收集计算结果等,总体承担协调者的角色,任务节点主要是承接任务,这样容易出现管理节点的单点问题。 在去中心化的结构中,各个节点的权利和义务是相同的,尽管没有单独指定领导者,在实际的运行中仍然会选举出领导者和failover动态更新领导者的问题,完全的去中心化系统并不多,相比中心化系统来说,去中心系统更加扁平也更加稳定,像Redis官方集群就是去中心化的实现,任何一个节点的故障都不会带来特别大的问题,因为节点是平等的。 无论在中心化还是去中心化的分布式系统中,任何一个节点的计算和存储结果都会对其他节点产生影响,这些独立的节点通过基础和特定的网络协议进行协作,从而形成一个整体。 4. 严格意义的数据一致性 经过前面的一些铺垫,我们开始重点部分的学习-分布式系统数据一致性问题。 我们必须要有个共识:严格意义上的分布式数据一致性是不存在的。 为啥不存在呢? 在分布式系统中数据存储是多节点主从备份的,一般做成读写分离,当客户端将数据通过主库的代理写入之后,在极其短暂的瞬间,主节点的数据是无法复制到从节点的,这个瞬间其他客户端读取到的从库数据都是旧数据。 聪明的读者盆友们可以体会一下瞬间这个词,当然你可以认为这是相对论的范畴,从物理角度去看可能更能体会。 我们以redis主从节点之间的数据复制来看同步复制和异步复制场景下的数据一致性问题: 一般来说,为了保证服务的高可用,主从节点的数据复制是异步的,因为同步复制延时无法保证,当然有的场景也是同步复制的,这样整体延时是无法保证的,假如是一主多从就更无法保证了同步复制的延时了。 所以我们不讨论严苛意义上的数据一致性,而是研究在我们认为可以接受的时间长度下的数据一致性问题,也就是在自身环境约束下的数据一致性。 单机系统的一致性和事务都是比较容易达到的,在分布式系统中由于所有节点的交互都要通过网络来实现,网络必然存在不稳定并且庞大系统中的单节点稳定性也是需要考虑的。 前面这段话,读起来云里雾里,我想表达的意思是:不要过分把对单机系统中的数据一致性要求照搬到分布式系统中,因为两者的约束不一样,我们要合理分析从而让分布式系统的一致性尽量接近单机系统。 solo和团战毕竟是不一样的,典型的《倚天屠龙记》中张无忌要去少林寺救谢逊,但是遇上的少林三位神僧渡厄、渡难、渡劫已经坐禅几十年,三人合一登峰造极,实在太难了,这也是优秀分布式系统的顶峰吧… 5.CAP理论和PACELC理论 我们知道cap理论描述了一致性、可用性、分区容忍性的关系。 在分布式系统中,由于节点物理分布和网络稳定性等原因,分区容忍性P是必然存在的,因此分布式系统必然要建立在分布式网络存在分区P的前提下。 在P的基础上我们对于C和A进行选择,当然并不是说在任何时刻我们都必须C和A二选一,在网络正常的情况下C和A我们也是可以都有的,并且每个系统设计目标也不一样,需要更加实际要求来进行选择。 分布式系统中P是必然存在的,我们在设计系统之初就要对C和A做平衡和选择,在正常的情况下跑出正确的结果是基本要求,在异常情况下仍然可以正常运行是设计重点。 在分布式系统中,我们使用PACELC理论比CAP理论更加合适,因为PACELC理论是CAP理论的扩展,简单来说PACELC理论的表述是这样的: 如果分区partition (P)存在,分布式系统就必须在availability (A) 和consistency (C)之间取得平衡作出选择,否则else (E) 当系统运行在无分区P情况下,系统需要在 latency (L)… Continue reading 浅谈分布式系统一致性问题(一)

Published
Categorized as 分布式

浅谈分布式一致性协议之2PC

1.前言 前面一篇文章和大家一起学习了下分布式系统一致性问题的一些理论,其中重点是理解PACELC理论、BASE理论等问题,让我们对于分布式一致性的重点是什么有一些认识。 在了解分布式一致性的理论和概念之后,后续将和大家一起讨论分布式一致性协议,其中包括:2PC、3PC、Paoxs协议、Raft协议。 篇幅有限,本文重点展开2PC协议,后续文章继续深入。 图(网络)|NASA合成的银河系中心区域图像 2. 单机事务和分布式事务 在聊2PC和3PC之前,我们有必要先了解下单机事务和分布式事务。 事务是一组原子操作,要么全成功要么全失败 All or Nothing,否则就会出现数据混乱,这种需求在金融和电商领域很普遍。 试想你去天猫买了台mac,订单服务、扣款服务、库存服务出现任何一个环节的失败都会带来问题,所以就需要事务来做保证,一荣俱荣一损俱损。 单机事务具备ACID特性,大家都比较喜欢,但是单机的能力毕竟有限,我们常常必须在分布式场景下同样完成这一组原子操作,也就是分布式事务。 由于分布式系统中各个子服务是部署在不同的物理节点上,不同交换机、不同机房、不同城市,这样以来,要想像单机系统一样完成这一组原子操作就没那么容易了,因此就出现了很多分布式一致性协议和算法,来解决分布式事务问题保证数据一致性。 分布式系统的各个节点只能依靠网络来进行数据通信,但是网络往往并不完全可靠,同时节点物理故障也时常发生,在这样一个复杂的环境中去保证数据一致性确实不太容易。 3.一致性协议的一些思路 突兀地去学习一个新的协议或者算法往往比较生硬,不如思考一下生活现象,大部分的计算机领域的算法和思想在实际生活中都有映像,又或者说算法来源于生活。 举个栗子:在规模盛大的阅兵仪式中会有陆海空多兵种多方队,为了让命令和节奏准确地下达,我们需要乐曲、指挥、领队、排头、队员等多种角色。整个活动需要在不同角色的相互作用之下,才能让一个数量庞大的个体组成一个整体来完成一个目标。 再举个栗子:2018年5月在西安举行了一场盛大的无人机编组飞行灯光秀,共计1374架无人机组成一个庞大的编组来完成灯光表演,但是还是出现了问题,并未上演完美图案: 图(网络)|西安无人机编组飞行灯光秀 分布式系统也是如此,为了让很多参与的机器节点节奏步调一致,我们就需要不同的角色各司其职,共同完成一项任务,但是仍然困难重重,因为会有网络故障和节点物理故障等问题。 4. 2PC二阶段提交协议基本过程 要理解2PC协议重点在于节点角色分工和两个阶段所执行的动作以及不同情况下的处理逻辑。   2PC协议总体概览 4.1 节点角色 二阶段提交协议将节点分为:协调者和参与者,对于者两种角色,当然你也可以理解为Leader和大头兵。 协调者Leader负责向参与者发送指令,收集参与者反馈,做出提交或者回滚决策 参与者大头兵接收协调者的指令执行事务操作,向协调者反馈操作结果,并继续执行协调者发送的最终指令 4.2 两个阶段 2PC协议分为:准备阶段和提交阶段。 4.2.1 准备阶段 协调者向所有参与者节点发送询问并执行事务的命令,参与者节点收到命令后根据自己的状态执行或者不执行事务,并将动作记录下来,最后将对命令的处理结果反馈给协调者。 图|准备阶段的三个环节 1询问环节:协调者向参与者询问,是否准备好可以执行事务,之后协调者开始等待各参与者的响应,这个环节协调者处于阻塞等待状态。 2处理环节:参与者收到协调者的询问后根据自身情况来决定是否执行事务操作,如果参与者执行事务成功,将Undo和Redo信息记入事务日志,但不提交事务;否则直接返回失败。 3响应环节:当参与者成功执行了事务操作,就反馈yes给协调者,表示事务在本地执行;当参与者没有成功执行事务,就反馈no给协调者,表示事务不可以执行提交,这部分反馈对于协调者决策下个阶段起到非常重要的作用。 4.2.2 准备阶段 协调者根据准备阶段收到的参与者反馈来决定最终提交事务或者中断回滚事务,具体来说,当协调者在准备阶段结束时收到的响应反馈有一个no,那么就中断事务,如果收到的反馈全部是yes就提交事务。 情况一: 提交事务  如果在准备阶段结束时,协调者收到了来自所有参与者的yes反馈,接下来协调者就会向所有参与者发送提交事务指令,具体的过程如下: 步骤1. 协调者向所有参与者发送事务提交消息Commit命令 步骤2. 参与者在收到来自协调者的Commit命令之后,执行事务提交动作,并释放事务期间所有持有的锁和资源,这一步很重要 步骤3. 所有参与者在执行本地事务且释放资源完成后,向协调者发送事务提交确认消息ACK 步骤4. 协调者在收到所有参与者的ACK消息后确认完成本次事务… Continue reading 浅谈分布式一致性协议之2PC

Published
Categorized as 分布式

浅谈分布式系统一致性之3PC协议

一.写在前面 分布式系统一致性专题本期该写 3PC 协议了,上周太忙没有时间更新,就拿了之前的旧文章做了一些调整重发了一下,还望各位读者海涵。 后面大约还有3期:Paxos 协议、Raft 协议等,先预热一下。 温馨提示:本篇文章并不会枯燥,换了个画图工具,对于我这种建筑专业出身的IT狗来说,画图简直是最开心的事情了,所以放心看吧! 图(网络)|猎户座大星云 二.3PC的出现 之前文章中提到了 2PC 协议存在的协调者单点、参与者阻塞超时、网络分区、容错性等问题,这些在某些程度上是做优化和调整的,并不是致命问题。 我们对 2PC 协议的异常情况做了拆解,但是那是个m*n的组合问题,我们尽量去分析主要矛盾,于是发现在协调者和唯一接收指令的参与者都出现不可恢复宕机时,即使后面选举了新的协调者,仍然可能出现数据的不一致性。 3PC 的出现可能是多种因素促成的。 但是基本上可以确定 3PC 将对 2PC 存在的问题进行修正和优化,但是这样并不意味着 3PC 不会引入新的问题。 本文将从 3PC 的协议过程来阐述这两大块内容: 三. 3PC协议的基本过程 3PC协议 Three-Phase-Commit 又称三阶段提交协议,相比 2PC 协议增加了一个阶段,因此我们普遍把 3PC 协议看作是 2PC 协议的改进版本。 3PC 协议将 2PC 协议的准备阶段一分为二,从而形成了三个阶段: 协调者和参与者等待超时情况单独说,先看正常情况的基本过程,要不然容易混淆。 3.1 CanCommit阶段 在2PC准备阶段中,协调者向参与者发送指令后,参与者如果具备执行条件,则获取锁并执行动作,只不过未真正提交,可以认为参与者就差临门一脚了,还得等协调者信号。 如果是 commit 信号那还好,如果是 rollback 信号,那么对于一些本地执行了动作的参与者来说白白浪费了,所以从这个角度来说,2PC 有点激进了,但是这么做也是有原因的,在复杂的网络环境中多一轮交互意味着性能的损耗。 3PC来说更加合理,先由协调者向参与者发送询问信号,兄弟们有档期吗??然后开始收集反馈,相比来说更加轻量。 这个阶段参与者并不真实获取锁占用资源,只是对自身执行事务状态的检查,查看是否具备执行事务的条件,进而回复询问。… Continue reading 浅谈分布式系统一致性之3PC协议

Linux服务端最大并发数是多少?

1. 开场白 在开始今天的文章之前,先抛一个面试题出来: 你接触过的单机最大并发数是多少? 你认为当前正常配置的服务器物理机最大并发数可以到多少? 说说你的理解和分析。 思考几分钟,如果你可以有理有据地说出答案,那确实就不用再往下看了,关上手机去陪陪家人是个不错的选择。 思考几分钟,如果你没有头绪或者对答案不确定,那么你先不用着急关闭页面去玩耍,你应该继续往下看,因为这个问题很不错。 对于后端开发人员来说,并发数往往和技术难度是呈正相关的,实际上也确实如此:体量决定架构。 服务端根据不同业务场景会有不同的侧重点,单纯追求高并发其实并不是根本目的,高可用&稳定性更重要。 所以最终我们的目的是:保证高可用高稳定的基础上追求高并发,降本增效。 高可用&高并发是我们直观感受到的,本质上这是个复杂的系统工程,每个环节都会影响结果,每一块都值得研究和深入。 2. C10K问题和C10M问题 在2000年初的时候,全球互联网的规模并不大,但是当时就已经提出了C10K问题,所谓C10K就是单机1w并发问题,虽然现在不觉得是个难题了,但是这在当初是很有远见和挑战的问题。 C10K问题最早由Dan Kegel发布于其个人站点,原文链接如下: http://www.kegel.com/c10k.html 相关资料显示Dan Kegel目前工作于Google,从1978年起开始接触计算机编程,是Winetricks和Crosstool的作者,大佬年轻时的照片: Dan Kegel这篇文章阅读难度并不大,大白建议从事服务端开发或者对高性能网络开发有兴趣的读者尝试读一读。 在APUE第三版都没有提到epoll,所以我们解决C10K问题的时间并不长,其中IO复用epoll/kqueue/iocp等技术对于C10k问题的解决起到了非常重要的作用。 开源大神们基于epoll/kqueue等开发了诸如libevent/libuv等网络库,从而大幅提高了高并发网络的开发效率,对于C/C++程序员来说并不陌生。 这里简单提一下针对下一个10年的展望和挑战:C10M问题。 站在浪尖的那一批人早就开始思考让单机达到1000w并发,现在听起来感觉不可思议,但是要达到这个目标,除了硬件上的提升,更重要的是对系统软件和协议栈的改造。 Errata Security的CEO Robert Graham在Shmoocon 2013大会上的演讲,大佬重要的观点是: 不要让OS内核执行所有繁重的任务:将数据包处理、内存管理、处理器调度等任务从内核转移到应用程序高效地完成,让诸如Linux这样的OS只处理控制层,数据层完全交给应用程序来处理。 确实也是如此,难道你不觉得Linux内核做了太多不该自己做的事情了吗? 近几年出现的DPDK、PFRING、NETMAP等技术也是类似的思想,现在流行的协处理器+CPU的架构也是这样的: 3. 服务器最大并发数分析 前面提到的C10K和C10M问题都是围绕着提升服务器并发能力展开的,但是难免要问:服务器最大的并发上限是多少? 3.1 五元组 做过通信的盆友们一定听过五元组这个概念,一个五元组可以唯一标记一个网络连接,所以要理解和分析最大并发数,就必须理解五元组: 这样的话,就可以基本认为:理论最大并发数 = 服务端唯一五元组数。 3.2 端口&IP组合数 那么对于服务器来说,服务端唯一五元组数最大是多少呢? 有人说是65535,显然不是,但是之所以会有这类答案是因为当前Linux的端口号是2字节大小的short类型,总计2^16个端口,除去一些系统占用的端口,可用端口确实只剩下64000多了。 对于服务端本身来说,DestPort数量确实有限,假定有多张网卡,每个网卡绑定多个IP,服务端的Port端口数和IP数的组合类型也是有限的。 对于客户端来说,本身的端口和IP也是一样有限的,虽然这是个组合问题,但是数量还是有限的: 3.3 并发数理论极限 看了前面的端口&IP的组合数计算,好像并发数并不会特别大。 错了,是真的会很大。 分析一下,前面的计算都是针对单个服务器或者客户端的,但是实际上每个服务器会应对全网的所有客户端,那么从服务端看,源IP和源Port的数量是非常大的。 理论上服务端可以接受的客户端IP是2^32(按照IPv4计算),端口数是2^16,目前端口号仍然是16bit的,所有这个理论最大值是2^48,果然很大!… Continue reading Linux服务端最大并发数是多少?

Published
Categorized as 网络