From c8739a5c544b1e0ea1d4ee3d644ce71c62b6a030 Mon Sep 17 00:00:00 2001 From: canonical Date: Wed, 9 Oct 2024 07:19:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ppt/ref-images.pptx | Bin 75625 -> 77610 bytes docs/theory/paxos-explained.md | 253 ++++++++++++++++++++++----- docs/theory/paxos.md | 2 +- docs/theory/paxos/join-consensus.png | Bin 0 -> 11875 bytes 4 files changed, 208 insertions(+), 47 deletions(-) create mode 100644 docs/theory/paxos/join-consensus.png diff --git a/docs/ppt/ref-images.pptx b/docs/ppt/ref-images.pptx index ab6eddb3b0dd6e4967348054713aecaef0a7e0d4..d71edb32c816b96cb87304d864d8fc92c2b570af 100644 GIT binary patch delta 10999 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 delta 9298 zcmZX41y~$Qv-U3T?(Xg$f=h6Bhv4o63yTH!1vWr%clQt=1h)Xe-4fgb!NOgV@7{C% z@9%w{t*W=*?&)cnuIZYJHMso=I3jf=SU5ZY0ssjB08j(kv$NM8fdIf2ZatAZEJ$Hs z;6U|0C>r&!uN?cNgVJ*Ui{4rX*wQIJ5xa`+K}D*LU+h)zH}^ibc+AMP?{>21O1+rI ztU|XnZ>lJNG6!Nic77R0i>@29Wo-Ib$-m*vZh6;v;NGfXN~Cq$O=u23+0A0*S#o-tAW&UI!@@xCg_e_8F2 zzp9mWW9u^m=8`99l!N1g1yOe1$1KAD0LK^r03P&)+}yl4-8`&4tzEna+K1^k``x{AC3e{v(mU8M0k9iYc7ilE%)_Cl?)2Ik7-}?C2PlL zesM4tn^;vlf5=mc>HVpiD)3N7-R2@Gt07s=bzJV_VrQGOLJGNwvl*R^!FU>+upP#7 zdetw0~#%Jt^Q%WCj;SoRI>}?q-S3tL9zbILmH&Wd(#*7zvkm z+$c?)3j5yr)Q@A3`W`#Bnq3^M4&R(5UYx=GcE{otFJe;s43bfclQU&ydD&QKUd14U zq^b*V0%q5m^s3c8=-CT=b=A15=~Y-->_#-z|L}=;^@(qBfx&6e4ORdjJCQjQE4=Ho zWKR;Tz~qkg&!9M@PR+6R>K8+VTPlR%g`){?w2}m{P#glGrxcFLD7sw?6sm%3NyVP41IOd zC@VF@mQ0N#GGJ>e|9rwOlxq$dGY~B`ArbW5Go0&eN?lm2Hv{w9k_51Vmf8v6ixkgY`KgqwVBnO86aK^{|Fr1YIk z|BCUw-k1%__6Y|ntu5;a-s5fNsx|85jokLoqxCsc*&m4|Vg`4#(uA9xr}p9<7X0 zc>l%(fN@eO!4h#KDcK8+v8W0DV6FrPa3jjXvxEdt0a3t)$xF|KM*a8|xMu~DLjy&X zGA5uDG%!~hDMbAlFiidlmdtoAht|lIb^`N%xyOHVC$LzK@W;KN4~kY)0DuyJ1ccPl z0Vx~hGf{w`b%!u6yvS3;0L0-(63eGV2jVzMP6SIwN~#&HG5>LcvxTpJ_E*9!AiZd zw)#jf4FTago$v$&3uRBWa#hr_c8Xzy@YO{n9ZyRTgryW+P23lQ52cS-=aGbt_#2vl zf$}$o#?$o{^oP=xmD5o?3Tyu|$@i?ac^xdgb@1&Yy2NH#8s2gV$Fcr#&Zb zgo&u-BtPpo#wAz!1%j_VGDg^s=Z!7g#eMCBx!oiZ*@pUqC8u2=k0bm;UoS3GdM!pi z`s$203e1HfW?qJwvuVT>E5%qM=Mv^Va(rfD$kC4DMk-~%ih^Il zG-J{K5sDGi3WoIJ0tw)Ld85QNu4HGxfwIPD0_X&&ut@gZSealpYf*)^gsplUcz*q! zeEM}#C_XV9T*E{xl)kAhCz#}dgJ@xcD}w+_icN{>4?77c{FucUhAq>9wr-{z1|!gm zPhB>0#}Y2#{d$zf3Y%8FFYnsKCcNXbnW$>p;u!DY*vs2pJ;upgNk8wa^ZCmMOAu=& zs7AUDy_n|!(+$($)2v*_;T85tfUq^i5n7q&<*gn=U*ycNA2ZWoMP>DHNj|4a@5^qc zS_ha3f?dhUOY$u4@PLk3rbf|keH1dL>#d@e8`zMP#RB8c>KZ6h?yJqee$Id%cYe<3 z3D)6^D!nDrw|(cN(|+8M5G}eaTLY4OD|4Ul&i~VJ(j-!Gj^m984_13N>6Md9*qKLr zwk@TMY)=0L5`GLu+8T~jXuY)4)`oDRHpXN%ezXC3e1yWeYEr9@4|>^Q8}PSy@SGc_ z;mc0_p}Hgs>M&ib2#pcRLWgfS#!5EAMd?X~QjW;g^i}C~hOg&v%;(&3N&`R}Xzo*n zg>1JOIN#X4zoM`;5R=(x{WjO9o=Pe!R1Py#N6P#bvT}f=aBj|o>`>2v>!*J>!u}b@ zq%fbgGLpWdEuVGMpg@VFBc(chZ#tsJFNDK!&ya906WzqGp+RQeVNaNFZ%KvCYK}ug z4Boh_=>vQYrThW2wGr7Dj+JguQ*ajr{LAG;Rs`KDR%SsI0j<^rFyh@-p^V|`=R$5Q zIJQ!w8NQvZ_M;c86VlCq2qTOB`~X`^O@1)WVCxl`}U6+D$3&ZsstV?dJ)+Tp5d=X+4 z)SY0y=<7_lqj+Je$~K#OCv6pL@{=6ChGi2EOY=O*HpNCX_ogT^KyDSDGhtF@GCl+) zmHUnL)l({O$>7maAq`4uyb5dyI#w1PWbE1EB>7~*d8IC@a;3fD=p*Rw?1;zghG|wAgAoy(VgtL#KPA;imXDZq1{uB*yNAfuUKeS$CfWNiF}PggQG< zPq1J?c}zGv0W1H;;1UHmP}4jirospnsR{asg!~gZi~ed&On_|xsh31%0`FuYEo z&2pxV7UHjn2;ht}x-Ugx&vf#4-ZG2WX857GHlWrFynu&jp5K^P{^{$;jkih_DeozZMLK4Lr($2KiTk_%sP#Of zHt?b(64tejlhGXm-3N<6yAX=7K zk#tInwq1dXOnBt(M2@qWII2&xMaA_~>Xg-3104&PrVP8KlJx>$nypxO?6!tVtk2F7 z*U~a4t9qroU~V`9I9C;ob1-I=7--NmU{=LCz&RW*C8`N?V`;6b*DTJqwX>QAzZ{E( zzd}MCt6D|^-UX#gsyP3QOXp4NTU46?pLBupj`#*m7ZJ*w7oHOjpiA$~Ehd$4i||pQ zN#TM9npmk+ct0ZBW%Bb2dQ74MbsTZjN4m*^1fc}Q^R0uDoC7WE za**5+u4WT`Ioh4Z0ff~L+xp6kbFf^^4%=0U`npzg*`7wyV6OOEB5(akBH@1SjlVmV z_oaE#E8_CF4W@JCpWR1;vWxnx1ogTbWkoi=rw|jG?a)_QX1DryzO*7mva-g-?ubST zOjbdPtR;w@oI$^XE`C-I6M}Npe*2DrApP`YvTP9a^}&AK`e?t}pPLK>TS*4x0kN8o zg)RfJi%GUcdL6EU2Hm0uo2kWKEa4h*MKSShYBWzO3sRnq+UMn z#I1N}aM>~~TAVAT{YW!0Rrp8bZ7hdL zExhL|8>VmiQANaVJNwQN-%avYM(pUBq1aYLp(P?Lj?FAzoRL%^g&kYDEEt1#JTfUX zN=qL&4{!#lPzB!}fv#-i)uapOzW&-O70+FNuu!EHuKfWEDnMzn!u@Il15@JoCS*&K zP{hipBv!@BCX259A!s|=P892}$A*nP5HhG-X##u!uYKRekwxC75;OXV;p9hoS)+%4) ze%&=J(6Vu(NeYM(sHfCni~s=qqy(SV(KM>IaKeM84b4R8n8V86PN}_h$Dp8|R`@o= z!vE=Re-bheDw{3Kos&cCn6FwLQQk=)! z2*rpPti{LN98XfXtn2?M9sNEo$A5p+^l8R+XqtTzVT_g|xWolGlP^N#V7a=Xrc-fA z@R13Gy6hSDTOLSu4r5QF?uxB?@>SRWGYgjkj^=(M-AK;t`@(oi=Dwx?Jv zQoVXu+P=v#3-EvuqvM<%T#UgtU}?5Ch=_2q0ixnyVhw%`*|$$^j76?zw^>@iUs9xc zQO0iiBBv$AmtG#+#@KD@Im*7neqG{q; z*4HS160_gG?qdVitL^w|nc~HosE}dMlnWwz-0D&5>|bL^P{$GDAnw~e@~H|rx<7ak zaH|@qS&84UW3`*ER-4|;Oj2a8iQ~<>+-{sJzV(uw#S~q=P}qanyXBC`*#wC62-MZN zEKzXxKZYNI^vnY1ohL6)fx(VU3i*-4J@r@ihS52zkK0|gZ=Q^$$x~FG_U9{U0?3U%iPz=(76aBLwp4J@$TqN-VZQKSfBtkB zjk;E+L%b(q^x5}COT`6&wNA!JqNRq1(Z}x^3_G~8?3BXk)*0Dx?9!EXq+A2zeo+FJ zl&@wdjHT!VaIwtoD@fdo=F^nG0Z*>xmz2+ahq9C><2ja*k`h~CO=iR*v&>$o-!jLy{lL{r39Eq@Pdyqv}F z>ued&nx&f-qm7h?gpY$K!>XYk0+Gs9=fn$Ao>f@_^^Ps9sR(2p*(j--9!+lZ+H$OC z@LJ}I3hoU^iI2rHsie!^#?hfzY?Vr;I7k_3GN*sEuGdOm)U4F`m0fp;Z#&JVyw~ZI`KBvH>^o^S)lH4&iOWi8 zN>NjXX=;@BV_?pmeJA;Ce)e6L%llM(1&RSvg?lrvf-1X(2ET;{5jH0D+OBS;U7J^O zS*Evp(-L?>Y^O6Y2F9R#+MD@p3Hgs4>_kDo7ta!HYjc8{FU=3fC)Y3MWqp`2r3vUC zZ!VogJKtX#IzGm>W5LH2*RZ!75c0=~GrXl}VyJNC%Wvhg`(ff!3Z_O&m(6Tc@o}zi za8pMK(%DN?dYpL2tlzz@EZLfgU>HDRU05Of#!aY>Sd||UCW{WVmONYF)bVY!(E7aN zPzo%>fxrc{s3Q|QjWG{Ge*(ATbODujo zw`IroYKD1RIJ+uq9$&`?+sDMbJOTsjo6`oB39!NHP#;WhBK1AqAHgm+>m{XZC54;l z1p}^ZOXeLVp;QWJTDksZF*U9MUHsqzLgp(4M$vY1>+m0??Zc77!$)-x9RIC|?H0u|EZgEP4LMRcq^P_I#Sk&*56+nLj-@ z4Ep&ny85GgyceBtBgj8M%%!O(Znaa8Qqa^&74#`%;;jhgK;aC`t*=_4 zB`mPWMC77j zp8UO5FPr?s-O7hJVtSycOJmafLG_d?im78_ecjAx{(yw@jyPfm zG0>;Cq@!OD)GvqScl+Kao|TytP=CuC5GaR7Vr)st#FA36sDrB4SrO{}fuknDZm+c} zkcpQc6ka&|a6sBGFyUe@bqIKwvzn5;8gw%{@klx76RTFfYRHk!|C;%VRi$5|)fxW% z6$)P8ly!d+8vYizbvaMOyv2h)N_sUNME{X;Kl&kLw1gaS)-JyW%ZeJ_9Ni*VhkW{N zzgvi-JjOKIyhc6vaF`J!J8)NEvc)4G8f$t|@69FsIkrs0{@btbrQ&AmcNSHzJQQck zDg{!|VgXj>Xi3&tJzUng*BVL zsQ}oJ0SFuD2J4JXXyGKJd4LR=@Mw065)CHfDdeabMDc9pQM4Ty(`)PpGMuhr0jIm; zKNvTpALbsSof|$E8XA?9vwodcHXm7lUzpP|Z$klcND>*9*ys;gER9$Nsv9-Ai8)*E z&vH#pM?F=Sq#F(MRh~}qhGB4vMwUBde^Hd&{={QY)wq~Z$E>tTV@jhK_tKokd;jKC4-J`nnMAK+vH!Z(I} z&4GiFb8e)ag}}fS7?fEwewyEh1r{}yE$hIc@K3nRf}ka;@c(Qo%p2-(Ab8BX*Gb`M zF~6krBLlO#UVU~gc(qb_zMt4F+J63+_o}JD!HeH#N-H0|&gNF4*-2MA0akl?&@`{| zYq*m7_WQYNGV$yPew72$&JdG#2+-#s- zV{XZC=t(ULbf?DtPfWze-ujKYhpU_Cb3i06rPt*%7h1$A_!>jw#0YiCTpO>+eu?9y za_BJyeTkI=mF0_2WZ)0;jRBG1O(pXOK&6&C7e{pGPpG(#0U@8Lssm){a6{l zdfM#@%N&$DJBc7Yp_Ox0 ztaMo5alu8>ukEo`JN3F8|3P%OK${$mWHbGG)p3?+&r;7M- z1zAI5oGMbrUuab#v8!(NQm|0_4$RYrD7m}~^LCC1~k~t1NSgB0f zwQgV6TBPLDes|nPRw)NOK_-eP!@S<3&l$b#;px3bn=)uWki8uEV=6UHr z=5c|m$Z*mFSB0_S-IZWG`@!ob?X7^t*#X7M@NNOkrw7ZCG0t5XE}B* zTHrr}#R#)2x=v53RvXxz-=7&!!D}Cj*#*qB`-KUl#YqrjEPck2(mSr<25G#*I`*cv z5{_(=C}GzbLW`)7w(1-gT}WRG!wRQ9yba9g$p>zRbrX!EEZO%fPChtlnE7x2z6x1R ztjm!$vDe?Y!1^FnuAgT`G1IAeyTqItn_86QBCF9OYV#GRv{#hA*@@JV(_qkHBr-2E z1yy>u01F)$k4`tGI-Se=0CMAgxcZQS79)`Hn!LY&qo(UqNT#2%5%30hNw3I|w3duO z>8GeEakz3LsjRQe+21r(1}~x*#azUm2(K=!_dx)a&wSq?bS@sTb{f?JFvZVf}%xHz>-8HX-`#`Jn=mjTc< zKX5EaJV)rl>7VPBESxKVmrK!aD^Bq8qm)7C#~J>NPV8DG#9A^S5R=nBNT!#wAGettgXqgGG{z>7`Wf_dIy60)}|ghr^2% zr6}2Z@_?cuQGOKe#THdM7)vNzIlKzE=N}VKs>W$Sap>J)aT)2fMX0W66Ysr^MEhTC z-#DQNp@q_Z2(d*uDNXzt5p}obq17;+teiKXhe4=77zxGIJ(Zaq7 zvK(X#q4Z)5mvMR5n@~^iwPNdWQnvf=i7n(O2@o6QpRhXwixjAVA^-;fn0Z(`d2&J| zX@U5p{~gzcmi1f0jVG^&*A`5|191? zuAW5{M35XRcp?7Jf&tR?EV$Asp#K{XX{dnttqX~KHYXt?6hLX1Fe|sSgpP_8F>!EKvfPAs}iX2@Grmv>`;0Yf>P|UjP{S2Y^N&`Cy(RA@x*1 zWthjPKNul36uXc9qgy}gw=sY8#%KK|_E`t3C!;`6X@F$VU?m(Rks62s^E2)b2^zTM zgSm`{>cr16O9p805)Q%&4Nt;cB>Vw=>Haq1Ijs4gob$v#IU=;sqGw4^ofcw91H^(9 z(?VN*nhfcsg?0+`HvU!QFy&7XXxx*8?Ej5<{_hAp%L6c^h7QR6ClCkWrUw$h6sAKI z=z+X{4&x!g&xl+uq?Zv$32CJV;{7>hhD<)gb4AZE1q7Y}h!6LC$OEBZfWmde`$r!wCA%72I$PuM*DACRP$fj#WU@n*Y^LW9k>6bNisrd|GdKg zH*LS`FAe%uk5BgO^0h-RN{$5p(EPh;0NO9lG(NI_e8B&%h-?^w%>-0|p`V19GXcfO zo}IySXkB;zUtQr}pX;K8EHVK(VVY+ly(~aF2nREC96RU!8d1+i@BCk5iy24)|HqSr zK<6hu%;3V`77MUIi@#g@Ljs@dqWm5HCl=`N$F4u4`Y_2Gf2$B@h1Lhz{9~l-|C^b; z^_Ow^%qZOcYpAdR`C%${{u*V^M*Z#|159#^0zqd7vcR-{2R|GWL3BBwGtPn?dP&_q z$Xj-x1dQP+q?;YOrr3}na2!BdhX3~1{^`{{6yTq4TAuwk2nGjqu|wSkEa-6mZ^}Z0 zgmM7sS^m$FKm-7wo%yfiiw*=>xmy15{x~h%+#plrKs?#!4IvonB$h*+k7p 如果把参与共识算法的所有节点的所有动作按照一定的顺序组织成一个动作序列,则必然存在一个关键性动作,在这个动作执行之前允许多种可能,执行完这个动作之后结果固化。比如说一个Acceptor记录下一个值,则构成多数派,值被固化。如果它没有成功记录,则尚未构成多数派,还允许新的可能。 @@ -115,7 +111,7 @@ Lamport的关于Paxos的原始论文[The Part-Time Parliament](https://ying-zhan > 计算机的本质是图灵机,而图灵机的本质是它是万能模拟器,可以模拟一切计算过程,这就是所谓的图灵完备。 -**Paxos算法是对时间静止这一九级魔法的模拟实现,而Leader based Paxos则是利用八级魔法-大傀儡术来节约魔力**。 +**Paxos算法是对时间静止这一九级魔法的模拟实现**。 一旦想清楚Paxos的真正秘密是它是来源于异次元的魔法学,剩下的就只是一些平凡的技术细节了。 @@ -131,17 +127,112 @@ Lamport的关于Paxos的原始论文[The Part-Time Parliament](https://ying-zhan 在我们这个低魔的世界中模拟魔法,最基本的手段是认知删除,也就说,将一切不符合魔法学原理的事实从我们的认知中删除就好了,**看不见的就不存在!** Acceptor一系列看起来古怪的行为只是在忽略那些会导致时间静止魔法穿帮的事实而已。 -## 微观与宏观 +![](paxos/time_arrow.png) + +每一个Acceptor都记录了一个只增不减的ProposalID,相当于建立了本地的时间箭头。而整个系统通过ProposalID对齐到同一时间点,相当于是将多个局部的时间箭头对齐后,捆绑为一个粗粒化的、整体性的时间箭头。时间的流逝类似于波阵面扫过整个系统。 + +所以,从神的视角来看,Paxos算法不过是通过时间静止魔法,**强行将多条时间线对齐为唯一的一条主时间线**的雕虫小技而已。 + +### 有趣的应用:停止-对齐与乐观锁 + +这种”停止-对齐“的技术是我们在分布式系统中获得共识的一种基本策略。例如,在kafka消息队列中,同一个消费者分组中的多个消费者是独立行事的,但同时它们必须就如何分配工作达成共识。因此,当消费者分组中的成员增减或者topic结构发生变化时,会触发所谓的再平衡(Rebalance)过程。再平衡过程中,Coordinator首先要求所有worker停止当前的工作,集体切换到下一个世代(epoch),然后再下发新的分配方案。一个分配方案仅在一个世代中有效。 + +我们在数据库中常用的乐观锁也是同样的处理策略。刚进入处理程序的时候去读取MainRecord的版本号,然后再修改MainRecord以及相关联的SubRecord,最后在一个事务中批量提交修改,同时尝试更改主记录的版本号。 + +``` + update MainRecord + set version = version + 1 + where version = :record_version +``` + +如果能够更新成功,说明在整个处理过程中时间静止,没有其他人执行相冲突的动作。 + +### 微观与宏观 + +局部的时间箭头随时会因为各种异常发生中断,这时候就需要一点大局观,也就是区分所谓的微观和宏观。微观上可能有些成功了,有些失败了,但只要大多数(Majority)成功了,则我们就定义它在宏观上成功了。因为一个集合不允许同时存在两个Majority,而Majority不可能既选择了值X,又选择了值Y,所以从微观到宏观的上升路径是明确的。 + +理解Paxos算法的一个关键点是,我们只需要关注那些上升到宏观世界的事件,也就是在主世界的主时间线上发生的事情。主时间线上的每一个时间点对应于小世界中都是一个时间静止开始--时间静止结束的一段过程,在每个时间点上都可能会发生一次值的设置(如果成功设置,则共识达成)。**时间静止的效果最终是在主世界中完全体现**:在主时间线上表现为一个个孤立的时间点,这些点不会重叠,**对应于小世界中的过程区间不会交错**。 + +![](paxos/paxos_phase2.png) + +大多数小世界中都发生的事件才会上升到主世界中,成为主世界中的事件。也就是说,大多数小世界在时刻t都写入了某个值A,那么这个事实就不会被任何后续的变化所改变或遮蔽,不会有第二个声音提出有效的反对意见,此时主世界中才会发生写入值A这个事件。 + +### 有趣的应用:避免脑裂(Split Brain) + +在需要Leader选举的算法中,一个经典的问题是**如何避免脑裂**?如果新生代的Leader已经得到了人民的拥护,而老一代的Leader却不肯退位,总在那里不停的搅局怎么办?一个一般性的解决方案就是:**直接把旧Leader定义为zombie, 彻底忽略来自上一个世代的所有信息**(比如拒绝所有epoch较小的请求)。实际上,我们并没有限制旧Leader的行为,在自己的小世界中,它完全可以自以为是的为所欲为,只不过它的行为最终无法上升为集体意志,无法对主世界产生影响而已。新的Leader一继位,需要**未读先写**,先在主世界中打上自己的epoch标记(类似于更改全局共享变量),这样老的Leader在提交计算结果的时候通过乐观锁发现自己已经失势,最终只能无奈放弃自己的处理结果。 + +在我们这个位面的物理学中,随着量子力学的发展,观察或者说测量已经具有了非常独特的理论意义。按照量子场论所描绘的视图,在我们看不见的虚时间中,无数狂野的事物在相互竞争、湮灭,最终反映到现实世界中的只是某种综合运算后的结果而已。透过诡异的量子隧道效应,实际上我们也可以窥见这背后的惊涛骇浪。 + +## 四. 单调性:从薛定谔猫态塌缩 + +Paxos的第二阶段有一个非常令人费解的操作:Proposer 收集到多数派的Propose应答后,如果应答中有值,则会从应答中选择Proposal ID最大的提案的Value,作为本次要发起 Accept 的提案。为什么Proposer要放弃自己原来的提案,还要选择别人的提案的值?为什么偏偏需要选择Proposal ID最大的那个提案的值? + +这些问题的存在,本质上是因为凡人的局限性所导致的。 + +![paxos\_consensus](paxos/paxos_consensus.png) + +考虑有5个Acceptor,多个Proposer的情况。在ProposalID=t1的时候,提案P1被A1和A2接受,但是没有达到多数派,因此在这一轮处理中值并没有被确定下来。ProposalID=t2的提案P2同样没有达到多数派。ProposalID=t3的提案P3被多数派A2、A3、A4接受,从而达成共识。 +**当ProposalID=t3达成共识之后,有没有可能在t4时刻我们达成一个新的共识P4**?这样的话,t3的共识是P3,t4的共识是P4,而t1和t2时刻没有达成共识。对神来说,不同的时刻选定不同的值是完全OK的,No Problem,因为神是全知全能的。但是**对于鲁钝的凡人而言,如果允许不同的时刻有不同的共识,他会出现认知障碍**。 +假如允许共识被推翻,一个只有有限认知能力的凡人,他怎么知道哪个值才是要用的值呢?很多时刻根本没有达成共识(例如t1和t2),他要从t1到tn遍历所有的时刻来获知所有共识的值吗?所以人类所研究的基础共识算法都会直接要求,一旦达成共识就一直保持共识不变。 -时间静止在主世界中发生。主世界的时间线类似于宏观世界,而小世界的时间线类似于微观世界。 +![paxos\_consensus\_fail](paxos/paxos_consensus_fail.png) -微观上可能有些成功了,有些失败了,但只要大多数(Majority)成功了,则我们就定义它在宏观上成功了。因为一个Majority不可能既是X,又不是X,所以这种宏观定义是明确的。 +现在,考虑上图中的情况。假设A3在处理P3的时候直接宕机了。从外部看来,存在两种情况: +1. A3已经接受P3,所以达成了共识 +2. A3还没有接受P3, 所以尚未达成共识 +**除了A3自己之外,没有任何人知道它的处理情况。但是,A3已经挂掉了,它不能回答任何问题**!所以,如果不同的时刻可能有不同的共识,那么我们有可能会陷入一个尴尬的境地,那就是历史结果完全处于一种量子不确定状态,无法简单的回答是或者否。 -## 2PC与量子纠缠态 +对于凡人而言,最理想的选择是系统具有某种**单调性**:它只会向着一个方向不断迈进,而且一旦到达目标状态,就永远禁锢于该状态中。这样的话,任何时候我们想从系统中提取信息,都可以直接将系统向前推进一步。如果系统已经达成共识,则继续前进一步得到的仍然是共识的值,如果没有达成共识,则我们将实际选定一个值,从而摆脱不确定的状态。例如,在上面的例子中,我们继续运行一步Paxos算法,无论t3时A3做出何种选择,我们一定会在t4得到P3的结果,从而在t4之后**消除了系统中的不确定性**。在郁白的文章中,这也称为最大提交原则。 + +如果沿用上一节的宏观世界分析,我们会发现因为微观世界随时存在着生生灭灭的随机涨落的情况,导致宏观世界中我们认知到的事实可能会处于薛定谔猫态中。Proposer从多数派Acceptor中获取到应答时,相当于是在主时间线上完成了一次读取操作,只是这种读取操作具有某种副作用。 + +1. 我们知道所有主时间线上的事实肯定能按照发生的”时间点“排序,而共识是在主时间线的某个时间点上发生的写入。那么保持共识一致的最简单的方案就是,**未写先读**,写入之前先偷看一眼前面的情况。 + +2. 如果读取到的多数派的值和时刻t都一样,则表示时刻t的值已经确定,本质上主时间线上的共识已经达成,没有必要再继续下去,直接返回结果就可以了。 + +3. 但是如果从多数派读取到的值或者时刻t不一样,则前一个时刻有可能已经实现共识也有可能尚未实现,整个系统处于一个不确定的状态。这种情况下我们需要确保如果共识已经达成,则我们的后续行为不会破坏共识。也就是说,如果t-1时刻有多数派接受了值X,则时刻t我们不能提出一个不同的值Y。**如果共识已经达成,则共识的值一定是ProposalID最大的值**。因为如果t3时刻达成了共识,则**紧随其后**的t4一定看到了t3的结果,共识不能被推翻就必然导致t4的值一定是共识的值。所以如果ProposalID最大的值不是共识的值,则表示在它之前不可能已经达成共识。**Paxos算法的发展具有单调性,在主时间线上的状态是从没有值发展到不确定是否有值,再发展到确定为某个值,所以我们只需要查看最后一步的结果就好了**。因为一个ProposalID只会由某一个Proposer使用一次,所以一个ProposalID最多对应于一个值。 + +4. Paxos的第二阶段当从多数派读取到值之后,本质上是放弃了自己的写操作,它退化为一个纯粹的观测动作,只是这种观测有一个副作用:主世界中的时间点上的状态从可能设置了值(达成共识)也可能尚未设置值的不确定状态向一个确定性的有值状态塌缩。**相当于实际上并没有写入新的值,只是从当前可能的值中选择了一个,这与量子力学中观测的作用是一致的**。 + + $$ + |X\rangle + |0\rangle \longrightarrow |X\rangle + $$ + +5. Paxos算法的第二阶段如果成功执行,相当于在时间静止之后完成了一次原子性的`读取+写入`操作。 + +> 薛定谔猫态表示系统处于量子叠加态,你不看它的时候猫既没有死也不是活,处于既死又活的叠加状态,同时具有死和活的可能性。你看它一眼,系统发生状态塌缩,猫的状态就只能是死或者活。 + +回到上面的例子,有一个微妙的情况。在t1时刻只设置了两个P1, 并没有达成共识。t2时刻也只设置了两个P2,没有达成共识。但是t3时刻的时候在多数派中一定会看到P1或者P2,所以实际上P3只能是P1或者P2,不能是一个任意的值。在多数派中如果接收到的都是空值,则可以安全的判定尚未实现共识,如果已经有值的情况下,出于安全起见,按照Paxos的规则实际会从已有的值中选择。在明确接收到前一时刻的5个响应,明确知道尚未达成共识的情况下,我们如果不采用Paxos的选择,直接选择一个其他的值本质上也不会产生冲突。Paxos的选择虽然不是必须的,但是它比较简单,同时在一定程度上可以加速算法收敛。 + +### 什么时候达成的共识? + +当共识出现的时候,参与者中有谁知道已经达成了共识吗?一个有趣的事实是,当共识达成的那一刹那,系统中所有的参与者,包括Acceptor和Proposer,没有任何人知道共识已经达成!只不过,随着时间的推移,算法的运行会**把共识已经达成这一事实逐步的揭示出来**。 + +![paxos\_consensus](paxos/paxos_consensus.png) + +首先,我们注意到当共识没有达成之前,**Acceptor是有可能改变自己接受的值的**,例如A3先接受了P2,后面又接受了P3。因为Proposer随时有可能失联,所以Acceptor只能选择接受新的值。这导致当A3接受P3的时候,它不可能知道共识已经达成,P3就是最终选定的值。同样的道理,A2和A4也只知道自己局部的情况,无从判断系统整体是否已经达成共识。而在Proposer一端,在接收到多数派Acceptor的成功响应之前,它也不知道自己提交的P3能否被多数Acceptor接受,成为最终的共识。所以说**共识是属于整体的,单个参与者对于共识是否达成需要有一个理解的过程**。 + +这里还有一个有趣的细节。在t2时刻,如果第一阶段收集到的多数派响应来自A3,A4,A5,则我们可以提出任意的值P2(如果多数派中包含A1和A2,则按照Paxos的规则,P2只能是等于P1了)。但是写入多数派的时候并不要求写入A3, A4,A5,而是允许选择任意一个多数派,所以我们能够将不同于P1的P2写入A1。为了强调这一点,Lamport在他的论文中还专门写了一句话:This need not be the same set of acceptors that responded to the initial requests。 + +## 五. Leader Based: 复制粘贴 + +施展九级魔法是相当消耗魔力的行为。一个具有社会主义核心价值观、勤俭节约的神绝对不会无端的浪费魔力。所以一旦时间静止下来,为了维系分处多地的节点的行为一致,神的最佳选择是施展一个八级魔法”大傀儡术“,将一个节点(称为Leader)上的行为复刻到其他所有节点上。 + +这种复刻源自于神的力量,因此一旦leader发动新的动作,它将穿越千山万水,无视物理阻隔直接降临于远端的follower身上,follower没有反驳的权利,只有执行的自由。不过,俗话说的好,上面动动嘴,下面跑断腿。在我们这样一个低魔世界中,实现大傀儡术并不是一件很轻松的事情,一般通过在发送端和接收端各自增加一个日志文件来实现。 + +发送端把动作决定写入日志,从而使它成为不可变的神谕。发送组件扫描日志系统,确保将其逐条传达到远端。如果连接不上接收端,或者发送出错,或者发送后没有接收到期待的响应信息,发送组件不能抱怨,不能放弃,唯有努力工作,**不断重试**,直到接收到成功响应为止,这一过程可以保证至少成功发送一次(At Least Once)。接收端必须无条件接收所有消息,不能拒收,不得篡改。因为有可能多次接收到同一个消息,它必须通过本地日志进行**幂等检查**,过滤掉所有重复消息,从而实现最多成功处理一次(At Most Once)。如果消息需要通过一个流式处理系统(Stream)进行接力处理,为避免每次从源头开始不断重播,需要中间节点能够通过**快照机制**把已经完成的处理结果记录下来。 + +毫无疑问,MultiPaxos和Raft算法都是以上复刻策略的一种具体实现。一旦选主成功,代表任期的Term编号就可以被多次复用,通过同一个Term编号可以发出多条执行指令,只要这些指令通过log index能够区分即可。 + +如果仔细分析一下,我们会发现,从网络上接收到的消息可以分成两类:一类是请求(Request),接收方可以自由选择相应的处理方式,处理结果也是不确定的,可以成功返回也可以抛出异常。另一类是单向的通知(Notice),它对应的处理方式是固定的,接收方不能有反驳的意见。 + +一个有趣的例子是两阶段提交。在Prepare阶段,Participant接收到的是请求消息,因此它可以根据自己的独立意志选择提交或者回滚。一旦Participant将自己可能的选择返回给Coordinator,它就向Coordinator让渡了自身的自主权,许诺今后只接收通知消息,将行为与Coordinator保持一致。当Coordinator决定提交时,Participant绝不会选择回滚。同样的,Participant如果回滚,我们知道Coordinator的选择也只能是回滚。它们两者的选择不再是独立的做出,而是纠缠在了一起。 + +### 2PC与量子纠缠态 2PC(两阶段提交)可以看作是由Coordinator提供一致性的来源,各个Participant逐渐和Coordinator建立纠缠。而Paxos是逐步建立一个Quorum,Quorum中的参与者纠缠在一起。 @@ -161,7 +252,7 @@ $$ \frac{1}{\sqrt{2}} (|00\rangle + |11\rangle) $$ -在这个态中,"0" 和 "1" 分别代表粒子的某种量子属性(比如自旋方向)的两个可能状态,而 $|00\rangle$ 表示粒子A处于状态"0"且粒子B处于状态"0",$|11\rangle$ 则表示粒子A处于状态"1"且粒子B处于状态"1"。 +在这个态中,"0" 和 "1" 分别代表粒子的某种量子属性(比如自旋方向)的两个可能状态,而 |00\rangle 表示粒子A处于状态"0"且粒子B处于状态"0",|11\rangle 则表示粒子A处于状态"1"且粒子B处于状态"1"。 #### 纠缠粒子的行为 @@ -173,79 +264,147 @@ $$ ===========智谱清言AI创作完毕======== -## +### 分布式最本质的困难:不知道 -## 一些常见问题 +在凡人的眼中,这个世界充斥着令人心烦意乱的不确定性,每一步行为都产生三种可能的结果:**1. 成功,2. 失败 3. 不知道什么结果**。曾几何时,孤立的单机系统为我们提供了一种乌托邦式的幻象,世界是二分的,好与坏,成功与失败,光明与黑暗。但是真实的世界让人清醒,在由偶然所主宰的世界中,这种内在的不确定性造就了分布式系统的本质性的困难。 -## 成员变更 +当一个动作的结果是不知道的情况下,我们能够怎么办呢?答案是,我们只能等待反馈。要么被动等待负责执行的实体返回执行结果,要么发起主动探查,等待探查到执行结果。比如说,我们要确定一个数据导出任务是否成功生成了导出文件,唯一的方法就是在执行完生成任务之后,检查生成文件是否存在并且数据完整。 -成员变更的约束条件: +## 六. Paxos算法的变体 -- 上一个 config 在当前 commit_index 上提交后才允许 propose 下一个配置. - -- 下一个配置必须跟最后一个已提交的配置有交集.也就是任意两个quorum必须有交集。 - -## Quorum并不需要是Majority +参见[SoK: A Generalized Multi-Leader State Machine Replication Tutorial](https://escholarship.org/uc/item/9w79h2jg) -Quorum(法定代表)的要求是任意两个quorum之间存在交集。比如,要求所有Quorum都包含一个指定元素a,这样也是合法的Quorum,只是不容错。`{{a},{a,b},{a,b,c},{a,c}}` +### Fast Paxos -hierarchical quorum ![](https://pic1.zhimg.com/80/v2-e2a584b6379a039596b303442ad849de_1440w.webp) +如果很确定自己是第一个提出一个值的话,那么就可以安全地跳过第一阶段,直接进入第二阶段提交。Fast Paxos使用rnd=0直接尝试一次phase2写入。 +为了防止第一次尝试写入冲突后正确执行,quorum需要`n*3/4`,这样后续paxos读取的时候至少要读取`1/2+`,在这`1/2`多中,已经写入的值仍然是多数派。 $$ -Q' = (Q - \{Q_i\}) \cup \{\bar Q_i\} +[\frac 1 2 ] = (\frac 1 4) + [\frac 1 4] $$ -去掉一个quorum,然后再加上它的补集,我们得到的仍然是一个合法的quorum集合。 +也就是说,`t=0`时刻存在两个活动者,所以我们需要新的信息来判断它们的执行顺序。在时间冲突的情况下,但是仍然可以通过对多数派进行计数得到已经被选定的值。 -## 接受Accept消息的需要是此前返回Propose响应的Acceptor吗? +如果一个值想要被快速提交,它不仅要得到大多数成员的认可,还要在大多数的大多数中得到认可,才能安全地提交。 -![](paxos/acceptor.png) +### Flexible Paxos -- Lamport专门强调了:"This need not be the same set of acceptors that responded to the initial requests." -- 在第一阶段,我们可能从A1、A2、A3接收到了成功响应,然后我们并不需要向A1、A2、A3发起第二阶段请求,而是完全可以选择其他的节点发起请求。Paxos只要求多数派成功响应即可,并不要求第一阶段和第二阶段的多数派完全一样。 +为了在一个偶然的、不确定的世界中奋力求生,我们唯有精诚合作,形成超越个体的集体意识。个体可以消亡,而集体通过新陈代谢实现永生。一个有趣的问题是,多数派(Majority)是否是形成集体意识的唯一选择?显然不是。精神的传承,只需要种子的存在。 -## Paxos算法的变体 +来看一个Grid Quorum的例子, -参见[SoK: A Generalized Multi-Leader State Machine Replication Tutorial](https://escholarship.org/uc/item/9w79h2jg) +![paxos\_grid\_quorum](paxos/paxos_grid_quorum.png) +对于上面`3*6`个Acceptor所组成的一个Grid,我们可以规定只要**写入任意一列**所构成的Quorum即可认为共识达成。显然,任意两列都是不相交的。为了避免做出自相矛盾的选择,我们需要横向架设一个桥梁,规定Paxos第一阶段读取的时候必须至少读取一行。假设某个时刻共识已经诞生,则下一个共识必然先经过一个行读取再执行一个列写入。因为任意的行和任意的列都是相交的,行读取必然会读到共识的值,因此写入的新值必然是和此前的共识保持一致的。注意到这个例子中的行Quorum与相交的列Quorum都没有达到多数派,而且它们的总元素个数为3+6-1=8个,也没有构成多数派。所以,读取和写入时候的Quorum既不需要相同,也不需要占据多数,只要能够相交,足以传递信息即可。 +> Flexible Paxos指出第一阶段和第二阶段的 quorums 必须相交,但同一阶段内的 quorums 则不需要相交。这意味着任何具有这种性质的 quorum 系统都可以使用,而不仅仅是多数派 quorums。**读+写是时间静止过程中的一个原子操作,所以只需要读Quorum+写Quorum产生的结果互斥即可**,不需要写Quorum相交。 -## Fast Paxos +要超越个体,只需要把个体升华为Quorum中的一员。一个个体可以属于多个Quorum。只要过去和未来所有的Quorum协调一致,不会做出相互冲突的选择,最终我们就可以形成统一的集体意志。 -如果很确定自己是第一个提出一个值的话,那么就可以安全地跳过第一阶段,直接进入第二阶段提交。Fast Paxos使用rnd=0直接尝试一次phase2写入。 -为了防止第一次尝试写入冲突后正确执行,quorum需要`n*3/4`,这样后续paxos读取的时候至少要读取`1/2+`,在这`1/2`多中,已经写入的值仍然是多数派。 +### Quorum并不需要是大多数 + +Quorum(法定代表)的要求是Quorum之间存在交集。比如,要求所有Quorum都包含一个指定元素a,这样也是合法的Quorum,只是不容错。`{{a,d},{a,b},{a,c}}` + +此外我们还注意到,$A \cap B $不为空,且A没有包含于B的情况下,实际上意味着A和B的补集的交集也不为空,所以$A\cap \bar B \ne \emptyset $ ,这也就意味着说一组存在交集的互不包含的Quorum $$ -[\frac 1 2 ] = (\frac 1 4) + [\frac 1 4] +Q_i \cap Q_j \ne \emptyset \Longrightarrow Q_i \cap \bar {Q_j} \ne \emptyset $$ -也就是说,时间可能冲突,但是仍然可以通过对多数派进行计数得到已经被选定的值。 +也就是说一组Quorum中,我们任意选择其中的一个$Q_j$,然后取它的补集,则这个补集与其他的Quorum也是两两相交的。 -如果一个值想要被快速提交,它不仅要得到大多数成员的认可,还要在大多数的大多数中得到认可,才能安全地提交。 +### 偶数节点集群 -`t=0`时刻存在两个活动者,所以我们需要新的信息来判断它们的执行顺序。 +一般情况下集群节点总数是奇数,比如5,但如果节点总数是4,则在网络存在分区的时候,会出现整个系统容错性不足的问题。比如说考虑4个节点构成的集群,其中a,b在数据中心1,而c和d在数据中心2,多数派要求至少3个节点。这种情况下,如果数据中心1和数据中心2出现网络分区(Partition),则每个数据中心都只有两个节点,没有满足多数派要求,导致Paxos算法无法运行下去。 -## EPaxos +一种解决方案是扩充Quorum的构成,将`{a,b},{b,c},{a,c}`也加入到Quorum的集合中(也就是想办法最大化Quorum集合,这样只要能想办法 满足其中任意一个Quorum的构成,Paxos算法就可以运行下去,可选的Quorum个数当然是越多越好)。原本4节点集群的多数派Quorum为 `{a,b,c},{b,c,d},{a,c,d},{a,b,d}`,显然`{a,b}`和这个多数派中的每一个都重叠,因此它也可以加入到Quorum集合中。通过增加一些非3节点的Quorum,我们就可以克服上面的网络分区困难,在分区发生的时候仍然可以实现Paxos。 -记录deps, mmp3与EPaxos的不同在于它记录所有依赖的instance,包括所有间接依赖的,由此才能保证线性一致性。 +这是一种通用的策略,可以认为扩充后的Quorum集合为 $Major(D)\cup Major(D \backslash \{d\})$, 即以偶数个节点的多数派为基础,然后再删除一个节点d,考虑剩下的奇数个节点中的多数派,将结果合并到一起。 + +### Multi-Paxos和Raft + +Raft和Paxos的统一性可以参考xp的文章 [将 paxos 和 raft 统一为一个协议: abstract-paxos](https://zhuanlan.zhihu.com/p/488629044), Raft论文的翻译参见[raft-zh_cn.md](https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md) + +Paxos算法解决的是单个决策问题,即如何在分布式系统中对单个值达成一致。但是在实际应用中,我们总是需要连续做出决策。 + +Multi-Paxos是将Paxos算法用于Replicated State Machine这样一个实际问题。在Replicated State Machine中,每个状态变更都作为一个日志条目记录下来。Multi-Paxos确保这些日志条目在所有副本上的顺序和值是一致的。这是通过在每个条目的提交过程中运行Paxos算法来实现的。也就是说,每个日志条目对应一个Paxos Instance。 + +为了保证日志条目顺序提交,Multi-Paxos为每个条目引入了一个递增的logIndex,而且约定logIndex必须连续,不会出现空洞(否则不容易判断是否所有有效的日志条目都已经存在)。这样前后的日志条目就被隐式的关联起来。 + +本质上,Multi-Paxos算法中多个日志条目支持一定程度的并行处理。在确定每个条目的值的时候可以是乱序的,但是提交的时候(允许应用到状态机上的时候)需要按照顺序处理。比如说,我们可以先确定`logIndex=100`的日志条目,但是这个条目所代表的动作无法直接应用到状态机上(无法提交),只有当logIndex=1到logIndex=99的所有条目都确定后,才能从logIndex=1开始逐个应用到状态机上。因此,日志条目的提议过程可以是乱序的,但它们的应用过程必须是严格有序的,以确保状态机的一致性和正确性。 + +Multi-Paxos通过引入领导者(Leader)角色和状态共享,对Paxos的连续应用做了性能优化。首先,所有的提案都由领导者负责处理,减少了冲突并简化了交互逻辑。其次,领导者可以在获取到一次Promise之后,反复复用此前的ProposalID(通过logIndex区分不同的消息),跳过Paxos第一阶段的处理,相当于在一次时间静止过程中增加多个日志条目。 + +Raft可以看作是对Multi-Paxos的一种改进或者补充,它针对Multi-Paxos一笔带过的很多技术细节问题都提出了明确的解决方案(但也引入了更多的限制)。以下是智谱清言AI所返回的Raft相对于Multi-Paxos的一些关键点: + +1. **明确性**:Raft对许多在Multi-Paxos中不够明确的技术细节提供了清晰的解决方案。例如,Raft明确规定了日志条目的复制过程、领导者选举的机制、日志的一致性检查等。 + +2. **可理解性**:Raft的设计目标之一就是提高算法的可理解性。它通过减少状态的数量和简化状态转换逻辑来实现这一点。 + +3. **限制性**:虽然Raft简化了算法,但它也引入了一些限制。例如,Raft要求日志条目必须按照顺序提交,而在Multi-Paxos中,日志条目的提议可以乱序进行(尽管应用时仍然需要有序)。 -## Paxos与 Raft +以下是Raft相对于Multi-Paxos的一些具体改进和限制: -参考xp的文章 [将 paxos 和 raft 统一为一个协议: abstract-paxos](https://zhuanlan.zhihu.com/p/488629044) +- **领导者选举**:Raft使用随机计时器来选举领导者,这有助于减少选举冲突,并且选举过程更加明确。 +- **日志复制**:Raft中的日志复制过程非常直接,领导者直接将日志条目复制到跟随者,而Multi-Paxos中的日志复制可能需要处理更多的乱序情况。 +- **安全性**:Raft通过一些机制(如预投票阶段和日志匹配属性)来增强系统的安全性。 +- **集群成员变更**:Raft提供了明确的集群成员变更机制(joint consensus),这在Multi-Paxos中通常需要额外的逻辑来处理。 -Raft对 multi-paxos 没有明确定义的问题, 即多条日志之间的关系到底应该是怎样的, 给出了一个确定的答案. +==========智谱清言AI创作完毕========= -Multi-Paxos: 很多instance共用一个Promise。 +Raft的Leader选举使用了本地定时器,这相当于是额外引入了存在可比的本地时间这一新知识,原先Paxos算法中只需要因果关联所导致的逻辑时钟,则Raft相当于使用了某种物理时钟。需要注意的是,时间是我们这个世界内在一致性的来源,物理时钟的引入本身就会简化一致性处理。比如说,Google的TrueTime技术使用了精确计时的原子钟,相当于是在系统中引入了一定精度范围的绝对时钟,这使得他们在实现分布式事务的时候可以进行简化处理。 + +以下是智谱清言AI补充的一些解释: + +**物理时钟与逻辑时钟**: + +- 物理时钟是基于实际时间的时钟,而逻辑时钟(如Lamport时钟)是一种用于捕捉事件顺序关系的时钟,不依赖于实际物理时间。 +- 引入物理时钟可以简化一致性处理,因为它提供了一种全局一致的参考时间,使得可以在不同的节点上比较事件的时间戳或者时间区间的长短。 + +**Google的TrueTime技术**: + +- Google的Spanner数据库系统使用了TrueTime技术,该技术结合了原子钟和GPS时钟来提供非常精确的时间服务。TrueTime提供了一个时间范围,确保了不同节点上的时间同步误差是有界的。 +- TrueTime技术的引入简化了分布式事务的处理,因为它允许系统在事务的时间戳上有更高的确定性,从而支持外部一致性(外部一致性是指事务的顺序与它们在全局时间线上的顺序一致)。 + +======智谱清言AI创作完毕======= + +### 成员变更 + +参见[TiDB 在 Raft 成员变更上踩的坑](https://zhuanlan.zhihu.com/p/342319702) + +Raft原始的论文提出了单步变更(逐个成员变更)和Join Consensus(一次性变更多个成员)两种方式,并且提倡单步变更,但后来发现这种方式存在问题,Raft原始论文中的算法也存在漏洞,最终还是join consensus算法成为理论层面和实践层面的最佳选择。 + +考虑由abc构成的集群C1迁移到def构成的集群C2 + +![](paxos/join-consensus.png) + +**在Paxos系列的算法中,我们只需要考虑主世界时间线上发生的事情,不用理会微观层面的细节。这其中就包括Leader在什么时候切换的问题**。因为Paxos算法的安全性本质上来源于指定时刻t只会有一个Quorum实现写入(Quorum的互斥性),至于这个Quorum写入是否是由某个Leader发起的根本无关紧要。Paxos算法并不依赖于选主,Leader的存在只是一种性能优化手段。 + +成员变更本质上是从集群C1的时间线切换到集群C2的时间线。在t1时刻(C1主世界的逻辑时间)集群配置为C1,在t2时间我们发起切换,相当于是准备切换时间线,这要求我们要把两条时间线对齐,因此t2时刻需要在C1时间线和C2时间线上都写下join集群配置,也就是说从t2开始,这两条时间线开始同步,任何事情都必须在C1的Quorum和C2的Quorum中同时发生。也就意味着t2是 Major(C1) + Major(C2)作为集群配置的提交(commit)时刻。在t3时刻,我们切换到C2配置,这个配置起作用的时间也是C2配置在Major(C1)和Major(C2)中成功写入为标志。t3之后只有C2集群存活,C1集群中不再使用的节点可以退出。 + + 从t2到t3的过程中,要求所有的提案都需要Major(C1)和Major(C2)同时通过。相当于我们先切换到一条较粗的时间线,然后再切换到一个较细的时间线。不可能直接从C1时间线直接切换到C2时间线,因为这样会导致在交叉点两者都存在自己的多数派,从而产生脑裂。我们需要t2到t3这样一段区间将两条时间线粘结在一起。 ### 幽灵复现问题 -某类没有提交且过时的日志可能被新 Leader 重新提交。也就是说在上一个leader没有达成共识的条目会不会在下一个Leader达成共识,从未知状态转成提交状态。 +参见[如何解决分布式系统中的“幽灵复现](https://www.infoq.cn/article/YH6UVyFLyN3oOOk1Ag7B), [共识协议:切主后的困境 - 日志恢复和幽灵复现](https://zhuanlan.zhihu.com/p/652849109) + +Multi-Paxos协议处理过程中可能会出现一种所谓的“幽灵复现”的问题,它指的是在某些情况下,之前未能形成多数派确认的日志在后续操作中重新出现,导致数据不一致或重复处理的问题。也就是说在上一个leader没有达成共识的条目有可能会在下一个Leader达成共识,从未知状态转成提交状态。 + +![](https://pic3.zhimg.com/80/v2-5035bf2fa2a2fdceabe67334d5517834_1440w.webp) + +第一轮,A被选为Leader,写下了1-10号日志,其中1-5号日志形成了多数派,并且已给客户端应答,而对于6-10号日志,客户端超时未能得到应答。 +第二轮,A宕机,B被选为Leader,由于B和C的最大的logID都是5,因此B不会去重确认6-10号日志,而是从6开始写新的日志,此时如果客户端来查询的话,是查询不到6-10号日志内容的,此后第二轮又写入了6-20号日志,但是只有6号和20号日志在多数派上持久化成功。 +第三轮,A又被选为Leader,从多数派中可以得到最大logID为20,因此要将7-20号日志执行重确认,其中就包括了A上的7-10号日志,之后客户端再来查询的话,会发现上次查询不到的7-10号日志又像幽灵一样重新出现了。 + +为了避免这个问题,新一任Leader上任后需要先写入一条StartWorking日志,开启一个新的epoch,然后忽略所有此前epoch未完成的工作。 ## Generalized Paxos -Multi-Paxos和Raft考虑的都是线性日志,日志中的条目构成一个全序(total order)集合:排在前面的日志总是要先执行。但是实际情况中日志中某些项的执行先后顺序是可以颠倒的,只要它们之间不存在冲突关系(比如读后写,写后读等),例如`a=1`和`b=2`这两个命令互不相关,可以交换执行顺序。泛化Paxos的做法是通过依赖服务来计算日志条目之间的偏序依赖关系,然后构成冲突图。 +参见[SoK: A Generalized Multi-Leader State Machine Replication Tutorial](https://mwhittaker.github.io/publications/bipartisan_paxos.pdf) +Multi-Paxos和Raft考虑的都是线性日志,日志中的条目构成一个全序(total order)集合:排在前面的日志总是要先执行。但是实际情况中日志中某些项的执行先后顺序是可以颠倒的,只要它们之间不存在冲突关系(比如读后写,写后读等),例如`a=1`和`b=2`这两个命令互不相关,可以交换执行顺序。泛化Paxos的做法是通过依赖服务来计算日志条目之间的偏序(partial order)依赖关系,然后构成冲突图。 +> 偏序(Partial Order)是数学中的一个概念,用于描述集合中元素之间的一种“部分排序”关系。在偏序关系中,集合中的某些元素之间可以比较大小,而其他一些元素则无法直接比较。 部署配置: @@ -257,8 +416,6 @@ acceptors: 2f+1个 replicas: 至少f+1个 - - $deps(v_x)$是至少f+1个依赖服务节点所计算得到的依赖集合的并集。 依赖服务接收到x,再接收到与之冲突的y时,会增加一个节点$v_y$到节点$v_x$的箭头,$v_x \in deps(v_y)$ @@ -270,3 +427,7 @@ $deps(v_x)$是至少f+1个依赖服务节点所计算得到的依赖集合的并 ![](https://picx.zhimg.com/80/v2-e367275aa567652df6bbc7d3ff79aab1_1440w.webp) 两个冲突的操作,可能是同时发起的,而不同的消息到达不同的依赖服务节点的顺序有可能不同,这就导致了在不同服务节点中的依赖关系可能不同。即使依赖服务维护的冲突图是无环的,Replica 中形成的冲突图也有可能有环。 + +## EPaxos + +记录deps, mmp3与EPaxos的不同在于它记录所有依赖的instance,包括所有间接依赖的,由此才能保证线性一致性。 diff --git a/docs/theory/paxos.md b/docs/theory/paxos.md index a1b1020b2..cff03c4ed 100644 --- a/docs/theory/paxos.md +++ b/docs/theory/paxos.md @@ -46,7 +46,7 @@ Paxos算法并不长,写在纸上也仅有短短的四句话。它之所以看 毫无疑问,MultiPaxos和Raft算法都是以上复刻策略的一种具体实现。一旦选主成功,代表任期的Term编号就可以被多次复用,通过同一个Term编号可以发出多条执行指令,只要这些指令通过log index能够区分即可。 -如果仔细分析一下,我们会发现,从网络上接收到的消息可以分成两类:一类是请求(Request),接收方可以自由选择相应的处理方式,处理结果也是不确定的,可以成功返回也可以抛出异常。另一类是单向的通知(Notice),它对应的处理方式是固定的,接收方不能有反驳的意见。i +如果仔细分析一下,我们会发现,从网络上接收到的消息可以分成两类:一类是请求(Request),接收方可以自由选择相应的处理方式,处理结果也是不确定的,可以成功返回也可以抛出异常。另一类是单向的通知(Notice),它对应的处理方式是固定的,接收方不能有反驳的意见。 一个有趣的例子是两阶段提交。在Prepare阶段,Participant接收到的是请求消息,因此它可以根据自己的独立意志选择提交或者回滚。一旦Participant将自己可能的选择返回给Coordinator,它就向Coordinator让渡了自身的自主权,许诺今后只接收通知消息,将行为与Coordinator保持一致。当Coordinator决定提交时,Participant绝不会选择回滚。同样的,Participant如果回滚,我们知道Coordinator的选择也只能是回滚。它们两者的选择不再是独立的做出,而是纠缠在了一起。 diff --git a/docs/theory/paxos/join-consensus.png b/docs/theory/paxos/join-consensus.png new file mode 100644 index 0000000000000000000000000000000000000000..f104575d0496ccc8c71fb995a9fab5ad8d5fa535 GIT binary patch literal 11875 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 YA13bwrS5S6Ft8Zund{bQKX~?k09Js>mH+?% literal 0 HcmV?d00001