# 5. å¤å¶
![](img/ch5.png)
> ä¸å¯è½åºéçä¸è¥¿æ¯ï¼'ä¸å¯è½'åºéçä¸è¥¿ææ¾èçç¹ç¹å°±æ¯ï¼ä¸æ¦ççåºéï¼é常就彻åºç©å®äºã
>
> ââéæ ¼ææ¯Â·äºå½æ¯ï¼1992ï¼
------
[TOC]
â å¤å¶æå³çå¨éè¿ç½ç»è¿æ¥çå¤å°æºå¨ä¸ä¿çç¸åæ°æ®çå¯æ¬ãæ£å¦å¨[第äºé¨åç®ä»](part-ii.md)ä¸æ讨论çé£æ ·ï¼æ们å¸æè½å¤å¶æ°æ®ï¼å¯è½åºäºåç§åæ ·çåå ï¼
* 使å¾æ°æ®ä¸ç¨æ·å¨å°çä¸æ¥è¿ï¼ä»èåå°å»¶è¿ï¼
* å³ä½¿ç³»ç»çä¸é¨ååºç°æ
éï¼ç³»ç»ä¹è½ç»§ç»å·¥ä½ï¼ä»èæé«å¯ç¨æ§ï¼
* æ©å±å¯ä»¥æ¥å读请æ±çæºå¨æ°éï¼ä»èæé«è¯»åååéï¼
æ¬ç« å°åè®¾ä½ çæ°æ®éé常å°ï¼æ¯å°æºå¨é½å¯ä»¥ä¿åæ´ä¸ªæ°æ®éçå¯æ¬ãå¨[第6ç« ](ch6.md)ä¸å°æ¾å®½è¿ä¸ªå设ï¼è®¨è®ºå¯¹å个æºå¨æ¥è¯´å¤ªå¤§çæ°æ®éçåå²ï¼åçï¼ãå¨åé¢çç« èä¸ï¼æ们å°è®¨è®ºå¤å¶æ°æ®ç³»ç»ä¸å¯è½åççåç§æ
éï¼ä»¥åå¦ä½å¤çè¿äºæ
éã
â å¦æå¤å¶ä¸çæ°æ®ä¸ä¼éæ¶é´èæ¹åï¼é£å¤å¶å°±å¾ç®åï¼å°æ°æ®å¤å¶å°æ¯ä¸ªèç¹ä¸æ¬¡å°±ä¸äºå¤§åãå¤å¶çå°é¾ä¹å¤å¨äºå¤çå¤å¶æ°æ®ç**åæ´ï¼changeï¼**ï¼è¿å°±æ¯æ¬ç« æè¦è®²çãæ们å°è®¨è®ºä¸ç§æµè¡çåæ´å¤å¶ç®æ³ï¼**åé¢å¯¼è
ï¼single leaderï¼**ï¼**å¤é¢å¯¼è
ï¼multi leaderï¼**å**æ é¢å¯¼è
ï¼leaderlessï¼**ãå ä¹ææåå¸å¼æ°æ®åºé½ä½¿ç¨è¿ä¸ç§æ¹æ³ä¹ä¸ã
â å¨å¤å¶æ¶éè¦è¿è¡è®¸å¤æè¡¡ï¼ä¾å¦ï¼ä½¿ç¨åæ¥å¤å¶è¿æ¯å¼æ¥å¤å¶ï¼å¦ä½å¤ç失败çå¯æ¬ï¼è¿äºé常æ¯æ°æ®åºä¸çé
ç½®é项ï¼ç»èå æ°æ®åºèå¼ï¼ä½åçå¨è®¸å¤ä¸åçå®ç°ä¸é½ç±»ä¼¼ãæ¬ç« ä¼è®¨è®ºè¿äºå³ççåæã
â æ°æ®åºçå¤å¶ç®å¾ä¸æ¯èç常è°äº ââ70年代ç 究å¾åºçåºæ¬ååè³ä»æ²¡æ太大ååã1ãï¼å 为ç½ç»çåºæ¬çº¦æä»ä¿æä¸åãç¶èå¨ç 究ä¹å¤ï¼è®¸å¤å¼å人åä»ç¶å设ä¸ä¸ªæ°æ®åºåªæä¸ä¸ªèç¹ãåå¸å¼æ°æ®åºå为主æµåªæ¯æè¿åççäºã许å¤ç¨åºåé½æ¯è¿ä¸é¢åçæ°æï¼å æ¤å¯¹äºè¯¸å¦**æç»ä¸è´æ§ï¼eventual consistencyï¼**çé®é¢åå¨è®¸å¤è¯¯è§£ãå¨â[å¤å¶å»¶è¿é®é¢](#å¤å¶å»¶è¿é®é¢)âä¸èï¼æ们å°æ´å 精确å°äºè§£æç»çä¸è´æ§ï¼å¹¶è®¨è®ºè¯¸å¦**读己ä¹åï¼read-your-writesï¼**å**åè°è¯»ï¼monotonic readï¼**ä¿è¯çå
容ã
## é¢å¯¼è
ä¸è¿½éè
â åå¨æ°æ®åºå¯æ¬çæ¯ä¸ªèç¹ç§°ä¸º**å¯æ¬ï¼replicaï¼**ãå½åå¨å¤ä¸ªå¯æ¬æ¶ï¼ä¼ä¸å¯é¿å
çåºç°ä¸ä¸ªé®é¢ï¼å¦ä½ç¡®ä¿æææ°æ®é½è½å¨äºææçå¯æ¬ä¸ï¼
â æ¯ä¸æ¬¡åæ°æ®åºçåå
¥æä½é½éè¦ä¼ æå°ææå¯æ¬ä¸ï¼å¦åå¯æ¬å°±ä¼å
å«ä¸ä¸æ ·çæ°æ®ãæ常è§ç解å³æ¹æ¡è¢«ç§°ä¸º**åºäºé¢å¯¼è
çå¤å¶ï¼leader-based replicationï¼**ï¼ä¹ç§°**主å¨/被å¨ï¼active/passiveï¼** æ **主/ä»ï¼master/slaveï¼**å¤å¶ï¼ï¼å¦[å¾5-1](#fig5-1.png)æ示ãå®çå·¥ä½åçå¦ä¸ï¼
1. å¯æ¬ä¹ä¸è¢«æå®ä¸º**é¢å¯¼è
ï¼leaderï¼**ï¼ä¹ç§°ä¸º **主åºï¼masterï¼** ï¼**é¦è¦ï¼primaryï¼**ãå½å®¢æ·ç«¯è¦åæ°æ®åºåå
¥æ¶ï¼å®å¿
é¡»å°è¯·æ±åéç»**é¢å¯¼è
**ï¼é¢å¯¼è
ä¼å°æ°æ°æ®åå
¥å
¶æ¬å°åå¨ã
2. å
¶ä»å¯æ¬è¢«ç§°ä¸º**追éè
ï¼followersï¼**ï¼äº¦ç§°ä¸º**åªè¯»å¯æ¬ï¼read replicasï¼**ï¼**ä»åºï¼slavesï¼**ï¼**次è¦ï¼ sencondariesï¼**ï¼**çå¤ï¼hot-standbyï¼**[^i]ãæ¯å½é¢å¯¼è
å°æ°æ°æ®åå
¥æ¬å°åå¨æ¶ï¼å®ä¹ä¼å°æ°æ®åæ´åéç»ææç追éè
ï¼ç§°ä¹ä¸º**å¤å¶æ¥å¿ï¼replication logï¼**è®°å½æ**åæ´æµï¼change streamï¼**ãæ¯ä¸ªè·éè
ä»é¢å¯¼è
æåæ¥å¿ï¼å¹¶ç¸åºæ´æ°å
¶æ¬å°æ°æ®åºå¯æ¬ï¼æ¹æ³æ¯æç
§é¢å¯¼è
å¤ççç¸å顺åºåºç¨ææåå
¥ã
3. å½å®¢æ·æ³è¦ä»æ°æ®åºä¸è¯»åæ°æ®æ¶ï¼å®å¯ä»¥åé¢å¯¼è
æ追éè
æ¥è¯¢ã ä½åªæé¢å¯¼è
æè½æ¥ååæä½ï¼ä»å®¢æ·ç«¯çè§åº¦æ¥çä»åºé½æ¯åªè¯»çï¼ã
[^i]: ä¸åç人对**çï¼hotï¼**ï¼**温ï¼warnï¼**ï¼**å·ï¼coldï¼** å¤ä»½æå¡å¨æä¸åçå®ä¹ã ä¾å¦å¨PostgreSQLä¸ï¼**çå¤ï¼hot standbyï¼**æçæ¯è½æ¥å客æ·ç«¯è¯»è¯·æ±çå¯æ¬ãè**温å¤ï¼warm standbyï¼**åªæ¯è¿½éé¢å¯¼è
ï¼ä½ä¸å¤ç客æ·ç«¯çä»»ä½æ¥è¯¢ã å°±æ¬ä¹¦èè¨ï¼è¿äºå·®å¼å¹¶ä¸éè¦ã
![](img/fig5-1.png)
**å¾5-1 åºäºé¢å¯¼è
(主-ä»)çå¤å¶**
â è¿ç§å¤å¶æ¨¡å¼æ¯è®¸å¤å
³ç³»æ°æ®åºçå
ç½®åè½ï¼å¦PostgreSQLï¼ä»9.0çæ¬å¼å§ï¼ï¼MySQLï¼Oracle Data Guard ã2ãåSQL ServerçAlwaysOnå¯ç¨æ§ç»ã3ãã å®ä¹è¢«ç¨äºä¸äºéå
³ç³»æ°æ®åºï¼å
æ¬MongoDBï¼RethinkDBåEspresso ã4ãã æåï¼åºäºé¢å¯¼è
çå¤å¶å¹¶ä¸ä»
éäºæ°æ®åºï¼åKafka ã5ãåRabbitMQé«å¯ç¨éåã6ãè¿æ ·çåå¸å¼æ¶æ¯ä»£çä¹ä½¿ç¨å®ã æäºç½ç»æ件系ç»ï¼ä¾å¦DRBDè¿æ ·çåå¤å¶è®¾å¤ä¹ä¸ä¹ç±»ä¼¼ã
### åæ¥å¤å¶ä¸å¼æ¥å¤å¶
â å¤å¶ç³»ç»çä¸ä¸ªéè¦ç»èæ¯ï¼å¤å¶æ¯**åæ¥ï¼synchronouslyï¼**åçè¿æ¯**å¼æ¥ï¼asynchronouslyï¼**åçã ï¼å¨å
³ç³»åæ°æ®åºä¸è¿é常æ¯ä¸ä¸ªé
置项ï¼å
¶ä»ç³»ç»é常硬ç¼ç 为å
¶ä¸ä¸ä¸ªï¼ã
â æ³è±¡[å¾5-1](fig5-1.png)ä¸åççæ
åµï¼ç½ç«çç¨æ·æ´æ°ä»ä»¬ç个人头åãå¨æ个æ¶é´ç¹ï¼å®¢æ·å主åºåéæ´æ°è¯·æ±ï¼ä¸ä¹
ä¹å主åºå°±æ¶å°äºè¯·æ±ãå¨æ个æ¶å»ï¼ä¸»åºåä¼å°æ°æ®åæ´è½¬åç»èªå·±çä»åºãæåï¼ä¸»åºéç¥å®¢æ·æ´æ°æåã
[å¾5-2](img/fig5-2.png)æ¾ç¤ºäºç³»ç»å个ç»ä»¶ä¹é´çéä¿¡ï¼ç¨æ·å®¢æ·ç«¯ï¼ä¸»åºå两个ä»åºãæ¶é´ä»å·¦å°å³æµå¨ã请æ±æååºæ¶æ¯ç¨ç²ç®å¤´è¡¨ç¤ºã
![](img/fig5-2.png)
**å¾5-2 åºäºé¢å¯¼è
çå¤å¶ï¼ä¸ä¸ªåæ¥ä»åºåä¸ä¸ªå¼æ¥ä»åº**
â å¨[å¾5-2]()ç示ä¾ä¸ï¼ä»åº1çå¤å¶æ¯åæ¥çï¼å¨åç¨æ·æ¥ååå
¥æåï¼å¹¶ä½¿ç»æ对å
¶ä»ç¨æ·å¯è§ä¹åï¼ä¸»åºéè¦çå¾
ä»åº1ç确认ï¼ç¡®ä¿ä»åº1å·²ç»æ¶å°åå
¥æä½ã以åå¨ä½¿åå
¥å¯¹å
¶ä»å®¢æ·ç«¯å¯è§ä¹åæ¥æ¶å°åå
¥ãè·éè
2çå¤å¶æ¯å¼æ¥çï¼ä¸»åºåéæ¶æ¯ï¼ä½ä¸çå¾
ä»åºçååºã
â å¨è¿å¹
å¾ä¸ï¼ä»åº2å¤çæ¶æ¯ååå¨ä¸ä¸ªæ¾çç延è¿ãé常æ
åµä¸ï¼å¤å¶çé度ç¸å½å¿«ï¼å¤§å¤æ°æ°æ®åºç³»ç»è½å¨ä¸ç§åä»åºåºç¨åæ´ï¼ä½å®ä»¬ä¸è½æä¾å¤å¶ç¨æ¶çä¿è¯ãæäºæ
åµä¸ï¼ä»åºå¯è½è½å主åºå åéææ´ä¹
ï¼ä¾å¦ï¼ä»åºæ£å¨ä»æ
éä¸æ¢å¤ï¼ç³»ç»å¨æ大容ééè¿è¿è¡ï¼æè
å¦æèç¹é´åå¨ç½ç»é®é¢ã
â åæ¥å¤å¶çä¼ç¹æ¯ï¼ä»åºä¿è¯æä¸ä¸»åºä¸è´çææ°æ°æ®å¯æ¬ãå¦æ主åºçªç¶å¤±æï¼æ们å¯ä»¥ç¡®ä¿¡è¿äºæ°æ®ä»ç¶è½å¨ä»åºä¸ä¸æ¾å°ã缺ç¹æ¯ï¼å¦æåæ¥ä»åºæ²¡æååºï¼æ¯å¦å®å·²ç»å´©æºï¼æè
åºç°ç½ç»æ
éï¼æå
¶å®ä»»ä½åå ï¼ï¼ä¸»åºå°±æ æ³å¤çåå
¥æä½ã主åºå¿
é¡»é»æ¢ææåå
¥ï¼å¹¶çå¾
åæ¥å¯æ¬å次å¯ç¨ã
â å æ¤ï¼å°ææä»åºé½è®¾ç½®ä¸ºåæ¥çæ¯ä¸åå®é
çï¼ä»»ä½ä¸ä¸ªèç¹çä¸æé½ä¼å¯¼è´æ´ä¸ªç³»ç»åæ»ä¸åãå®é
ä¸ï¼å¦æå¨æ°æ®åºä¸å¯ç¨åæ¥å¤å¶ï¼é常æå³çå
¶ä¸**ä¸ä¸ª**è·éè
æ¯åæ¥çï¼èå
¶ä»çåæ¯å¼æ¥çãå¦æåæ¥ä»åºåå¾ä¸å¯ç¨æç¼æ
¢ï¼å使ä¸ä¸ªå¼æ¥ä»åºåæ¥ãè¿ä¿è¯ä½ è³å°å¨ä¸¤ä¸ªèç¹ä¸æ¥æææ°çæ°æ®å¯æ¬ï¼ä¸»åºååæ¥ä»åºã è¿ç§é
ç½®ææ¶ä¹è¢«ç§°ä¸º**ååæ¥ï¼semi-synchronousï¼**ã7ãã
â é常æ
åµä¸ï¼åºäºé¢å¯¼è
çå¤å¶é½é
置为å®å
¨å¼æ¥ã å¨è¿ç§æ
åµä¸ï¼å¦æ主åºå¤±æä¸ä¸å¯æ¢å¤ï¼åä»»ä½å°æªå¤å¶ç»ä»åºçåå
¥é½ä¼ä¸¢å¤±ã è¿æå³çå³ä½¿å·²ç»å客æ·ç«¯ç¡®è®¤æåï¼åå
¥ä¹ä¸è½ä¿è¯**æä¹
ï¼Durableï¼**ã ç¶èï¼ä¸ä¸ªå®å
¨å¼æ¥çé
ç½®ä¹æä¼ç¹ï¼å³ä½¿ææçä»åºé½è½åäºï¼ä¸»åºä¹å¯ä»¥ç»§ç»å¤çåå
¥ã
â å¼±åçæä¹
æ§å¯è½å¬èµ·æ¥åæ¯ä¸ä¸ªåçæè¡·ï¼æ 论å¦ä½ï¼å¼æ¥å¤å¶å·²ç»è¢«å¹¿æ³ä½¿ç¨äºï¼ç¹å«å½æå¾å¤è¿½éè
ï¼æ追éè
å¼å°åå¸æ¶ã ç¨åå°å¨â[å¤å¶å»¶è¿é®é¢](#å¤å¶å»¶è¿é®é¢)âä¸åå°è¿ä¸ªé®é¢ã
> ### å
³äºå¤å¶çç 究
>
> 对äºå¼æ¥å¤å¶ç³»ç»èè¨ï¼ä¸»åºæ
éæ¶æå¯è½ä¸¢å¤±æ°æ®ãè¿å¯è½æ¯ä¸ä¸ªä¸¥éçé®é¢ï¼å æ¤ç 究人åä»å¨ç 究ä¸ä¸¢æ°æ®ä½ä»è½æä¾è¯å¥½æ§è½åå¯ç¨æ§çå¤å¶æ¹æ³ã ä¾å¦ï¼**é¾å¼å¤å¶**ã8,9ã]æ¯åæ¥å¤å¶çä¸ç§åä½ï¼å·²ç»å¨ä¸äºç³»ç»ï¼å¦Microsoft Azureåå¨ã10,11ãï¼ä¸æåå®ç°ã
>
> å¤å¶çä¸è´æ§ä¸**å
±è¯ï¼consensusï¼**ï¼ä½¿å 个èç¹å°±æ个å¼è¾¾æä¸è´ï¼ä¹é´æçå¯åçèç³»ï¼[第9ç« ](ch9.md)å°è¯¦ç»å°æ¢è®¨è¿ä¸é¢åçç论ãæ¬ç« 主è¦è®¨è®ºå®è·µä¸æ°æ®åºå¸¸ç¨çç®åå¤å¶å½¢å¼ã
>
### 设置æ°ä»åº
â ææ¶åéè¦è®¾ç½®ä¸ä¸ªæ°çä»åºï¼ä¹è®¸æ¯ä¸ºäºå¢å å¯æ¬çæ°éï¼ææ¿æ¢å¤±è´¥çèç¹ãå¦ä½ç¡®ä¿æ°çä»åºæ¥æ主åºæ°æ®ç精确å¯æ¬ï¼
â ç®åå°å°æ°æ®æ件ä»ä¸ä¸ªèç¹å¤å¶å°å¦ä¸ä¸ªèç¹é常æ¯ä¸å¤çï¼å®¢æ·ç«¯ä¸æåæ°æ®åºåå
¥æ°æ®ï¼æ°æ®æ»æ¯å¨ä¸æååï¼æ åçæ°æ®å¯æ¬ä¼å¨ä¸åçæ¶é´ç¹æ»æ¯ä¸ä¸æ ·ãå¤å¶çç»æå¯è½æ²¡æä»»ä½æä¹ã
â å¯ä»¥éè¿éå®æ°æ®åºï¼ä½¿å
¶ä¸å¯ç¨äºåå
¥ï¼æ¥ä½¿ç£çä¸çæ件ä¿æä¸è´ï¼ä½æ¯è¿ä¼è¿èé«å¯ç¨çç®æ ã幸è¿çæ¯ï¼æèµ·æ°çä»åºé常并ä¸éè¦åæºãä»æ¦å¿µä¸è®²ï¼è¿ç¨å¦ä¸æ示ï¼
1. å¨æ个æ¶å»è·å主åºçä¸è´æ§å¿«ç
§ï¼å¦æå¯è½ï¼ï¼èä¸å¿
éå®æ´ä¸ªæ°æ®åºã大å¤æ°æ°æ®åºé½å
·æè¿ä¸ªåè½ï¼å 为å®æ¯å¤ä»½å¿
éçã对äºæäºåºæ¯ï¼å¯è½éè¦ç¬¬ä¸æ¹å·¥å
·ï¼ä¾å¦MySQLçinnobackupex ã12ãã
2. å°å¿«ç
§å¤å¶å°æ°çä»åºèç¹ã
3. ä»åºè¿æ¥å°ä¸»åºï¼å¹¶æåå¿«ç
§ä¹ååççæææ°æ®åæ´ãè¿è¦æ±å¿«ç
§ä¸ä¸»åºå¤å¶æ¥å¿ä¸çä½ç½®ç²¾ç¡®å
³èã该ä½ç½®æä¸åçå称ï¼ä¾å¦ï¼PostgreSQLå°å
¶ç§°ä¸º**æ¥å¿åºåå·ï¼log sequence number, LSNï¼**ï¼MySQLå°å
¶ç§°ä¸º**äºè¿å¶æ¥å¿åæ ï¼binlog coordinatesï¼**ã
4. å½ä»åºå¤çå®å¿«ç
§ä¹å积åçæ°æ®åæ´ï¼æ们说å®**赶ä¸ï¼caught upï¼**äºä¸»åºãç°å¨å®å¯ä»¥ç»§ç»å¤ç主åºäº§ççæ°æ®ååäºã
建ç«ä»åºçå®é
æ¥éª¤å æ°æ®åºèå¼ãå¨æäºç³»ç»ä¸ï¼è¿ä¸ªè¿ç¨æ¯å®å
¨èªå¨åçï¼èå¨å¦å¤ä¸äºç³»ç»ä¸ï¼å®å¯è½æ¯ä¸ä¸ªéè¦ç±ç®¡çåæå¨æ§è¡çï¼æç¹ç¥ç§çå¤æ¥éª¤å·¥ä½æµã
### å¤çèç¹å®æº
â ç³»ç»ä¸çä»»ä½èç¹é½å¯è½å®æºï¼å¯è½å 为æå¤çæ
éï¼ä¹å¯è½ç±äºè®¡åå
çç»´æ¤ï¼ä¾å¦ï¼éå¯æºå¨ä»¥å®è£
å
æ ¸å®å
¨è¡¥ä¸ï¼ã对è¿ç»´èè¨ï¼è½å¨ç³»ç»ä¸ä¸ææå¡çæ
åµä¸éå¯å个èç¹å¥½å¤å¤å¤ãæ们çç®æ æ¯ï¼å³ä½¿ä¸ªå«èç¹å¤±æï¼ä¹è½ä¿ææ´ä¸ªç³»ç»è¿è¡ï¼å¹¶å°½å¯è½æ§å¶èç¹åæºå¸¦æ¥çå½±åã
â å¦ä½éè¿åºäºä¸»åºçå¤å¶å®ç°é«å¯ç¨ï¼
#### ä»åºå¤±æï¼è¿½èµ¶æ¢å¤
â å¨å
¶æ¬å°ç£çä¸ï¼æ¯ä¸ªä»åºè®°å½ä»ä¸»åºæ¶å°çæ°æ®åæ´ãå¦æä»åºå´©æºå¹¶éæ°å¯å¨ï¼æè
ï¼å¦æ主åºåä»åºä¹é´çç½ç»ææ¶ä¸æï¼åæ¯è¾å®¹ææ¢å¤ï¼ä»åºå¯ä»¥ä»æ¥å¿ä¸ç¥éï¼å¨åçæ
éä¹åå¤ççæåä¸ä¸ªäºå¡ãå æ¤ï¼ä»åºå¯ä»¥è¿æ¥å°ä¸»åºï¼å¹¶è¯·æ±å¨ä»åºæå¼è¿æ¥æ¶åççæææ°æ®åæ´ãå½åºç¨å®ææè¿äºåååï¼å®å°±èµ¶ä¸äºä¸»åºï¼å¹¶å¯ä»¥å以åä¸æ ·ç»§ç»æ¥æ¶æ°æ®åæ´æµã
#### 主åºå¤±æï¼æ
éåæ¢
â 主åºå¤±æå¤çèµ·æ¥ç¸å½æ£æï¼å
¶ä¸ä¸ä¸ªä»åºéè¦è¢«æå为æ°ç主åºï¼éè¦éæ°é
置客æ·ç«¯ï¼ä»¥å°å®ä»¬çåæä½åéç»æ°ç主åºï¼å
¶ä»ä»åºéè¦å¼å§æåæ¥èªæ°ä¸»åºçæ°æ®åæ´ãè¿ä¸ªè¿ç¨è¢«ç§°ä¸º**æ
éåæ¢ï¼failoverï¼**ã
â æ
éåæ¢å¯ä»¥æå¨è¿è¡ï¼éç¥ç®¡çå主åºæäºï¼å¹¶éåå¿
è¦çæ¥éª¤æ¥å建æ°ç主åºï¼æèªå¨è¿è¡ãèªå¨æ
éåæ¢è¿ç¨é常ç±ä»¥ä¸æ¥éª¤ç»æï¼
1. 确认主åºå¤±æãæå¾å¤äºæ
å¯è½ä¼åºéï¼å´©æºï¼åçµï¼ç½ç»é®é¢ççã没æä¸æ ä¸å¤±çæ¹æ³æ¥æ£æµåºç°äºä»ä¹é®é¢ï¼æ以大å¤æ°ç³»ç»åªæ¯ç®å使ç¨**è¶
æ¶ï¼Timeoutï¼**ï¼èç¹é¢ç¹å°ç¸äºæ¥åä¼ éæ¶æ¯ï¼å¹¶ä¸å¦æä¸ä¸ªèç¹å¨ä¸æ®µæ¶é´å
ï¼ä¾å¦30ç§ï¼æ²¡æååºï¼å°±è®¤ä¸ºå®æäºï¼å 为计åå
ç»´æ¤èæ
æå
³é主åºä¸ç®ï¼ã
2. éæ©ä¸ä¸ªæ°ç主åºãè¿å¯ä»¥éè¿é举è¿ç¨ï¼ä¸»åºç±å©ä½å¯æ¬ä»¥å¤æ°é举产çï¼æ¥å®æï¼æè
å¯ä»¥ç±ä¹åéå®ç**æ§å¶å¨èç¹ï¼controller nodeï¼**æ¥æå®æ°ç主åºã主åºçæ佳人éé常æ¯æ¥ææ§ä¸»åºææ°æ°æ®å¯æ¬çä»åºï¼æå°åæ°æ®æ失ï¼ã让ææçèç¹åæä¸ä¸ªæ°çé¢å¯¼è
ï¼æ¯ä¸ä¸ª**å
±è¯**é®é¢ï¼å°å¨[第9ç« ](ch9.md)详ç»è®¨è®ºã
3. éæ°é
置系ç»ä»¥å¯ç¨æ°ç主åºã客æ·ç«¯ç°å¨éè¦å°å®ä»¬çå请æ±åéç»æ°ä¸»åºï¼å°å¨â[请æ±è·¯ç±](ch6.md#请æ±è·¯ç±)âä¸è®¨è®ºè¿ä¸ªé®é¢ï¼ãå¦æèé¢å¯¼åæ¥ï¼å¯è½ä»ç¶è®¤ä¸ºèªå·±æ¯ä¸»åºï¼æ²¡ææè¯å°å
¶ä»å¯æ¬å·²ç»è®©å®ä¸å°äºãç³»ç»éè¦ç¡®ä¿èé¢å¯¼è®¤å¯æ°é¢å¯¼ï¼æ为ä¸ä¸ªä»åºã
æ
éåæ¢ä¼åºç°å¾å¤å¤§éº»ç¦ï¼
* å¦æ使ç¨å¼æ¥å¤å¶ï¼åæ°ä¸»åºå¯è½æ²¡ææ¶å°è主åºå®æºåæåçåå
¥æä½ãå¨éåºæ°ä¸»åºåï¼å¦æè主åºéæ°å å
¥é群ï¼æ°ä¸»åºå¨æ¤æé´å¯è½ä¼æ¶å°å²çªçåå
¥ï¼é£è¿äºåå
¥è¯¥å¦ä½å¤çï¼æ常è§ç解å³æ¹æ¡æ¯ç®å丢å¼è主åºæªå¤å¶çåå
¥ï¼è¿å¾å¯è½æç ´å®¢æ·å¯¹äºæ°æ®æä¹
æ§çææã
* å¦ææ°æ®åºéè¦åå
¶ä»å¤é¨åå¨ç¸åè°ï¼é£ä¹ä¸¢å¼åå
¥å
容æ¯æå
¶å±é©çæä½ãä¾å¦å¨GitHub ã13ãçä¸åºäºæ
ä¸ï¼ä¸ä¸ªè¿æ¶çMySQLä»åºè¢«æå为主åºãæ°æ®åºä½¿ç¨èªå¢IDä½ä¸ºä¸»é®ï¼å 为æ°ä¸»åºç计æ°å¨è½åäºè主åºç计æ°å¨ï¼æ以æ°ä¸»åºéæ°åé
äºä¸äºå·²ç»è¢«è主åºåé
æçIDä½ä¸ºä¸»é®ãè¿äºä¸»é®ä¹å¨Redisä¸ä½¿ç¨ï¼ä¸»é®éç¨ä½¿å¾MySQLåRedisä¸æ°æ®äº§çä¸ä¸è´ï¼æå导è´ä¸äºç§ææ°æ®æ³æ¼å°é误çç¨æ·æä¸ã
* åçæäºæ
éæ¶ï¼è§[第8ç« ](ch8.md)ï¼å¯è½ä¼åºç°ä¸¤ä¸ªèç¹é½ä»¥ä¸ºèªå·±æ¯ä¸»åºçæ
åµãè¿ç§æ
åµç§°ä¸º**èè£(split brain)**ï¼é常å±é©ï¼å¦æ两个主åºé½å¯ä»¥æ¥ååæä½ï¼å´æ²¡æå²çªè§£å³æºå¶ï¼åè§â[å¤é¢å¯¼è
å¤å¶](#å¤é¢å¯¼è
å¤å¶)âï¼ï¼é£ä¹æ°æ®å°±å¯è½ä¸¢å¤±ææåãä¸äºç³»ç»éåäºå®å
¨é²èæªæ½ï¼å½æ£æµå°ä¸¤ä¸ªä¸»åºèç¹åæ¶åå¨æ¶ä¼å
³éå
¶ä¸ä¸ä¸ªèç¹[^ii]ï¼ä½è®¾è®¡ç²ç³çæºå¶å¯è½æåä¼å¯¼è´ä¸¤ä¸ªèç¹é½è¢«å
³éã14ãã
[^ii]: è¿ç§æºå¶ç§°ä¸º**å±è½ï¼fencingï¼**ï¼å
满ææ
çæ¯è¯æ¯ï¼**çå½¼ä¹å¤´ï¼Shoot The Other Node In The Head, STONITHï¼**ã
* 主åºè¢«å®£åæ»äº¡ä¹åçæ£ç¡®è¶
æ¶åºè¯¥æä¹é
ç½®ï¼å¨ä¸»åºå¤±æçæ
åµä¸ï¼è¶
æ¶æ¶é´è¶é¿ï¼æå³çæ¢å¤æ¶é´ä¹è¶é¿ãä½æ¯å¦æè¶
æ¶è®¾ç½®å¤ªçï¼åå¯è½ä¼åºç°ä¸å¿
è¦çæ
éåæ¢ãä¾å¦ï¼ä¸´æ¶è´è½½å³°å¼å¯è½å¯¼è´èç¹çååºæ¶é´è¶
æ¶ï¼æç½ç»æ
éå¯è½å¯¼è´æ°æ®å
延è¿ãå¦æç³»ç»å·²ç»å¤äºé«è´è½½æç½ç»é®é¢çå°æ°ä¹ä¸ï¼é£ä¹ä¸å¿
è¦çæ
éåæ¢å¯è½ä¼è®©æ
åµåå¾æ´ç³ç³ã
è¿äºé®é¢æ²¡æç®åç解å³æ¹æ¡ãå æ¤ï¼å³ä½¿è½¯ä»¶æ¯æèªå¨æ
éåæ¢ï¼ä¸å°è¿ç»´å¢éè¿æ¯æ´æ¿ææå¨æ§è¡æ
éåæ¢ã
èç¹æ
éãä¸å¯é çç½ç»ã对å¯æ¬ä¸è´æ§ï¼æä¹
æ§ï¼å¯ç¨æ§å延è¿çæè¡¡ ï¼è¿äºé®é¢å®é
ä¸æ¯åå¸å¼ç³»ç»ä¸çåºæ¬é®é¢ã[第8ç« ](ch8.md)å[第9ç« ](ch9.md)å°æ´æ·±å
¥å°è®¨è®ºå®ä»¬ã
### å¤å¶æ¥å¿çå®ç°
åºäºä¸»åºçå¤å¶åºå±æ¯å¦ä½å·¥ä½çï¼å®è·µä¸æ好å ç§ä¸åçå¤å¶æ¹å¼ï¼æ以å
ç®è¦å°çä¸ä¸ã
#### åºäºè¯å¥çå¤å¶
â å¨æç®åçæ
åµä¸ï¼ä¸»åºè®°å½ä¸å®æ§è¡çæ¯ä¸ªåå
¥è¯·æ±ï¼**è¯å¥ï¼statementï¼**ï¼å¹¶å°è¯¥è¯å¥æ¥å¿åéç»å
¶ä»åºã对äºå
³ç³»æ°æ®åºæ¥è¯´ï¼è¿æå³çæ¯ä¸ª`INSERT`ï¼`UPDATE`æ`DELETE`è¯å¥é½è¢«è½¬åç»æ¯ä¸ªä»åºï¼æ¯ä¸ªä»åºè§£æ并æ§è¡è¯¥SQLè¯å¥ï¼å°±åä»å®¢æ·ç«¯æ¶å°ä¸æ ·ã
è½ç¶å¬ä¸å»å¾åçï¼ä½æå¾å¤é®é¢ä¼æç ¸è¿ç§å¤å¶æ¹å¼ï¼
* ä»»ä½è°ç¨**éç¡®å®æ§å½æ°ï¼nondeterministicï¼**çè¯å¥ï¼å¯è½ä¼å¨æ¯ä¸ªå¯æ¬ä¸çæä¸åçå¼ãä¾å¦ï¼ä½¿ç¨`NOW()`è·åå½åæ¥ææ¶é´ï¼æ使ç¨`RAND()`è·åä¸ä¸ªéæºæ°ã
* å¦æè¯å¥ä½¿ç¨äº**èªå¢åï¼auto incrementï¼**ï¼æè
ä¾èµäºæ°æ®åºä¸çç°ææ°æ®ï¼ä¾å¦ï¼`UPDATE ... WHERE <æäºæ¡ä»¶>`ï¼ï¼åå¿
é¡»å¨æ¯ä¸ªå¯æ¬ä¸æç
§å®å
¨ç¸åç顺åºæ§è¡å®ä»¬ï¼å¦åå¯è½ä¼äº§çä¸åçææãå½æå¤ä¸ªå¹¶åæ§è¡çäºå¡æ¶ï¼è¿å¯è½æ为ä¸ä¸ªéå¶ã
* æå¯ä½ç¨çè¯å¥ï¼ä¾å¦ï¼è§¦åå¨ï¼åå¨è¿ç¨ï¼ç¨æ·å®ä¹çå½æ°ï¼å¯è½ä¼å¨æ¯ä¸ªå¯æ¬ä¸äº§çä¸åçå¯ä½ç¨ï¼é¤éå¯ä½ç¨æ¯ç»å¯¹ç¡®å®çã
çç¡®æåæ³ç»å¼è¿äºé®é¢ ââä¾å¦ï¼å½è¯å¥è¢«è®°å½æ¶ï¼ä¸»åºå¯ä»¥ç¨åºå®çè¿åå¼æ¿æ¢ä»»ä½ä¸ç¡®å®çå½æ°è°ç¨ï¼ä»¥ä¾¿ä»åºè·å¾ç¸åçå¼ãä½æ¯ç±äºè¾¹ç¼æ
åµå®å¨å¤ªå¤äºï¼ç°å¨é常ä¼éæ©å
¶ä»çå¤å¶æ¹æ³ã
â åºäºè¯å¥çå¤å¶å¨5.1çæ¬åçMySQLä¸ä½¿ç¨ãå 为å®ç¸å½ç´§åï¼ç°å¨ææ¶åä¹è¿å¨ç¨ãä½ç°å¨å¨é»è®¤æ
åµä¸ï¼å¦æè¯å¥ä¸åå¨ä»»ä½ä¸ç¡®å®æ§ï¼MySQLä¼åæ¢å°åºäºè¡çå¤å¶ï¼ç¨å讨论ï¼ã VoltDB使ç¨äºåºäºè¯å¥çå¤å¶ï¼ä½è¦æ±äºå¡å¿
é¡»æ¯ç¡®å®æ§çï¼ä»¥æ¤æ¥ä¿è¯å®å
¨ã15ãã
#### ä¼ è¾é¢åå¼æ¥å¿ï¼WALï¼
å¨[第3ç« ](ch3.md)ä¸ï¼æ们讨论äºåå¨å¼æå¦ä½å¨ç£çä¸è¡¨ç¤ºæ°æ®ï¼å¹¶ä¸æ们åç°ï¼é常åæä½é½æ¯è¿½å å°æ¥å¿ä¸ï¼
* 对äºæ¥å¿ç»æåå¨å¼æï¼è¯·åé
â[SSTablesåLSMæ ](ch3.md#SSTablesåLSMæ )âï¼ï¼æ¥å¿æ¯ä¸»è¦çåå¨ä½ç½®ãæ¥å¿æ®µå¨åå°å缩ï¼å¹¶è¿è¡åå¾åæ¶ã
* 对äºè¦åå个ç£çåç[Bæ ](ch3.md#Bæ )ï¼æ¯æ¬¡ä¿®æ¹é½ä¼å
åå
¥**é¢åå¼æ¥å¿ï¼Write Ahead Log, WALï¼**ï¼ä»¥ä¾¿å´©æºåç´¢å¼å¯ä»¥æ¢å¤å°ä¸ä¸ªä¸è´çç¶æã
å¨ä»»ä½ä¸ç§æ
åµä¸ï¼æ¥å¿é½æ¯å
å«æææ°æ®åºåå
¥çä»
追å åèåºåãå¯ä»¥ä½¿ç¨å®å
¨ç¸åçæ¥å¿å¨å¦ä¸ä¸ªèç¹ä¸æ建å¯æ¬ï¼é¤äºå°æ¥å¿åå
¥ç£çä¹å¤ï¼ä¸»åºè¿å¯ä»¥éè¿ç½ç»å°å
¶åéç»å
¶ä»åºã
â å½ä»åºåºç¨è¿ä¸ªæ¥å¿æ¶ï¼å®ä¼å»ºç«å主åºä¸æ¨¡ä¸æ ·æ°æ®ç»æçå¯æ¬ã
â PostgreSQLåOracleç使ç¨è¿ç§å¤å¶æ¹æ³ã16ãã主è¦ç¼ºç¹æ¯æ¥å¿è®°å½çæ°æ®é常åºå±ï¼WALå
å«åªäºç£çåä¸çåªäºåèåçäºæ´æ¹ãè¿ä½¿å¤å¶ä¸åå¨å¼æç´§å¯è¦åãå¦ææ°æ®åºå°å
¶åå¨æ ¼å¼ä»ä¸ä¸ªçæ¬æ´æ¹ä¸ºå¦ä¸ä¸ªçæ¬ï¼é常ä¸å¯è½å¨ä¸»åºåä»åºä¸è¿è¡ä¸åçæ¬çæ°æ®åºè½¯ä»¶ã
â çä¸å»è¿å¯è½åªæ¯ä¸ä¸ªå¾®å°çå®ç°ç»èï¼ä½å´å¯è½å¯¹è¿ç»´äº§ç巨大çå½±åãå¦æå¤å¶åè®®å
许ä»åºä½¿ç¨æ¯ä¸»åºæ´æ°ç软件çæ¬ï¼åå¯ä»¥å
å级ä»åºï¼ç¶åæ§è¡æ
éåæ¢ï¼ä½¿å级åçèç¹ä¹ä¸æ为æ°ç主åºï¼ä»èæ§è¡æ°æ®åºè½¯ä»¶çé¶åæºå级ãå¦æå¤å¶åè®®ä¸å
许çæ¬ä¸å¹é
ï¼ä¼ è¾WALç»å¸¸åºç°è¿ç§æ
åµï¼ï¼åæ¤ç±»å级éè¦åæºã
#### é»è¾æ¥å¿å¤å¶ï¼åºäºè¡ï¼
â å¦ä¸ç§æ¹æ³æ¯ï¼å¤å¶ååå¨å¼æ使ç¨ä¸åçæ¥å¿æ ¼å¼ï¼è¿æ ·å¯ä»¥ä½¿å¤å¶æ¥å¿ä»åå¨å¼æå
é¨å离åºæ¥ãè¿ç§å¤å¶æ¥å¿è¢«ç§°ä¸ºé»è¾æ¥å¿ï¼ä»¥å°å
¶ä¸åå¨å¼æçï¼ç©çï¼æ°æ®è¡¨ç¤ºåºåå¼æ¥ã
å
³ç³»æ°æ®åºçé»è¾æ¥å¿é常æ¯ä»¥è¡çç²åº¦æ述对æ°æ®åºè¡¨çåå
¥çè®°å½åºåï¼
* 对äºæå
¥çè¡ï¼æ¥å¿å
å«ææåçæ°å¼ã
* 对äºå é¤çè¡ï¼æ¥å¿å
å«è¶³å¤çä¿¡æ¯æ¥å¯ä¸æ è¯å·²å é¤çè¡ãé常æ¯ä¸»é®ï¼ä½æ¯å¦æ表ä¸æ²¡æ主é®ï¼åéè¦è®°å½ææåçæ§å¼ã
* 对äºæ´æ°çè¡ï¼æ¥å¿å
å«è¶³å¤çä¿¡æ¯æ¥å¯ä¸æ è¯æ´æ°çè¡ï¼ä»¥åææåçæ°å¼ï¼æè³å°ææå·²æ´æ¹çåçæ°å¼ï¼ã
ä¿®æ¹å¤è¡çäºå¡ä¼çæå¤ä¸ªè¿æ ·çæ¥å¿è®°å½ï¼åé¢è·çä¸æ¡è®°å½ï¼æåºäºå¡å·²ç»æ交ã MySQLçäºè¿å¶æ¥å¿ï¼å½é
置为使ç¨åºäºè¡çå¤å¶æ¶ï¼ä½¿ç¨è¿ç§æ¹æ³ã17ãã
â ç±äºé»è¾æ¥å¿ä¸åå¨å¼æå
é¨å离ï¼å æ¤å¯ä»¥æ´å®¹æå°ä¿æååå
¼å®¹ï¼ä»è使é¢å¯¼è
åè·éè
è½å¤è¿è¡ä¸åçæ¬çæ°æ®åºè½¯ä»¶çè³ä¸åçåå¨å¼æã
â 对äºå¤é¨åºç¨ç¨åºæ¥è¯´ï¼é»è¾æ¥å¿æ ¼å¼ä¹æ´å®¹æ解æãå¦æè¦å°æ°æ®åºçå
容åéå°å¤é¨ç³»ç»ï¼å¦æ°æ®ï¼ï¼è¿ä¸ç¹å¾æç¨ï¼ä¾å¦å¤å¶å°æ°æ®ä»åºè¿è¡ç¦»çº¿åæï¼æ建ç«èªå®ä¹ç´¢å¼åç¼åã18ãã è¿ç§ææ¯è¢«ç§°ä¸º**æè·æ°æ®åæ´ï¼change data captureï¼**ï¼ç¬¬11ç« å°éæ°è®²å°å®ã
#### åºäºè§¦åå¨çå¤å¶
â å°ç®å为æ¢æè¿°çå¤å¶æ¹æ³æ¯ç±æ°æ®åºç³»ç»å®ç°çï¼ä¸æ¶åä»»ä½åºç¨ç¨åºä»£ç ãå¨å¾å¤æ
åµä¸ï¼è¿å°±æ¯ä½ æ³è¦çãä½å¨æäºæ
åµä¸éè¦æ´å¤ççµæ´»æ§ãä¾å¦ï¼å¦ææ¨åªæ³å¤å¶æ°æ®çä¸ä¸ªåéï¼æè
æ³ä»ä¸ç§æ°æ®åºå¤å¶å°å¦ä¸ç§æ°æ®åºï¼æè
å¦ææ¨éè¦å²çªè§£å³é»è¾ï¼åé
â[å¤çåå
¥å²çª](#å¤çåå
¥å²çª)âï¼ï¼åå¯è½éè¦å°å¤å¶ç§»å¨å°åºç¨ç¨åºå±ã
â ä¸äºå·¥å
·ï¼å¦Oracle Golden Gate ã19ãï¼å¯ä»¥éè¿è¯»åæ°æ®åºæ¥å¿ï¼ä½¿å¾å
¶ä»åºç¨ç¨åºå¯ä»¥ä½¿ç¨æ°æ®ãå¦ä¸ç§æ¹æ³æ¯ä½¿ç¨è®¸å¤å
³ç³»æ°æ®åºèªå¸¦çåè½ï¼è§¦åå¨ååå¨è¿ç¨ã
â 触åå¨å
许æ¨æ³¨åå¨æ°æ®åºç³»ç»ä¸åçæ°æ®æ´æ¹ï¼åå
¥äºå¡ï¼æ¶èªå¨æ§è¡çèªå®ä¹åºç¨ç¨åºä»£ç ã触åå¨ææºä¼å°æ´æ¹è®°å½å°ä¸ä¸ªåç¬ç表ä¸ï¼ä½¿ç¨å¤é¨ç¨åºè¯»åè¿ä¸ªè¡¨ï¼åå ä¸ä»»ä½ä¸å¡é»è¾å¤çï¼ä¼åå°æ°æ®åæ´å¤å¶å°å¦ä¸ä¸ªç³»ç»å»ãä¾å¦ï¼Databus for Oracle ã20ãåBucardo for Postgres ã21ãå°±æ¯è¿æ ·å·¥ä½çã
â åºäºè§¦åå¨çå¤å¶é常æ¯å
¶ä»å¤å¶æ¹æ³å
·ææ´é«çå¼éï¼å¹¶ä¸æ¯æ°æ®åºçå
ç½®å¤å¶æ´å®¹æåºéï¼ä¹æå¾å¤éå¶ãç¶èç±äºå
¶çµæ´»æ§ï¼ä»ç¶æ¯å¾æç¨çã
## å¤å¶å»¶è¿é®é¢
â 容å¿èç¹æ
éåªæ¯éè¦å¤å¶çä¸ä¸ªåå ãæ£å¦å¨[第äºé¨å](part-ii.md)çä»ç»ä¸æå°çï¼å¦ä¸ä¸ªåå æ¯å¯æ©å±æ§ï¼å¤çæ¯å个æºå¨æ´å¤ç请æ±ï¼å延è¿ï¼è®©å¯æ¬å¨å°çä½ç½®ä¸æ´æ¥è¿ç¨æ·ï¼ã
â åºäºä¸»åºçå¤å¶è¦æ±ææåå
¥é½ç±å个èç¹å¤çï¼ä½åªè¯»æ¥è¯¢å¯ä»¥ç±ä»»ä½å¯æ¬å¤çãæ以对äºè¯»å¤åå°çåºæ¯ï¼Webä¸ç常è§æ¨¡å¼ï¼ï¼ä¸ä¸ªæå¸å¼åçéæ©æ¯å建å¾å¤ä»åºï¼å¹¶å°è¯»è¯·æ±åæ£å°ææçä»åºä¸å»ãè¿æ ·è½åå°ä¸»åºçè´è½½ï¼å¹¶å
许åæè¿çå¯æ¬åé读请æ±ã
â å¨è¿ç§æ©å±ä½ç³»ç»æä¸ï¼åªéæ·»å æ´å¤ç追éè
ï¼å°±å¯ä»¥æé«åªè¯»è¯·æ±çæå¡å®¹éãä½æ¯ï¼è¿ç§æ¹æ³å®é
ä¸åªéç¨äºå¼æ¥å¤å¶ââå¦æå°è¯åæ¥å¤å¶å°ææ追éè
ï¼åå个èç¹æ
éæç½ç»ä¸æå°ä½¿æ´ä¸ªç³»ç»æ æ³åå
¥ãèä¸è¶å¤çèç¹è¶æå¯è½ä¼è¢«å
³éï¼æ以å®å
¨åæ¥çé
ç½®æ¯é常ä¸å¯é çã
â ä¸å¹¸çæ¯ï¼å½åºç¨ç¨åºä»å¼æ¥ä»åºè¯»åæ¶ï¼å¦æä»åºè½åï¼å®å¯è½ä¼çå°è¿æ¶çä¿¡æ¯ãè¿ä¼å¯¼è´æ°æ®åºä¸åºç°ææ¾çä¸ä¸è´ï¼åæ¶å¯¹ä¸»åºåä»åºæ§è¡ç¸åçæ¥è¯¢ï¼å¯è½å¾å°ä¸åçç»æï¼å 为并éææçåå
¥é½åæ å¨ä»åºä¸ãè¿ç§ä¸ä¸è´åªæ¯ä¸ä¸ªææ¶çç¶æââå¦æåæ¢åå
¥æ°æ®åºå¹¶çå¾
ä¸æ®µæ¶é´ï¼ä»åºæç»ä¼èµ¶ä¸å¹¶ä¸ä¸»åºä¿æä¸è´ãåºäºè¿ä¸ªåå ï¼è¿ç§æåºè¢«ç§°ä¸º**æç»ä¸è´æ§ï¼eventually consistencyï¼**[^iii]ã22,23ã
[^iii]: éæ ¼ææ¯Â·ç¹éï¼Douglas Terryï¼ç人åé äºæ¯è¯æç»ä¸è´æ§ã ã24ã 并ç»ç±Werner Vogels ã22ãæ¨å¹¿ï¼æ为许å¤NoSQL项ç®çæå¼ã ç¶èï¼ä¸åªæNoSQLæ°æ®åºæ¯æç»ä¸è´çï¼å
³ç³»åæ°æ®åºä¸çå¼æ¥å¤å¶è¿½éè
ä¹æç¸åçç¹æ§ã
â âæç»âä¸è¯æ
æå«ç³ä¸æ¸
ï¼æ»çæ¥è¯´ï¼å¯æ¬è½åçç¨åº¦æ¯æ²¡æéå¶çãå¨æ£å¸¸çæä½ä¸ï¼**å¤å¶å»¶è¿ï¼replication lagï¼**ï¼å³åå
¥ä¸»åºå°åæ è³ä»åºä¹é´ç延è¿ï¼å¯è½ä»
ä»
æ¯å åä¹ä¸ç§ï¼å¨å®è·µä¸å¹¶ä¸æ¾ç¼ãä½å¦æç³»ç»å¨æ¥è¿æéçæ
åµä¸è¿è¡ï¼æç½ç»ä¸åå¨é®é¢ï¼å»¶è¿å¯ä»¥è½»èæ举å°è¶
è¿å ç§ï¼çè³å åéã
â å 为æ»åæ¶é´å¤ªé¿å¼å
¥çä¸ä¸è´æ§ï¼å¯ä¸ä»
æ¯ä¸ä¸ªç论é®é¢ï¼æ´æ¯åºç¨è®¾è®¡ä¸ä¼éå°ççå®é®é¢ãæ¬èå°éç¹ä»ç»ä¸ä¸ªç±å¤å¶å»¶è¿é®é¢çä¾åï¼å¹¶ç®è¿°è§£å³è¿äºé®é¢çä¸äºæ¹æ³ã
### 读己ä¹å
â 许å¤åºç¨è®©ç¨æ·æ交ä¸äºæ°æ®ï¼ç¶åæ¥çä»ä»¬æ交çå
容ãå¯è½æ¯ç¨æ·æ°æ®åºä¸çè®°å½ï¼ä¹å¯è½æ¯å¯¹è®¨è®ºä¸»é¢çè¯è®ºï¼æå
¶ä»ç±»ä¼¼çå
容ãæ交æ°æ°æ®æ¶ï¼å¿
é¡»å°å
¶åéç»é¢å¯¼è
ï¼ä½æ¯å½ç¨æ·æ¥çæ°æ®æ¶ï¼å¯ä»¥ä»è¿½éè
读åãå¦ææ°æ®ç»å¸¸è¢«æ¥çï¼ä½åªæ¯å¶å°åå
¥ï¼è¿æ¯é常åéçã
â ä½å¯¹äºå¼æ¥å¤å¶ï¼é®é¢å°±æ¥äºãå¦[å¾5-3](fig5-3.png)æ示ï¼å¦æç¨æ·å¨åå
¥å马ä¸å°±æ¥çæ°æ®ï¼åæ°æ°æ®å¯è½å°æªå°è¾¾å¯æ¬ã对ç¨æ·èè¨ï¼çèµ·æ¥å¥½åæ¯åæ交çæ°æ®ä¸¢å¤±äºï¼ç¨æ·ä¼ä¸é«å
´ï¼å¯ä»¥ç解ã
![](img/fig5-3.png)
**å¾5-3 ç¨æ·åå
¥åä»æ§å¯æ¬ä¸è¯»åæ°æ®ãéè¦åå读(read-after-write)çä¸è´æ§æ¥é²æ¢è¿ç§å¼å¸¸**
â å¨è¿ç§æ
åµä¸ï¼æ们éè¦**读åä¸è´æ§ï¼read-after-write consistencyï¼**ï¼ä¹ç§°ä¸º**读己ä¹åä¸è´æ§ï¼read-your-writes consistencyï¼**ã24ããè¿æ¯ä¸ä¸ªä¿è¯ï¼å¦æç¨æ·éæ°å 载页é¢ï¼ä»ä»¬æ»ä¼çå°ä»ä»¬èªå·±æ交çä»»ä½æ´æ°ãå®ä¸ä¼å¯¹å
¶ä»ç¨æ·çåå
¥ååºæ¿è¯ºï¼å
¶ä»ç¨æ·çæ´æ°å¯è½ç¨çæä¼çå°ãå®ä¿è¯ç¨æ·èªå·±çè¾å
¥å·²è¢«æ£ç¡®ä¿åã
å¦ä½å¨åºäºé¢å¯¼è
çå¤å¶ç³»ç»ä¸å®ç°è¯»åä¸è´æ§ï¼æåç§å¯è½çææ¯ï¼è¿é说ä¸äºï¼
* 读ç¨æ·**å¯è½å·²ç»ä¿®æ¹è¿**çå
容æ¶ï¼é½ä»ä¸»åºè¯»ï¼è¿å°±è¦æ±æä¸äºæ¹æ³ï¼ä¸ç¨å®é
æ¥è¯¢å°±å¯ä»¥ç¥éç¨æ·æ¯å¦ä¿®æ¹äºæäºä¸è¥¿ã举个ä¾åï¼ç¤¾äº¤ç½ç»ä¸çç¨æ·ä¸ªäººèµæä¿¡æ¯é常åªè½ç±ç¨æ·æ¬äººç¼è¾ï¼èä¸è½ç±å
¶ä»äººç¼è¾ãå æ¤ä¸ä¸ªç®åçè§åæ¯ï¼ä»ä¸»åºè¯»åç¨æ·èªå·±çæ¡£æ¡ï¼å¨ä»åºè¯»åå
¶ä»ç¨æ·çæ¡£æ¡ã
* å¦æåºç¨ä¸ç大é¨åå
容é½å¯è½è¢«ç¨æ·ç¼è¾ï¼é£è¿ç§æ¹æ³å°±æ²¡ç¨äºï¼å 为大é¨åå
容é½å¿
é¡»ä»ä¸»åºè¯»åï¼æ©å®¹è¯»å°±æ²¡ææäºï¼ãå¨è¿ç§æ
åµä¸å¯ä»¥ä½¿ç¨å
¶ä»æ åæ¥å³å®æ¯å¦ä»ä¸»åºè¯»åãä¾å¦å¯ä»¥è·è¸ªä¸æ¬¡æ´æ°çæ¶é´ï¼å¨ä¸æ¬¡æ´æ°åçä¸åéå
ï¼ä»ä¸»åºè¯»ãè¿å¯ä»¥çæ§ä»åºçå¤å¶å»¶è¿ï¼é²æ¢ä»»åä»»ä½æ»åè¶
è¿ä¸åéå°åºä»åºååºæ¥è¯¢ã
* 客æ·ç«¯å¯ä»¥è®°ä½æè¿ä¸æ¬¡åå
¥çæ¶é´æ³ï¼ç³»ç»éè¦ç¡®ä¿ä»åºä¸ºè¯¥ç¨æ·æä¾ä»»ä½æ¥è¯¢æ¶ï¼è¯¥æ¶é´æ³åçåæ´é½å·²ç»ä¼ æå°äºæ¬ä»åºä¸ãå¦æå½åä»åºä¸å¤æ°ï¼åå¯ä»¥ä»å¦ä¸ä¸ªä»åºè¯»ï¼æè
çå¾
ä»åºè¿½èµ¶ä¸æ¥ã
æ¶é´æ³å¯ä»¥æ¯é»è¾æ¶é´æ³ï¼æ示åå
¥é¡ºåºçä¸è¥¿ï¼ä¾å¦æ¥å¿åºåå·ï¼æå®é
ç³»ç»æ¶éï¼å¨è¿ç§æ
åµä¸ï¼æ¶éåæ¥åå¾è³å
³éè¦ï¼åé
â[ä¸å¯é çæ¶é](ch8.md#ä¸å¯é çæ¶é)âï¼ã
* å¦ææ¨çå¯æ¬åå¸å¨å¤ä¸ªæ°æ®ä¸å¿ï¼åºäºå¯ç¨æ§ç®çä¸ç¨æ·å°½éå¨å°çä¸æ¥è¿ï¼ï¼åä¼å¢å å¤ææ§ãä»»ä½éè¦ç±é¢å¯¼è
æä¾æå¡ç请æ±é½å¿
须路ç±å°å
å«ä¸»åºçæ°æ®ä¸å¿ã
å¦ä¸ç§å¤æçæ
åµæ¯ï¼å¦æåä¸ä¸ªç¨æ·ä»å¤ä¸ªè®¾å¤è¯·æ±æå¡ï¼ä¾å¦æ¡é¢æµè§å¨å移å¨APPãè¿ç§æ
åµä¸å¯è½å°±éè¦æä¾è·¨è®¾å¤çåå读ä¸è´æ§ï¼å¦æç¨æ·å¨æ个设å¤ä¸è¾å
¥äºä¸äºä¿¡æ¯ï¼ç¶åå¨å¦ä¸ä¸ªè®¾å¤ä¸æ¥çï¼ååºè¯¥çå°ä»ä»¬åè¾å
¥çä¿¡æ¯ã
å¨è¿ç§æ
åµä¸ï¼è¿æä¸äºéè¦èèçé®é¢ï¼
* è®°ä½ç¨æ·ä¸æ¬¡æ´æ°æ¶é´æ³çæ¹æ³åå¾æ´å å°é¾ï¼å 为ä¸å°è®¾å¤ä¸è¿è¡çç¨åºä¸ç¥éå¦ä¸å°è®¾å¤ä¸åçäºä»ä¹ãå
æ°æ®éè¦ä¸ä¸ªä¸å¿åå¨ã
* å¦æå¯æ¬åå¸å¨ä¸åçæ°æ®ä¸å¿ï¼å¾é¾ä¿è¯æ¥èªä¸å设å¤çè¿æ¥ä¼è·¯ç±å°åä¸æ°æ®ä¸å¿ã ï¼ä¾å¦ï¼ç¨æ·çå°å¼è®¡ç®æºä½¿ç¨å®¶åºå®½å¸¦è¿æ¥ï¼è移å¨è®¾å¤ä½¿ç¨èçªæ°æ®ç½ç»ï¼å设å¤çç½ç»è·¯çº¿å¯è½å®å
¨ä¸åï¼ãå¦æä½ çæ¹æ³éè¦è¯»ä¸»åºï¼å¯è½é¦å
éè¦ææ¥èªåä¸ç¨æ·ç请æ±è·¯ç±å°åä¸ä¸ªæ°æ®ä¸å¿ã
### åè°è¯»
â ä»å¼æ¥ä»åºè¯»å第äºä¸ªå¼å¸¸ä¾åæ¯ï¼ç¨æ·å¯è½ä¼éå°**æ¶å
åæµï¼moving backward in timeï¼**ã
â å¦æç¨æ·ä»ä¸åä»åºè¿è¡å¤æ¬¡è¯»åï¼å°±å¯è½åçè¿ç§æ
åµãä¾å¦ï¼[å¾5-4](img/fig5-4.png)æ¾ç¤ºäºç¨æ·2345两次è¿è¡ç¸åçæ¥è¯¢ï¼é¦å
æ¥è¯¢äºä¸ä¸ªå»¶è¿å¾å°çä»åºï¼ç¶åæ¯ä¸ä¸ªå»¶è¿è¾å¤§çä»åºã ï¼å¦æç¨æ·å·æ°ç½é¡µï¼èæ¯ä¸ªè¯·æ±è¢«è·¯ç±å°ä¸ä¸ªéæºçæå¡å¨ï¼è¿ç§æ
åµæ¯å¾æå¯è½çãï¼ç¬¬ä¸ä¸ªæ¥è¯¢è¿åæè¿ç±ç¨æ·1234æ·»å çè¯è®ºï¼ä½æ¯ç¬¬äºä¸ªæ¥è¯¢ä¸è¿åä»»ä½ä¸è¥¿ï¼å 为æ»åçä»åºè¿æ²¡ææååå
¥å
容ãå¨ææä¸ç¸æ¯ç¬¬ä¸ä¸ªæ¥è¯¢ï¼ç¬¬äºä¸ªæ¥è¯¢æ¯å¨æ´æ©çæ¶é´ç¹æ¥è§å¯ç³»ç»ãå¦æ第ä¸ä¸ªæ¥è¯¢æ²¡æè¿åä»»ä½å
容ï¼é£é®é¢å¹¶ä¸å¤§ï¼å 为ç¨æ·2345å¯è½ä¸ç¥éç¨æ·1234æè¿æ·»å äºè¯è®ºãä½å¦æç¨æ·2345å
çè§ç¨æ·1234çè¯è®ºï¼ç¶ååçå°å®æ¶å¤±ï¼é£ä¹å¯¹äºç¨æ·2345ï¼å°±å¾è®©äººå¤´å¤§äºã
![](img/fig5-4.png)
**å¾5-4 ç¨æ·é¦å
ä»æ°å¯æ¬è¯»åï¼ç¶åä»æ§å¯æ¬è¯»åãæ¶å
åæµã为äºé²æ¢è¿ç§å¼å¸¸ï¼æ们éè¦åè°ç读åã**
â **åè°è¯»ï¼Monotonic readsï¼**ã23ãæ¯è¿ç§å¼å¸¸ä¸ä¼åççä¿è¯ãè¿æ¯ä¸ä¸ªæ¯**强ä¸è´æ§ï¼strong consistencyï¼**æ´å¼±ï¼ä½æ¯**æç»ä¸è´æ§ï¼eventually consistencyï¼**æ´å¼ºçä¿è¯ãå½è¯»åæ°æ®æ¶ï¼æ¨å¯è½ä¼çå°ä¸ä¸ªæ§å¼ï¼åè°è¯»åä»
æå³çå¦æä¸ä¸ªç¨æ·é¡ºåºå°è¿è¡å¤æ¬¡è¯»åï¼åä»ä»¬ä¸ä¼çå°æ¶é´åéï¼å³ï¼å¦æå
å读åå°è¾æ°çæ°æ®ï¼åç»è¯»åä¸ä¼å¾å°æ´æ§çæ°æ®ã
â å®ç°åè°è¯»åçä¸ç§æ¹å¼æ¯ç¡®ä¿æ¯ä¸ªç¨æ·æ»æ¯ä»åä¸ä¸ªå¯æ¬è¿è¡è¯»åï¼ä¸åçç¨æ·å¯ä»¥ä»ä¸åçå¯æ¬è¯»åï¼ãä¾å¦ï¼å¯ä»¥åºäºç¨æ·IDçæ£åæ¥éæ©å¯æ¬ï¼èä¸æ¯éæºéæ©å¯æ¬ãä½æ¯ï¼å¦æ该å¯æ¬å¤±è´¥ï¼ç¨æ·çæ¥è¯¢å°éè¦éæ°è·¯ç±å°å¦ä¸ä¸ªå¯æ¬ã
### ä¸è´åç¼è¯»
第ä¸ä¸ªå¤å¶å»¶è¿ä¾åè¿åäºå æå¾ã æ³è±¡ä¸ä¸Poonså
çåCake夫人ä¹é´ç以ä¸ç®ç对è¯ï¼
> *Mr. Poons*
> â Mrs. Cakeï¼ä½ è½çå°å¤è¿çæªæ¥ï¼
>
> *Mrs. Cake*
> â é常约åç§éï¼Mr. Poons.
è¿ä¸¤å¥è¯ä¹é´æå æå
³ç³»ï¼Cake夫人å¬å°äºPoonså
ççé®é¢å¹¶åçäºè¿ä¸ªé®é¢ã
â ç°å¨ï¼æ³è±¡ç¬¬ä¸ä¸ªäººæ£å¨éè¿ä»åºæ¥å¬è¿ä¸ªå¯¹è¯ã Cake夫人说çå
容æ¯ä»ä¸ä¸ªå»¶è¿å¾ä½çä»åºè¯»åçï¼ä½Poonså
çæ说çå
容ï¼ä»åºç延è¿è¦å¤§çå¤ï¼è§[å¾5-5](img/fig5-5.png)ï¼ã äºæ¯ï¼è¿ä¸ªè§å¯è
ä¼å¬å°ä»¥ä¸å
容ï¼
> *Mrs. Cake*
> â é常约åç§éï¼Mr. Poons.
>
> *Mr. Poons*
> â Mrs. Cakeï¼ä½ è½çå°å¤è¿çæªæ¥ï¼
对äºè§å¯è
æ¥è¯´ï¼çèµ·æ¥å¥½åCake夫人å¨Poonså
çåé®åå°±åçäºè¿ä¸ªé®é¢ã
è¿ç§è¶
è½å让人å°è±¡æ·±å»ï¼ä½ä¹ä¼æ人æç³æ¶ãã25ãã
![](img/fig5-5.png)
**å¾5-5 å¦ææäºååºçå¤å¶é度æ
¢äºå
¶ä»ååºï¼é£ä¹è§å¯è
å¨çå°é®é¢ä¹åå¯è½ä¼çå°çæ¡ã**
â é²æ¢è¿ç§å¼å¸¸ï¼éè¦å¦ä¸ç§ç±»åçä¿è¯ï¼**ä¸è´åç¼è¯»ï¼consistent prefix readsï¼**ã23ãã è¿ä¸ªä¿è¯è¯´ï¼å¦æä¸ç³»ååå
¥ææ个顺åºåçï¼é£ä¹ä»»ä½äººè¯»åè¿äºåå
¥æ¶ï¼ä¹ä¼çè§å®ä»¬ä»¥åæ ·ç顺åºåºç°ã
â è¿æ¯**ååºï¼partitionedï¼**ï¼**åçï¼shardedï¼**ï¼æ°æ®åºä¸çä¸ä¸ªç¹æ®é®é¢ï¼å°å¨ç¬¬6ç« ä¸è®¨è®ºãå¦ææ°æ®åºæ»æ¯ä»¥ç¸åç顺åºåºç¨åå
¥ï¼å读åæ»æ¯ä¼çå°ä¸è´çåç¼ï¼æ以è¿ç§å¼å¸¸ä¸ä¼åçãä½æ¯å¨è®¸å¤åå¸å¼æ°æ®åºä¸ï¼ä¸åçååºç¬ç«è¿è¡ï¼å æ¤ä¸åå¨**å
¨å±åå
¥é¡ºåº**ï¼å½ç¨æ·ä»æ°æ®åºä¸è¯»åæ°æ®æ¶ï¼å¯è½ä¼çå°æ°æ®åºçæäºé¨åå¤äºè¾æ§çç¶æï¼èæäºå¤äºè¾æ°çç¶æã
â ä¸ç§è§£å³æ¹æ¡æ¯ï¼ç¡®ä¿ä»»ä½å æç¸å
³çåå
¥é½åå
¥ç¸åçååºã对äºæäºæ æ³é«æå®æè¿ç§æä½çåºç¨ï¼è¿æä¸äºæ¾å¼è·è¸ªå æä¾èµå
³ç³»çç®æ³ï¼æ¬ä¹¦å°å¨âå
³ç³»ä¸å¹¶åâä¸èä¸è¿åè¿ä¸ªä¸»é¢ã
### å¤å¶å»¶è¿ç解å³æ¹æ¡
â å¨ä½¿ç¨æç»ä¸è´çç³»ç»æ¶ï¼å¦æå¤å¶å»¶è¿å¢å å°å åéçè³å å°æ¶ï¼ååºè¯¥èèåºç¨ç¨åºçè¡ä¸ºãå¦æçæ¡æ¯â没é®é¢âï¼é£å¾å¥½ãä½å¦æç»æ对äºç¨æ·æ¥è¯´æ¯ä¸å¥½ä½éªï¼é£ä¹è®¾è®¡ç³»ç»æ¥æä¾æ´å¼ºçä¿è¯æ¯å¾éè¦çï¼ä¾å¦**åå读**ãæææ¯å¼æ¥å¤å¶å´å设å¤å¶æ¯åæ¥çï¼è¿æ¯å¾å¤éº»ç¦çæ ¹æºã
â å¦åæè¿°ï¼åºç¨ç¨åºå¯ä»¥æä¾æ¯åºå±æ°æ®åºæ´å¼ºæåçä¿è¯ï¼ä¾å¦éè¿ä¸»åºè¿è¡æç§è¯»åãä½å¨åºç¨ç¨åºä»£ç ä¸å¤çè¿äºé®é¢æ¯å¤æçï¼å®¹æåºéã
â å¦æåºç¨ç¨åºå¼å人åä¸å¿
æ
å¿å¾®å¦çå¤å¶é®é¢ï¼å¹¶å¯ä»¥ä¿¡èµä»ä»¬çæ°æ®åºâåäºæ£ç¡®çäºæ
âï¼é£è¯¥å¤å¥½åãè¿å°±æ¯**äºå¡ï¼transactionï¼**åå¨çåå ï¼**æ°æ®åºéè¿äºå¡æä¾å¼ºå¤§çä¿è¯**ï¼æ以åºç¨ç¨åºå¯ä»¥æ´åç®åã
â åèç¹äºå¡å·²ç»åå¨äºå¾é¿æ¶é´ãç¶èå¨èµ°ååå¸å¼ï¼å¤å¶åååºï¼æ°æ®åºæ¶ï¼è®¸å¤ç³»ç»æ¾å¼äºäºå¡ã声称äºå¡å¨æ§è½åå¯ç¨æ§ä¸ç代价太é«ï¼å¹¶æè¨å¨å¯æ©å±ç³»ç»ä¸æç»ä¸è´æ§æ¯ä¸å¯é¿å
çãè¿ä¸ªåè¿°æä¸äºéçï¼ä½è¿äºç®åäºï¼æ¬ä¹¦å
¶ä½é¨åå°æåºæ´ä¸ºç»è´çè§ç¹ã第ä¸ç« å第ä¹ç« å°åå°äºå¡çè¯é¢ï¼å¹¶è®¨è®ºä¸äºæ¿ä»£æºå¶ã
## å¤ä¸»å¤å¶
â æ¬ç« å°ç®å为æ¢ï¼æ们åªèè使ç¨å个é¢å¯¼è
çå¤å¶æ¶æã è½ç¶è¿æ¯ä¸ç§å¸¸è§çæ¹æ³ï¼ä½ä¹æä¸äºæ趣çéæ©ã
â åºäºé¢å¯¼è
çå¤å¶æä¸ä¸ªä¸»è¦ç缺ç¹ï¼åªæä¸ä¸ªä¸»åºï¼èææçåå
¥é½å¿
é¡»éè¿å®ãå¦æåºäºä»»ä½åå ï¼ä¾å¦å主åºä¹é´çç½ç»è¿æ¥ä¸æï¼æ æ³è¿æ¥å°ä¸»åºï¼ å°±æ æ³åæ°æ®åºåå
¥ã
[^iv]: å¦ææ°æ®åºè¢«ååºï¼è§ç¬¬6ç« ï¼ï¼æ¯ä¸ªååºé½æä¸ä¸ªé¢å¯¼ã ä¸åçååºå¯è½å¨ä¸åçèç¹ä¸æå
¶é¢å¯¼è
ï¼ä½æ¯æ¯ä¸ªååºå¿
é¡»æä¸ä¸ªé¢å¯¼è
èç¹ã
â åºäºé¢å¯¼è
çå¤å¶æ¨¡åçèªç¶å»¶ä¼¸æ¯å
许å¤ä¸ªèç¹æ¥ååå
¥ã å¤å¶ä»ç¶ä»¥åæ ·çæ¹å¼åçï¼å¤çåå
¥çæ¯ä¸ªèç¹é½å¿
é¡»å°è¯¥æ°æ®æ´æ¹è½¬åç»ææå
¶ä»èç¹ã 称ä¹ä¸º**å¤é¢å¯¼è
é
ç½®**ï¼ä¹ç§°å¤ä¸»ãå¤æ´»å¤å¶ï¼ã å¨è¿ç§æ
åµä¸ï¼æ¯ä¸ªé¢å¯¼è
åæ¶æ®æ¼å
¶ä»é¢å¯¼è
ç追éè
ã
### å¤ä¸»å¤å¶çåºç¨åºæ¯
â å¨å个æ°æ®ä¸å¿å
é¨ä½¿ç¨å¤ä¸ªä¸»åºå¾å°æ¯ææä¹çï¼å 为好å¤å¾å°è¶
è¿å¤ææ§ç代价ã ä½å¨ä¸äºæ
åµä¸ï¼å¤æ´»é
ç½®æ¯ä¹åççã
#### è¿ç»´å¤ä¸ªæ°æ®ä¸å¿
â åå¦ä½ æä¸ä¸ªæ°æ®åºï¼å¯æ¬åæ£å¨å¥½å 个ä¸åçæ°æ®ä¸å¿ï¼ä¹è®¸è¿æ ·å¯ä»¥å®¹å¿å个æ°æ®ä¸å¿çæ
éï¼æå°çä¸æ´æ¥è¿ç¨æ·ï¼ã 使ç¨å¸¸è§çåºäºé¢å¯¼è
çå¤å¶è®¾ç½®ï¼ä¸»åºå¿
é¡»ä½äºå
¶ä¸ä¸ä¸ªæ°æ®ä¸å¿ï¼ä¸ææåå
¥é½å¿
é¡»ç»è¿è¯¥æ°æ®ä¸å¿ã
â å¤é¢å¯¼è
é
ç½®ä¸å¯ä»¥å¨æ¯ä¸ªæ°æ®ä¸å¿é½æ主åºã [å¾5-6](img/fig5-6.png)å±ç¤ºäºè¿ä¸ªæ¶æçæ ·åã å¨æ¯ä¸ªæ°æ®ä¸å¿å
使ç¨å¸¸è§ç主ä»å¤å¶ï¼å¨æ°æ®ä¸å¿ä¹é´ï¼æ¯ä¸ªæ°æ®ä¸å¿ç主åºé½ä¼å°å
¶æ´æ¹å¤å¶å°å
¶ä»æ°æ®ä¸å¿ç主åºä¸ã
![](img/fig5-6.png)
**å¾5-6 è·¨å¤ä¸ªæ°æ®ä¸å¿çå¤ä¸»å¤å¶**
æ们æ¥æ¯è¾ä¸ä¸å¨è¿ç»´å¤ä¸ªæ°æ®ä¸å¿æ¶ï¼å主åå¤ä¸»çéåºæ
åµã
***æ§è½***
â å¨åæ´»é
ç½®ä¸ï¼æ¯ä¸ªåå
¥é½å¿
须穿è¿äºèç½ï¼è¿å
¥ä¸»åºæå¨çæ°æ®ä¸å¿ãè¿å¯è½ä¼å¢å åå
¥æ¶é´ï¼å¹¶å¯è½è¿èäºè®¾ç½®å¤ä¸ªæ°æ®ä¸å¿çåå¿ãå¨å¤æ´»é
ç½®ä¸ï¼æ¯ä¸ªåæä½é½å¯ä»¥å¨æ¬å°æ°æ®ä¸å¿è¿è¡å¤çï¼å¹¶ä¸å
¶ä»æ°æ®ä¸å¿å¼æ¥å¤å¶ãå æ¤ï¼æ°æ®ä¸å¿ä¹é´çç½ç»å»¶è¿å¯¹ç¨æ·æ¥è¯´æ¯éæçï¼è¿æå³çæè§å°çæ§è½å¯è½ä¼æ´å¥½ã
***容å¿æ°æ®ä¸å¿åæº***
â å¨å主é
ç½®ä¸ï¼å¦æ主åºæå¨çæ°æ®ä¸å¿åçæ
éï¼æ
éåæ¢å¯ä»¥ä½¿å¦ä¸ä¸ªæ°æ®ä¸å¿éç追éè
æ为é¢å¯¼è
ãå¨å¤æ´»é
ç½®ä¸ï¼æ¯ä¸ªæ°æ®ä¸å¿å¯ä»¥ç¬ç«äºå
¶ä»æ°æ®ä¸å¿ç»§ç»è¿è¡ï¼å¹¶ä¸å½åçæ
éçæ°æ®ä¸å¿å½éæ¶ï¼å¤å¶ä¼èªå¨èµ¶ä¸ã
***容å¿ç½ç»é®é¢***
â æ°æ®ä¸å¿ä¹é´çéä¿¡é常穿è¿å
Œ
±äºèç½ï¼è¿å¯è½ä¸å¦æ°æ®ä¸å¿å
çæ¬å°ç½ç»å¯é ãå主é
置对è¿æ°æ®ä¸å¿é´çè¿æ¥é®é¢é常ææï¼å 为éè¿è¿ä¸ªè¿æ¥è¿è¡çåæä½æ¯åæ¥çãéç¨å¼æ¥å¤å¶åè½çå¤æ´»é
ç½®é常è½æ´å¥½å°æ¿åç½ç»é®é¢ï¼ä¸´æ¶çç½ç»ä¸æ并ä¸ä¼å¦¨ç¢æ£å¨å¤ççåå
¥ã
â æäºæ°æ®åºé»è®¤æ
åµä¸æ¯æå¤ä¸»é
ç½®ï¼ä½ä½¿ç¨å¤é¨å·¥å
·å®ç°ä¹å¾å¸¸è§ï¼ä¾å¦ç¨äºMySQLçTungsten Replicator ã26ãï¼ç¨äºPostgreSQLçBDRã27ã以åç¨äºOracleçGoldenGate ã19ãã
â 尽管å¤ä¸»å¤å¶æè¿äºä¼å¿ï¼ä½ä¹æä¸ä¸ªå¾å¤§ç缺ç¹ï¼ä¸¤ä¸ªä¸åçæ°æ®ä¸å¿å¯è½ä¼åæ¶ä¿®æ¹ç¸åçæ°æ®ï¼åå²çªæ¯å¿
须解å³çï¼å¦[å¾5-6](img/fig5-6.png)ä¸â[å²çªè§£å³](#å²çªè§£å³)âï¼ãæ¬ä¹¦å°å¨â[å¤çåå
¥å²çª](#å¤çåå
¥å²çª)âä¸è¯¦ç»è®¨è®ºè¿ä¸ªé®é¢ã
â ç±äºå¤ä¸»å¤å¶å¨è®¸å¤æ°æ®åºä¸é½å±äºæ¹è£
çåè½ï¼æ以常常åå¨å¾®å¦çé
置缺é·ï¼ä¸ç»å¸¸ä¸å
¶ä»æ°æ®åºåè½ä¹é´åºç°æå¤çååºãä¾å¦èªå¢ä¸»é®ã触åå¨ãå®æ´æ§çº¦æçï¼é½å¯è½ä¼æ麻ç¦ãå æ¤ï¼å¤ä¸»å¤å¶å¾å¾è¢«è®¤ä¸ºæ¯å±é©çé¢åï¼åºå°½å¯è½é¿å
ã28ãã
#### éè¦ç¦»çº¿æä½ç客æ·ç«¯
â å¤ä¸»å¤å¶çå¦ä¸ç§éç¨åºæ¯æ¯ï¼åºç¨ç¨åºå¨æç½ä¹åä»ç¶éè¦ç»§ç»å·¥ä½ã
â ä¾å¦ï¼èèææºï¼ç¬è®°æ¬çµèåå
¶ä»è®¾å¤ä¸çæ¥ååºç¨ãæ 论设å¤ç®åæ¯å¦æäºèç½è¿æ¥ï¼ä½ éè¦è½éæ¶æ¥çä½ çä¼è®®ï¼ååºè¯»å请æ±ï¼ï¼è¾å
¥æ°çä¼è®®ï¼ååºåå
¥è¯·æ±ï¼ãå¦æå¨ç¦»çº¿ç¶æä¸è¿è¡ä»»ä½æ´æ¹ï¼å设å¤ä¸æ¬¡ä¸çº¿æ¶ï¼éè¦ä¸æå¡å¨åå
¶ä»è®¾å¤åæ¥ã
â å¨è¿ç§æ
åµä¸ï¼æ¯ä¸ªè®¾å¤é½æä¸ä¸ªå
å½é¢å¯¼è
çæ¬å°æ°æ®åºï¼å®æ¥åå请æ±ï¼ï¼å¹¶ä¸å¨ææ设å¤ä¸çæ¥åå¯æ¬ä¹é´åæ¥æ¶ï¼åå¨å¼æ¥çå¤ä¸»å¤å¶è¿ç¨ãå¤å¶å»¶è¿å¯è½æ¯å å°æ¶çè³å 天ï¼å
·ä½åå³äºä½æ¶å¯ä»¥è®¿é®äºèç½ã
â ä»æ¶æçè§åº¦æ¥çï¼è¿ç§è®¾ç½®å®é
ä¸ä¸æ°æ®ä¸å¿ä¹é´çå¤é¢å¯¼è
å¤å¶ç±»ä¼¼ï¼æ¯ä¸ªè®¾å¤é½æ¯ä¸ä¸ªâæ°æ®ä¸å¿âï¼èå®ä»¬ä¹é´çç½ç»è¿æ¥æ¯æ度ä¸å¯é çãä»åå²ä¸åç±»æ¥ååæ¥åè½çç ´çå®ç°å¯ä»¥çåºï¼æ³æå¤æ´»é
好æ¯å¤ä¹å°é¾çä¸ä»¶äºã
â æä¸äºå·¥å
·æ¨å¨ä½¿è¿ç§å¤é¢å¯¼è
é
ç½®æ´å®¹æãä¾å¦ï¼CouchDBå°±æ¯ä¸ºè¿ç§æä½æ¨¡å¼è设计çã29ãã
#### ååç¼è¾
â å®æ¶åä½ç¼è¾åºç¨ç¨åºå
许å¤ä¸ªäººåæ¶ç¼è¾ææ¡£ãä¾å¦ï¼Etherpad ã30ãåGoogle Docs ã31ãå
许å¤äººåæ¶ç¼è¾ææ¬ææ¡£æçµåè¡¨æ ¼ï¼è¯¥ç®æ³å¨â[èªå¨å²çªè§£å³](#èªå¨å²çªè§£å³)âä¸ç®è¦è®¨è®ºï¼ãæ们é常ä¸ä¼å°åä½å¼ç¼è¾è§ä¸ºæ°æ®åºå¤å¶é®é¢ï¼ä½ä¸åé¢æå°ç离线ç¼è¾ç¨ä¾æ许å¤ç¸ä¼¼ä¹å¤ãå½ä¸ä¸ªç¨æ·ç¼è¾ææ¡£æ¶ï¼æåçæ´æ¹å°ç«å³åºç¨å°å
¶æ¬å°å¯æ¬ï¼Webæµè§å¨æ客æ·ç«¯åºç¨ç¨åºä¸çææ¡£ç¶æï¼ï¼å¹¶å¼æ¥å¤å¶å°æå¡å¨åç¼è¾åä¸ææ¡£çä»»ä½å
¶ä»ç¨æ·ã
â å¦æè¦ä¿è¯ä¸ä¼åçç¼è¾å²çªï¼ååºç¨ç¨åºå¿
é¡»å
åå¾ææ¡£çéå®ï¼ç¶åç¨æ·æè½å¯¹å
¶è¿è¡ç¼è¾ãå¦æå¦ä¸ä¸ªç¨æ·æ³è¦ç¼è¾åä¸ä¸ªææ¡£ï¼ä»ä»¬é¦å
å¿
é¡»çå°ç¬¬ä¸ä¸ªç¨æ·æ交修æ¹å¹¶éæ¾éå®ãè¿ç§åä½æ¨¡å¼ç¸å½äºå¨é¢å¯¼è
ä¸è¿è¡äº¤æçåé¢å¯¼è
å¤å¶ã
â ä½æ¯ï¼ä¸ºäºå éåä½ï¼æ¨å¯è½å¸æå°æ´æ¹çåä½è®¾ç½®å¾é常å°ï¼ä¾å¦ï¼ä¸ä¸ªæé®ï¼ï¼å¹¶é¿å
éå®ãè¿ç§æ¹æ³å
许å¤ä¸ªç¨æ·åæ¶è¿è¡ç¼è¾ï¼ä½åæ¶ä¹å¸¦æ¥äºå¤é¢å¯¼è
å¤å¶çææææï¼å
æ¬éè¦è§£å³å²çªã32ãã
### å¤çåå
¥å²çª
â å¤é¢å¯¼è
å¤å¶çæ大é®é¢æ¯å¯è½åçåå²çªï¼è¿æå³çéè¦è§£å³å²çªã
â ä¾å¦ï¼èèä¸ä¸ªç±ä¸¤ä¸ªç¨æ·åæ¶ç¼è¾çç»´åºé¡µé¢ï¼å¦[å¾5-7](img/fig5-7.png)æ示ãç¨æ·1å°é¡µé¢çæ é¢ä»Aæ´æ¹ä¸ºBï¼å¹¶ä¸ç¨æ·2åæ¶å°æ é¢ä»Aæ´æ¹ä¸ºCãæ¯ä¸ªç¨æ·çæ´æ¹å·²æååºç¨å°å
¶æ¬å°ä¸»åºãä½å½å¼æ¥å¤å¶æ¶ï¼ä¼åç°å²çªã33ããå主æ°æ®åºä¸ä¸ä¼åºç°æ¤é®é¢ã
![](img/fig5-7.png)
**å¾5-7 两个主åºåæ¶æ´æ°åä¸è®°å½å¼èµ·çåå
¥å²çª**
#### åæ¥ä¸å¼æ¥å²çªæ£æµ
â å¨å主æ°æ®åºä¸ï¼ç¬¬äºä¸ªåå
¥å°è¢«é»å¡ï¼å¹¶çå¾
第ä¸ä¸ªåå
¥å®æï¼æä¸æ¢ç¬¬äºä¸ªåå
¥äºå¡ï¼å¼ºå¶ç¨æ·éè¯ãå¦ä¸æ¹é¢ï¼å¨å¤æ´»é
ç½®ä¸ï¼ä¸¤ä¸ªåå
¥é½æ¯æåçï¼å¹¶ä¸å¨ç¨åçæ¶é´ç¹ä»
ä»
å¼æ¥å°æ£æµå°å²çªãé£æ¶è¦æ±ç¨æ·è§£å³å²çªå¯è½ä¸ºæ¶å·²æã
â ååä¸ï¼å¯ä»¥ä½¿å²çªæ£æµåæ¥ - å³çå¾
åå
¥è¢«å¤å¶å°ææå¯æ¬ï¼ç¶åååè¯ç¨æ·åå
¥æåãä½æ¯ï¼éè¿è¿æ ·åï¼æ¨å°å¤±å»å¤ä¸»å¤å¶ç主è¦ä¼ç¹ï¼å
许æ¯ä¸ªå¯æ¬ç¬ç«æ¥ååå
¥ãå¦ææ¨æ³è¦åæ¥å²çªæ£æµï¼é£ä¹æ¨å¯ä»¥ä½¿ç¨å主ç¨åºå¤å¶ã
#### é¿å
å²çª
â å¤çå²çªçæç®åççç¥å°±æ¯é¿å
å®ä»¬ï¼å¦æåºç¨ç¨åºå¯ä»¥ç¡®ä¿ç¹å®è®°å½çææåå
¥é½éè¿åä¸ä¸ªé¢å¯¼è
ï¼é£ä¹å²çªå°±ä¸ä¼åçãç±äºå¤é¢å¯¼è
å¤å¶å¤çç许å¤å®ç°å²çªç¸å½ä¸å¥½ï¼é¿å
å²çªæ¯ä¸ä¸ªç»å¸¸æ¨èçæ¹æ³ã34ãã
â ä¾å¦ï¼å¨ç¨æ·å¯ä»¥ç¼è¾èªå·±çæ°æ®çåºç¨ç¨åºä¸ï¼å¯ä»¥ç¡®ä¿æ¥èªç¹å®ç¨æ·ç请æ±å§ç»è·¯ç±å°åä¸æ°æ®ä¸å¿ï¼å¹¶ä½¿ç¨è¯¥æ°æ®ä¸å¿çé¢å¯¼è
è¿è¡è¯»åãä¸åçç¨æ·å¯è½æä¸åçâ家åºâæ°æ®ä¸å¿ï¼å¯è½æ ¹æ®ç¨æ·çå°çä½ç½®éæ©ï¼ï¼ä½ä»ä»»ä½ç¨æ·çè§åº¦æ¥çï¼é
ç½®åºæ¬ä¸é½æ¯åä¸çé¢å¯¼è
ã
â ä½æ¯ï¼ææ¶æ¨å¯è½éè¦æ´æ¹æå®çè®°å½ç主åºââå¯è½æ¯å 为ä¸ä¸ªæ°æ®ä¸å¿åºç°æ
éï¼æ¨éè¦å°æµééæ°è·¯ç±å°å¦ä¸ä¸ªæ°æ®ä¸å¿ï¼æè
å¯è½æ¯å 为ç¨æ·å·²ç»è¿ç§»å°å¦ä¸ä¸ªä½ç½®ï¼ç°å¨æ´æ¥è¿ä¸åçæ°æ®ä¸å¿ãå¨è¿ç§æ
åµä¸ï¼å²çªé¿å
ä¼ä¸æï¼ä½ å¿
é¡»å¤çä¸å主åºåæ¶åå
¥çå¯è½æ§ã
#### æ¶æè³ä¸è´çç¶æ
â å主æ°æ®åºæ顺åºåºç¨åæä½ï¼å¦æåä¸ä¸ªå段æå¤ä¸ªæ´æ°ï¼åæåä¸ä¸ªåæä½å°ç¡®å®è¯¥å段çæç»å¼ã
â å¨å¤ä¸»é
ç½®ä¸ï¼åå
¥é¡ºåºæ²¡æå®ä¹ï¼æ以æç»å¼åºè¯¥æ¯ä»ä¹å¹¶ä¸æ¸
æ¥ãå¨[å¾5-7](img/fig5-7.png)ä¸ï¼å¨ä¸»åº1ä¸æ é¢é¦å
æ´æ°ä¸ºBèåæ´æ°ä¸ºCï¼å¨ä¸»åº2ä¸ï¼é¦å
æ´æ°ä¸ºCï¼ç¶åæ´æ°ä¸ºBã两个顺åºé½ä¸æ¯âæ´æ£ç¡®âçã
â å¦ææ¯ä¸ªå¯æ¬åªæ¯æç
§å®çå°åå
¥ç顺åºåå
¥ï¼é£ä¹æ°æ®åºæç»å°å¤äºä¸ä¸è´çç¶æï¼æç»å¼å°æ¯å¨ä¸»åº1çCå主åº2çBãè¿æ¯ä¸å¯æ¥åçï¼æ¯ä¸ªå¤å¶æ¹æ¡é½å¿
须确ä¿æ°æ®å¨ææå¯æ¬ä¸æç»é½æ¯ç¸åçãå æ¤ï¼æ°æ®åºå¿
须以ä¸ç§**æ¶æï¼convergentï¼**çæ¹å¼è§£å³å²çªï¼è¿æå³çææå¯æ¬å¿
é¡»å¨ææåæ´å¤å¶å®ææ¶æ¶æè³ä¸ä¸ªç¸åçæç»å¼ã
å®ç°å²çªå并解å³æå¤ç§éå¾ï¼
* ç»æ¯ä¸ªåå
¥ä¸ä¸ªå¯ä¸çIDï¼ä¾å¦ï¼ä¸ä¸ªæ¶é´æ³ï¼ä¸ä¸ªé¿çéæºæ°ï¼ä¸ä¸ªUUIDæè
ä¸ä¸ªé®åå¼çåå¸ï¼ï¼æéæé«IDçåå
¥ä½ä¸ºèå©è
ï¼å¹¶ä¸¢å¼å
¶ä»åå
¥ãå¦æ使ç¨æ¶é´æ³ï¼è¿ç§ææ¯è¢«ç§°ä¸º**æååå
¥èå©ï¼LWW, last write winsï¼**ãè½ç¶è¿ç§æ¹æ³å¾æµè¡ï¼ä½æ¯å¾å®¹æé ææ°æ®ä¸¢å¤±ã35ããæ们å°å¨[æ¬ç« æ«å°¾](#æ£æµå¹¶ååå
¥)æ´è¯¦ç»å°è®¨è®ºLWWã
* 为æ¯ä¸ªå¯æ¬åé
ä¸ä¸ªå¯ä¸çIDï¼IDç¼å·æ´é«çåå
¥å
·ææ´é«çä¼å
级ãè¿ç§æ¹æ³ä¹æå³çæ°æ®ä¸¢å¤±ã
* 以æç§æ¹å¼å°è¿äºå¼å并å¨ä¸èµ· - ä¾å¦ï¼æåæ¯é¡ºåºæåºï¼ç¶åè¿æ¥å®ä»¬ï¼å¨[å¾5-7](img/fig5-7.png)ä¸ï¼å并çæ é¢å¯è½ç±»ä¼¼äºâB/Câï¼ã
* å¨ä¿çææä¿¡æ¯çæ¾å¼æ°æ®ç»æä¸è®°å½å²çªï¼å¹¶ç¼å解å³å²çªçåºç¨ç¨åºä»£ç ï¼ä¹è®¸éè¿æ示ç¨æ·çæ¹å¼ï¼ã
#### èªå®ä¹å²çªè§£å³é»è¾
â ä½ä¸ºè§£å³å²çªæåéçæ¹æ³å¯è½åå³äºåºç¨ç¨åºï¼å¤§å¤æ°å¤ä¸»å¤å¶å·¥å
·å
许使ç¨åºç¨ç¨åºä»£ç ç¼åå²çªè§£å³é»è¾ã该代ç å¯ä»¥å¨åå
¥æ读åæ¶æ§è¡ï¼
***åæ¶æ§è¡***
â åªè¦æ°æ®åºç³»ç»æ£æµå°å¤å¶æ´æ¹æ¥å¿ä¸åå¨å²çªï¼å°±ä¼è°ç¨å²çªå¤çç¨åºãä¾å¦ï¼Bucardoå
许æ¨ä¸ºæ¤ç¼åä¸æ®µPerl代ç ãè¿ä¸ªå¤çç¨åºé常ä¸è½æ示ç¨æ·ââå®å¨åå°è¿ç¨ä¸è¿è¡ï¼å¹¶ä¸å¿
须快éæ§è¡ã
***读æ¶æ§è¡***
â å½æ£æµå°å²çªæ¶ï¼ææå²çªåå
¥è¢«åå¨ãä¸ä¸æ¬¡è¯»åæ°æ®æ¶ï¼ä¼å°è¿äºå¤ä¸ªçæ¬çæ°æ®è¿åç»åºç¨ç¨åºãåºç¨ç¨åºå¯è½ä¼æ示ç¨æ·æèªå¨è§£å³å²çªï¼å¹¶å°ç»æååæ°æ®åºãä¾å¦ï¼CouchDB以è¿ç§æ¹å¼å·¥ä½ã
â 请注æï¼å²çªè§£å³é常éç¨äºå个è¡æææ¡£å±é¢ï¼èä¸æ¯æ´ä¸ªäºå¡ã36ããå æ¤ï¼å¦ææ¨æä¸ä¸ªäºå¡ä¼ååæ§å°è¿è¡å 次ä¸åçåå
¥ï¼è¯·åé
第7ç« ï¼ï¼å对äºå²çªè§£å³èè¨ï¼æ¯ä¸ªåå
¥ä»éåå¼åç¬èèã
> #### é¢å¤è¯ï¼èªå¨å²çªè§£å³
>
> â å²çªè§£å³è§åå¯è½å¾å¿«åå¾å¤æï¼å¹¶ä¸èªå®ä¹ä»£ç å¯è½å®¹æåºéãäºé©¬éæ¯ä¸ä¸ªç»å¸¸è¢«å¼ç¨çä¾åï¼ç±äºå²çªè§£å³å¤çç¨åºä»¤äººæ讶çææï¼ä¸æ®µæ¶é´ä»¥æ¥ï¼è´ç©è½¦ä¸çå²çªè§£å³é»è¾å°ä¿çæ·»å å°è´ç©è½¦çç©åï¼ä½ä¸å
æ¬ä»è´ç©è½¦ä¸ç§»é¤çç©åãå æ¤ï¼é¡¾å®¢ææ¶ä¼çå°ç©åéæ°åºç°å¨ä»ä»¬çè´ç©è½¦ä¸ï¼å³ä½¿ä»ä»¬ä¹åå·²ç»è¢«ç§»èµ°ã37ãã
>
> å·²ç»æä¸äºæ趣çç 究æ¥èªå¨è§£å³ç±äºæ°æ®ä¿®æ¹å¼èµ·çå²çªãæå è¡ç 究å¼å¾ä¸æï¼
>
> * **æ å²çªå¤å¶æ°æ®ç±»åï¼Conflict-free replicated datatypesï¼**ï¼CRDTï¼ã32,38ãæ¯å¯ä»¥ç±å¤ä¸ªç¨æ·åæ¶ç¼è¾çéåï¼æ å°ï¼æåºå表ï¼è®¡æ°å¨ççä¸ç³»åæ°æ®ç»æï¼å®ä»¬ä»¥åççæ¹å¼èªå¨è§£å³å²çªãä¸äºCRDTå·²ç»å¨Riak 2.0ä¸å®ç°ã39,40ãã
> * **å¯å并çæä¹
æ°æ®ç»æï¼Mergeable persistent data structuresï¼**ã41ãæ¾å¼è·è¸ªåå²è®°å½ï¼ç±»ä¼¼äºGitçæ¬æ§å¶ç³»ç»ï¼å¹¶ä½¿ç¨ä¸åå并åè½ï¼èCRDT使ç¨ååå并ï¼ã
> * **å¯æ§è¡ç转æ¢ï¼operational transformationï¼**[42]æ¯Etherpad ã30ãåGoogle Docs ã31ãçåä½ç¼è¾åºç¨èåçå²çªè§£å³ç®æ³ãå®æ¯ä¸ä¸ºåæ¶ç¼è¾é¡¹ç®çæåºå表è设计çï¼ä¾å¦ææææ¬ææ¡£çå符å表ã
>
> è¿äºç®æ³å¨æ°æ®åºä¸çå®ç°è¿å¾å¹´è½»ï¼ä½å¾å¯è½å°æ¥å®ä»¬å°è¢«éæå°æ´å¤çå¤å¶æ°æ®ç³»ç»ä¸ãèªå¨å²çªè§£å³æ¹æ¡å¯ä»¥ä½¿åºç¨ç¨åºå¤çå¤é¢å¯¼è
æ°æ®åæ¥æ´ä¸ºç®åã
>
#### ä»ä¹æ¯å²çªï¼
â æäºå²çªæ¯æ¾èæè§çãå¨[å¾5-7](img/fig5-7.png)çä¾åä¸ï¼ä¸¤ä¸ªåæä½å¹¶åå°ä¿®æ¹äºåä¸æ¡è®°å½ä¸çåä¸ä¸ªå段ï¼å¹¶å°å
¶è®¾ç½®ä¸ºä¸¤ä¸ªä¸åçå¼ã毫æ çé®è¿æ¯ä¸ä¸ªå²çªã
â å
¶ä»ç±»åçå²çªå¯è½æ´ä¸ºå¾®å¦ï¼é¾ä»¥åç°ãä¾å¦ï¼èèä¸ä¸ªä¼è®®å®¤é¢è®¢ç³»ç»ï¼å®è®°å½è°è®¢äºåªä¸ªæ¶é´æ®µçåªä¸ªæ¿é´ãåºç¨éè¦ç¡®ä¿æ¯ä¸ªæ¿é´åªæä¸ç»äººåæ¶é¢å®ï¼å³ä¸å¾æç¸åæ¿é´çéå é¢è®¢ï¼ãå¨è¿ç§æ
åµä¸ï¼å¦æåæ¶ä¸ºåä¸ä¸ªæ¿é´å建两个ä¸åçé¢è®¢ï¼åå¯è½ä¼åçå²çªãå³ä½¿åºç¨ç¨åºå¨å
许ç¨æ·è¿è¡é¢è®¢ä¹åæ£æ¥å¯ç¨æ§ï¼å¦æ两次é¢è®¢æ¯ç±ä¸¤ä¸ªä¸åçé¢å¯¼è
è¿è¡çï¼åå¯è½ä¼æå²çªã
â ç°å¨è¿æ²¡æä¸ä¸ªç°æççæ¡ï¼ä½å¨æ¥ä¸æ¥çç« èä¸ï¼æ们å°è¿½æº¯å°å¯¹è¿ä¸ªé®é¢æå¾å¥½çç解ãæ们å°å¨ç¬¬7ç« ä¸çå°æ´å¤çå²çªç¤ºä¾ï¼å¨[第12ç« ](ch12.md)ä¸æ们å°è®¨è®ºç¨äºæ£æµå解å³å¤å¶ç³»ç»ä¸å²çªçå¯æ©å±æ¹æ³ã
### å¤ä¸»å¤å¶ææ
â å¤å¶æææè¿°åå
¥ä»ä¸ä¸ªèç¹ä¼ æå°å¦ä¸ä¸ªèç¹çéä¿¡è·¯å¾ãå¦æä½ æ两个é¢å¯¼è
ï¼å¦[å¾5-7]()æ示ï¼åªæä¸ä¸ªåççææç»æï¼é¢å¯¼è
1å¿
é¡»æä»ææçåå°é¢å¯¼è
2ï¼åä¹äº¦ç¶ãæ两个以ä¸çé¢å¯¼ï¼åç§ä¸åçæææ¯å¯è½çã[å¾5-8]()举ä¾è¯´æäºä¸äºä¾åã
![](img/fig5-8.png)
**å¾5-8 ä¸ä¸ªå¯ä»¥è®¾ç½®å¤é¢å¯¼è
å¤å¶ç示ä¾ææã**
â ææ®éçæææ¯å
¨é¨å°å
¨é¨ï¼[å¾5-8 [c]]()ï¼ï¼å
¶ä¸æ¯ä¸ªé¢å¯¼è
å°å
¶åå
¥æ¯ä¸ªå
¶ä»é¢å¯¼ãä½æ¯ï¼ä¹ä¼ä½¿ç¨æ´å¤åéå¶çææï¼ä¾å¦ï¼é»è®¤æ
åµä¸ï¼MySQLä»
æ¯æ**ç¯å½¢ææï¼circular topologyï¼**ã34ãï¼å
¶ä¸æ¯ä¸ªèç¹æ¥æ¶æ¥èªä¸ä¸ªèç¹çåå
¥ï¼å¹¶å°è¿äºåå
¥ï¼å ä¸èªå·±çä»»ä½åå
¥ï¼è½¬åç»å¦ä¸ä¸ªèç¹ãå¦ä¸ç§æµè¡çææç»æå
·ææå½¢çå½¢ç¶[^v]ã个æå®çæ ¹èç¹å°åå
¥è½¬åç»ææå
¶ä»èç¹ãæåææå¯ä»¥æ¨å¹¿å°æ ã
[^v]: ä¸è¦ä¸æå模å¼æ··æ·ï¼è¯·åé
â[åæ模å¼ï¼æåè¿æ¯éªè±](ch2.md#åæ模å¼ï¼æåè¿æ¯éªè±)âï¼ï¼å
¶ä¸æè¿°äºæ°æ®æ¨¡åçç»æï¼èä¸æ¯èç¹ä¹é´çéä¿¡ææã
â å¨åå½¢åæå½¢ææä¸ï¼åå
¥å¯è½éè¦å¨å°è¾¾ææå¯æ¬ä¹åéè¿å¤ä¸ªèç¹ãå æ¤ï¼èç¹éè¦è½¬åä»å
¶ä»èç¹æ¶å°çæ°æ®æ´æ¹ã为äºé²æ¢æ éå¤å¶å¾ªç¯ï¼æ¯ä¸ªèç¹è¢«èµäºä¸ä¸ªå¯ä¸çæ è¯ç¬¦ï¼å¹¶ä¸å¨å¤å¶æ¥å¿ä¸ï¼æ¯ä¸ªåå
¥é½è¢«æ è®°äºææå·²ç»éè¿çèç¹çæ è¯ç¬¦ã43ããå½ä¸ä¸ªèç¹æ¶å°ç¨èªå·±çæ è¯ç¬¦æ è®°çæ°æ®æ´æ¹æ¶ï¼è¯¥æ°æ®æ´æ¹å°è¢«å¿½ç¥ï¼å 为èç¹ç¥éå®å·²ç»è¢«å¤çã
â 循ç¯åæåææçé®é¢æ¯ï¼å¦æåªæä¸ä¸ªèç¹åçæ
éï¼åå¯è½ä¼ä¸æå
¶ä»èç¹ä¹é´çå¤å¶æ¶æ¯æµï¼å¯¼è´å®ä»¬æ æ³éä¿¡ï¼ç´å°èç¹ä¿®å¤ãææç»æå¯ä»¥éæ°é
置为å¨åçæ
éçèç¹ä¸å·¥ä½ï¼ä½å¨å¤§å¤æ°é¨ç½²ä¸ï¼è¿ç§éæ°é
ç½®å¿
é¡»æå¨å®æãæ´å¯éè¿æ¥çææç»æï¼ä¾å¦å
¨é¨å°å
¨é¨ï¼ç容éæ§æ´å¥½ï¼å 为å®å
许æ¶æ¯æ²¿çä¸åçè·¯å¾ä¼ æï¼é¿å
åç¹æ
éã
â å¦ä¸æ¹é¢ï¼å
¨è½ææä¹å¯è½æé®é¢ãç¹å«æ¯ï¼ä¸äºç½ç»é¾æ¥å¯è½æ¯å
¶ä»ç½ç»é¾æ¥æ´å¿«ï¼ä¾å¦ï¼ç±äºç½ç»æ¥å¡ï¼ï¼ç»ææ¯ä¸äºå¤å¶æ¶æ¯å¯è½âè¶
è¿âå
¶ä»å¤å¶æ¶æ¯ï¼å¦[å¾5-9](img/fig5-9.png)æ示ã
![](img/fig5-9.png)
**å¾5-9 使ç¨å¤ä¸»ç¨åºå¤å¶æ¶ï¼å¯è½ä¼å¨æäºå¯æ¬ä¸åå
¥é误ç顺åºã**
â å¨[å¾5-9](img/fig5-9.png)ä¸ï¼å®¢æ·ç«¯Aå**æç»ä¸ï¼Leader Oneï¼**ç表ä¸æå
¥ä¸è¡ï¼å®¢æ·ç«¯Bå¨ä¸»åº3ä¸æ´æ°è¯¥è¡ãç¶èï¼ä¸»åº2å¯ä»¥ä»¥ä¸åç顺åºæ¥æ¶åå
¥ï¼å®å¯ä»¥é¦å
æ¥æ¶æ´æ°ï¼å
¶ä¸ï¼ä»å®çè§åº¦æ¥çï¼æ¯å¯¹æ°æ®åºä¸ä¸åå¨çè¡çæ´æ°ï¼ï¼å¹¶ä¸ä»
å¨ç¨åæ¥æ¶å°ç¸åºçæå
¥ï¼å
¶åºè¯¥å¨æ´æ°ä¹åï¼ã
â è¿æ¯ä¸ä¸ªå æå
³ç³»çé®é¢ï¼ç±»ä¼¼äºæ们å¨â[ä¸è´åç¼è¯»](ch8.md#ä¸è´åç¼è¯»)âä¸çå°çï¼æ´æ°åå³äºå
åçæå
¥ï¼æ以æ们éè¦ç¡®ä¿ææèç¹å
å¤çæå
¥ï¼ç¶ååå¤çæ´æ°ãä»
ä»
å¨æ¯ä¸æ¬¡åå
¥æ¶æ·»å ä¸ä¸ªæ¶é´æ³æ¯ä¸å¤çï¼å 为æ¶éä¸å¯è½è¢«å
åå°åæ¥ï¼ä»¥ä¾¿å¨ä¸»åº2å¤æ£ç¡®å°æåºè¿äºäºä»¶ï¼è§[第8ç« ](ch8.md)ï¼ã
â è¦æ£ç¡®æåºè¿äºäºä»¶ï¼å¯ä»¥ä½¿ç¨ä¸ç§ç§°ä¸º**çæ¬åéï¼version vectorsï¼**çææ¯ï¼æ¬ç« ç¨åå°è®¨è®ºè¿ç§ææ¯ï¼åé
â[æ£æµå¹¶ååå
¥](#æ£æµå¹¶ååå
¥)âï¼ãç¶èï¼å²çªæ£æµææ¯å¨è®¸å¤å¤é¢å¯¼è
å¤å¶ç³»ç»ä¸æ§è¡å¾ä¸å¥½ãä¾å¦ï¼å¨æ°åæ¬ææ¶ï¼PostgreSQL BDRä¸æä¾åå
¥çå ææåºã27ãï¼èTungsten Replicator for MySQLçè³ä¸å°è¯æ£æµå²çªã34ãã
â å¦ææ¨æ£å¨ä½¿ç¨å
·æå¤é¢å¯¼è
å¤å¶åè½çç³»ç»ï¼é£ä¹åºè¯¥äºè§£è¿äºé®é¢ï¼ä»ç»é
读ææ¡£ï¼å¹¶å½»åºæµè¯æ¨çæ°æ®åºï¼ä»¥ç¡®ä¿å®ç¡®å®æä¾äºæ¨è®¤ä¸ºå
·æçä¿è¯ã
## æ 主å¤å¶
â æ们å¨æ¬ç« å°ç®å为æ¢æ讨论çå¤å¶æ¹æ³ ââå主å¤å¶ãå¤ä¸»å¤å¶ââé½æ¯è¿æ ·çæ³æ³ï¼å®¢æ·ç«¯åä¸ä¸ªä¸»åºåéå请æ±ï¼èæ°æ®åºç³»ç»è´è´£å°åå
¥å¤å¶å°å
¶ä»å¯æ¬ã主åºå³å®åå
¥ç顺åºï¼èä»åºæç¸å顺åºåºç¨ä¸»åºçåå
¥ã
â ä¸äºæ°æ®åå¨ç³»ç»éç¨ä¸åçæ¹æ³ï¼æ¾å¼ä¸»åºçæ¦å¿µï¼å¹¶å
许任ä½å¯æ¬ç´æ¥æ¥åæ¥èªå®¢æ·ç«¯çåå
¥ãææ©çä¸äºçå¤å¶æ°æ®ç³»ç»æ¯**æ é¢å¯¼çï¼leaderlessï¼**ã1,44ãï¼ä½æ¯å¨å
³ç³»æ°æ®åºä¸»å¯¼çæ¶ä»£ï¼è¿ä¸ªæ³æ³å ä¹å·²è¢«å¿å´ãå¨äºé©¬éå°å
¶ç¨äºå
¶å
é¨çDynamoç³»ç»[^vi]ä¹åï¼å®åä¸æ¬¡æ为æ°æ®åºçä¸ç§æ¶å°æ¶æã37ãã Riakï¼CassandraåVoldemortæ¯ç±Dynamoå¯åçæ é¢å¯¼å¤å¶æ¨¡åçå¼æºæ°æ®åå¨ï¼æ以è¿ç±»æ°æ®åºä¹è¢«ç§°ä¸º*Dynamoé£æ ¼*ã
[^vi]: Dynamoä¸éç¨äºAmazon以å¤çç¨æ·ã 令人å°æçæ¯ï¼AWSæä¾äºä¸ä¸ªå为DynamoDBçæ管æ°æ®åºäº§åï¼å®ä½¿ç¨äºå®å
¨ä¸åçä½ç³»ç»æï¼å®åºäºåå¼å¯¼ç¨åºå¤å¶ã
â å¨ä¸äºæ é¢å¯¼è
çå®ç°ä¸ï¼å®¢æ·ç«¯ç´æ¥å°åå
¥åéå°å°å 个å¯æ¬ä¸ï¼èå¦ä¸äºæ
åµä¸ï¼ä¸ä¸ª**åè°è
ï¼coordinatorï¼**èç¹ä»£è¡¨å®¢æ·ç«¯è¿è¡åå
¥ãä½ä¸ä¸»åºæ°æ®åºä¸åï¼åè°è
ä¸æ§è¡ç¹å®çåå
¥é¡ºåºãæ们å°ä¼çå°ï¼è¿ç§è®¾è®¡ä¸çå·®å¼å¯¹æ°æ®åºç使ç¨æ¹å¼æçæ·±è¿çå½±åã
### å½èç¹æ
éæ¶åå
¥æ°æ®åº
â åè®¾ä½ æä¸ä¸ªå¸¦æä¸ä¸ªå¯æ¬çæ°æ®åºï¼èå
¶ä¸ä¸ä¸ªå¯æ¬ç®åä¸å¯ç¨ï¼æ许æ£å¨éæ°å¯å¨ä»¥å®è£
ç³»ç»æ´æ°ãå¨åºäºä¸»æºçé
ç½®ä¸ï¼å¦æè¦ç»§ç»å¤çåå
¥ï¼åå¯è½éè¦æ§è¡æ
éåæ¢ï¼åé
ã[å¤çèç¹å®æº](#å¤çèç¹å®æº)ãï¼ã
â å¦ä¸æ¹é¢ï¼å¨æ é¢å¯¼é
ç½®ä¸ï¼æ
éåæ¢ä¸åå¨ã[å¾5-10](img/fig5-10.png)æ¾ç¤ºäºåçäºä»ä¹äºæ
ï¼å®¢æ·ç«¯ï¼ç¨æ·1234ï¼å¹¶è¡åéåå
¥å°ææä¸ä¸ªå¯æ¬ï¼å¹¶ä¸ä¸¤ä¸ªå¯ç¨å¯æ¬æ¥ååå
¥ï¼ä½æ¯ä¸å¯ç¨å¯æ¬éè¿äºå®ãå设ä¸ä¸ªå¯æ¬ä¸ç两个æ¿è®¤åå
¥æ¯è¶³å¤çï¼å¨ç¨æ·1234å·²ç»æ¶å°ä¸¤ä¸ªç¡®å®çååºä¹åï¼æ们认为åå
¥æåã客æ·ç®åå°å¿½ç¥äºå
¶ä¸ä¸ä¸ªå¯æ¬éè¿äºåå
¥çäºå®ã
![](img/fig5-10.png)
**å¾5-10 仲è£åå
¥ï¼æ³å®è¯»åï¼å¹¶å¨èç¹ä¸æå读修å¤ã**
â ç°å¨æ³è±¡ä¸ä¸ï¼ä¸å¯ç¨çèç¹éæ°èæºï¼å®¢æ·ç«¯å¼å§è¯»åå®ãèç¹å
³éæ¶åççä»»ä½åå
¥é½ä»è¯¥èç¹ä¸¢å¤±ãå æ¤ï¼å¦ææ¨ä»è¯¥èç¹è¯»åæ°æ®ï¼åå¯è½ä¼å°éæ§ï¼è¿æ¶ï¼å¼è§ä¸ºååºã
â 为äºè§£å³è¿ä¸ªé®é¢ï¼å½ä¸ä¸ªå®¢æ·ç«¯ä»æ°æ®åºä¸è¯»åæ°æ®æ¶ï¼å®ä¸ä»
ä»
åéå®ç请æ±å°ä¸ä¸ªå¯æ¬ï¼è¯»è¯·æ±ä¹è¢«å¹¶è¡å°åéå°å¤ä¸ªèç¹ã客æ·å¯è½ä¼ä»ä¸åçèç¹è·å¾ä¸åçååºãå³æ¥èªä¸ä¸ªèç¹çææ°å¼åæ¥èªå¦ä¸ä¸ªèç¹çéæ§å¼ãçæ¬å·ç¨äºç¡®å®åªä¸ªå¼æ´æ°ï¼åé
â[æ£æµå¹¶ååå
¥](#æ£æµå¹¶ååå
¥)âï¼ã
#### 读修å¤ååçµ
â å¤å¶æ¹æ¡åºç¡®ä¿æç»å°æææ°æ®å¤å¶å°æ¯ä¸ªå¯æ¬ãå¨ä¸ä¸ªä¸å¯ç¨çèç¹éæ°èæºä¹åï¼å®å¦ä½èµ¶ä¸å®éè¿çåå
¥ï¼
â å¨Dynamoé£æ ¼çæ°æ®åå¨ä¸ç»å¸¸ä½¿ç¨ä¸¤ç§æºå¶ï¼
***读修å¤ï¼Read repairï¼***
â å½å®¢æ·ç«¯å¹¶è¡è¯»åå¤ä¸ªèç¹æ¶ï¼å®å¯ä»¥æ£æµå°ä»»ä½éæ§çååºãä¾å¦ï¼å¨[å¾5-10](img/fig5-10.png)ä¸ï¼ç¨æ·2345è·å¾äºæ¥èªReplica 3ççæ¬6å¼åæ¥èªå¯æ¬1å2ççæ¬7å¼ã客æ·ç«¯åç°å¯æ¬3å
·æéæ§å¼ï¼å¹¶å°æ°å¼ååå¤å¶åãè¿ç§æ¹æ³éç¨äºé¢ç¹é
读çå¼ã
***åçµè¿ç¨ï¼Anti-entropy processï¼***
â æ¤å¤ï¼ä¸äºæ°æ®åå¨å
·æåå°è¿ç¨ï¼è¯¥è¿ç¨ä¸ææ¥æ¾å¯æ¬ä¹é´çæ°æ®å·®å¼ï¼å¹¶å°ä»»ä½ç¼ºå°çæ°æ®ä»ä¸ä¸ªå¯æ¬å¤å¶å°å¦ä¸ä¸ªå¯æ¬ãä¸åºäºé¢å¯¼è
çå¤å¶ä¸çå¤å¶æ¥å¿ä¸åï¼æ¤åçµè¿ç¨ä¸ä¼ä»¥ä»»ä½ç¹å®ç顺åºå¤å¶åå
¥ï¼å¹¶ä¸å¨å¤å¶æ°æ®ä¹åå¯è½ä¼ææ¾çç延è¿ã
â 并ä¸æ¯ææçç³»ç»é½å®ç°äºè¿ä¸¤ä¸ª;ä¾å¦ï¼Voldemortç®å没æåçµè¿ç¨ã请注æï¼å¦æ没æåçµè¿ç¨ï¼æäºå¯æ¬ä¸å¾å°è¯»åçå¼å¯è½ä¼ä¸¢å¤±ï¼ä»èéä½äºæä¹
æ§ï¼å 为åªæå¨åºç¨ç¨åºè¯»åå¼æ¶ææ§è¡è¯»ä¿®å¤ã
#### 读åçæ³å®äººæ°
â å¨[å¾5-10](img/fig5-10.png)ç示ä¾ä¸ï¼æ们认为å³ä½¿ä»
å¨ä¸ä¸ªå¯æ¬ä¸ç两个ä¸è¿è¡å¤çï¼åå
¥ä»ç¶æ¯æåçãå¦æä¸ä¸ªå¯æ¬ä¸åªæä¸ä¸ªæ¥åäºåå
¥ï¼ä¼ææ ·ï¼æ们è½æ¨å¤è¿å¢ï¼
â å¦ææ们ç¥éï¼æ¯ä¸ªæåçåæä½æå³çå¨ä¸ä¸ªå¯æ¬ä¸è³å°æ两个åºç°ï¼è¿æå³çè³å¤æä¸ä¸ªå¯æ¬å¯è½æ¯éæ§çãå æ¤ï¼å¦ææ们ä»è³å°ä¸¤ä¸ªå¯æ¬è¯»åï¼æ们å¯ä»¥ç¡®å®è³å°æä¸ä¸ªæ¯ææ°çãå¦æ第ä¸ä¸ªå¯æ¬åæºæååºé度ç¼æ
¢ï¼å读åä»å¯ä»¥ç»§ç»è¿åææ°å¼ã
â æ´ä¸è¬å°è¯´ï¼å¦ææn个å¯æ¬ï¼æ¯ä¸ªåå
¥å¿
é¡»ç±wèç¹ç¡®è®¤æè½è¢«è®¤ä¸ºæ¯æåçï¼å¹¶ä¸æ们å¿
é¡»è³å°ä¸ºæ¯ä¸ªè¯»åæ¥è¯¢r个èç¹ã ï¼å¨æ们çä¾åä¸ï¼$n = 3ï¼w = 2ï¼r = 2$ï¼ãåªè¦$w + r> n$ï¼æ们ææå¨è¯»åæ¶è·å¾ææ°çå¼ï¼å 为r个读åä¸è³å°æä¸ä¸ªèç¹æ¯ææ°çãéµå¾ªè¿äºrå¼ï¼wå¼ç读å称为**æ³å®äººæ°ï¼quorumï¼**[^vii]ç读ååãã44ã ï¼ä½ å¯ä»¥è®¤ä¸ºï¼råwæ¯ææ读åæéçæä½ç¥¨æ°ã
[^vii]: ææ¶åè¿ç§æ³å®äººæ°è¢«ç§°ä¸ºä¸¥æ ¼çæ³å®äººæ°ï¼ç¸å¯¹âæ¾æ£çæ³å®äººæ°âèè¨ï¼è§â[æ¾æ£æ³å®äººæ°ä¸å¸¦æ示çæ¥å](#æ¾æ£æ³å®äººæ°ä¸å¸¦æ示çæ¥å)âï¼
â å¨Dynamoé£æ ¼çæ°æ®åºä¸ï¼åæ°nï¼wåré常æ¯å¯é
ç½®çãä¸ä¸ªå¸¸è§çéæ©æ¯ä½¿n为å¥æ°ï¼é常为3æ5ï¼å¹¶è®¾ç½® $w = r =ï¼n + 1ï¼/ 2$ï¼åä¸åæ´ï¼ãä½æ¯å¯ä»¥æ ¹æ®éè¦æ´æ¹æ°åãä¾å¦ï¼è®¾ç½®$w = n$å$r = 1$çåå
¥å¾å°ä¸è¯»å次æ°è¾å¤çå·¥ä½è´è½½å¯è½ä¼åçãè¿ä½¿å¾è¯»åé度æ´å¿«ï¼ä½å
·æåªæä¸ä¸ªå¤±è´¥èç¹å¯¼è´æææ°æ®åºåå
¥å¤±è´¥ç缺ç¹ã
> é群ä¸å¯è½æå¤äºnçèç¹ãï¼é群çæºå¨æ°å¯è½å¤äºå¯æ¬æ°ç®ï¼ï¼ä½æ¯ä»»ä½ç»å®çå¼åªè½åå¨å¨n个èç¹ä¸ã è¿å
许对æ°æ®éè¿è¡ååºï¼ä»èæ¯æå¯ä»¥æ¾å¨ä¸ä¸ªèç¹ä¸çæ°æ®éæ´å¤§çæ°æ®éã å°å¨ç¬¬6ç« åå°ååºã
>
仲è£æ¡ä»¶$w + r> n$å
许系ç»å®¹å¿ä¸å¯ç¨çèç¹ï¼å¦ä¸æ示ï¼
* å¦æ$w