在使用 Jepsen 和我自己折騰的 chaos 的時(shí)候,我都有一個(gè)困惑谬俄,就是這些測(cè)試能測(cè)出來(lái)問(wèn)題嗎柏靶?
譬如對(duì)于 Jepsen 來(lái)說(shuō),它會(huì)啟動(dòng)一批節(jié)點(diǎn)溃论,運(yùn)行要測(cè)試的集群屎蜓,然后會(huì)執(zhí)行一些網(wǎng)絡(luò)隔離操作,將整個(gè)集群分成多個(gè)塊钥勋,并且在各個(gè)塊上面都會(huì)執(zhí)行操作炬转,然后恢復(fù)集群辆苔,然后進(jìn)行一些收尾的操作。最后我們會(huì)根據(jù)操作的歷史來(lái)驗(yàn)證系統(tǒng)是否滿足線性一致性扼劈。因?yàn)榕袛嗑€性一致性是一個(gè) NP hard 的問(wèn)題驻啤,所以我們實(shí)際的操作數(shù)量不可能特別多。對(duì)于 Jepsen 來(lái)說(shuō)荐吵,超過(guò) 1 千條歷史骑冗,驗(yàn)證的時(shí)候就很容易發(fā)生 OOM。Chaos 雖然是用 Go 寫(xiě)的先煎,快不少贼涩,但數(shù)量也不可能太多。
所以這就有了我上面的困惑薯蝎,到底這些測(cè)試能不能發(fā)現(xiàn)問(wèn)題遥倦?剛好,前一段時(shí)間看了一篇 Paper占锯,Why Is Random Testing Effective for Partition Tolerance Bugs?袒哥,里面作者也提到了同樣的問(wèn)題,跟我只會(huì)懷疑困惑不同消略,他們直接用數(shù)學(xué)證明了問(wèn)題堡称。
首先,我們需要明確疑俭,為什么這里重點(diǎn)關(guān)注的是網(wǎng)絡(luò)隔離粮呢。對(duì)于從事分布式研發(fā)的同學(xué)來(lái)說(shuō),CAP 理論一定會(huì)非常的熟悉钞艇,該理論通俗的解釋就是只要是分布式系統(tǒng)啄寡,一定會(huì)存在網(wǎng)絡(luò)隔離的情況,那么我們的系統(tǒng)就是要考慮到底是滿足完全的可用性哩照,還是保證一致性挺物,也就是在 P 一定存在的情況下,選擇 C 還是選擇 A 的問(wèn)題飘弧。對(duì)于很多數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō)识藤,譬如 etcd,TiDB次伶,一定是一個(gè) CP + HA 系統(tǒng)痴昧,也就是說(shuō),在 P 出現(xiàn)了冠王,我們要保證 C赶撰,如果出現(xiàn)了數(shù)據(jù)不一致的情況,那么就意味著我們的實(shí)現(xiàn)是有 bug 的。
說(shuō)完了網(wǎng)絡(luò)隔離豪娜,我們下一個(gè)要考慮的就是 coverage 的問(wèn)題餐胀,這里我們并不是說(shuō)的通常測(cè)試的 coverage(也就是有多少行被測(cè)試覆蓋了),但原理差不多瘤载,我們這里需要知道的是在網(wǎng)絡(luò)隔離的 coverage 情況否灾,論文的作者將其分成了三種:
-
k-splitting
:假設(shè)我們有 n 個(gè)進(jìn)程,那么我們就會(huì)將其分成 k 個(gè)不同的區(qū)間鸣奔。我們可以遍歷所有 k 的情況得到 splitting coverage墨技。對(duì)于通常的網(wǎng)絡(luò)隔離來(lái)說(shuō),其實(shí)就是2-splitting
溃蔫。 -
(k, l)-separation
:在分布式系統(tǒng)中健提,通常一個(gè)進(jìn)程都會(huì)有 Role 的區(qū)分琳猫,譬如 Raft 里面的 Leader 和 Follower伟叛。對(duì)于 separation coverage 來(lái)說(shuō),我們就是將 k roles 和 l roles 進(jìn)行隔離脐嫂。對(duì)于 Raft统刮,也就是 (1, 2) separation。如果我們不能知道各個(gè)進(jìn)行的 role账千,就需要遍歷所有的情況了侥蒙。 -
minority isolation
:這個(gè)大家應(yīng)該都比較了解,譬如現(xiàn)在 Leader 被隔離在 minority 的區(qū)間里面匀奏,該 Leader 是否能下線鞭衩,而 majority 的那邊能否選出來(lái)一個(gè)新的 Leader 進(jìn)行服務(wù)。
Jepsen 支持了上面幾種 coverage娃善,通常它僅僅使用一些常用的 coverage 方式论衍,就測(cè)試出了很多的 bug,譬如 k-splitting
的 2-splitting
和 3-splitting
聚磺。那么能找到 bug 的概率大概是多少呢坯台?具體詳細(xì)的證明我是沒(méi)看的(如果看懂的同學(xué)歡迎過(guò)來(lái)面基)瘫寝,但根據(jù) paper 作者的說(shuō)法蜒蕾,只要設(shè)計(jì)合理,即使這些很小的隨機(jī)測(cè)試焕阿,至少能有 80% 的概率能發(fā)現(xiàn) bug,這已經(jīng)非常高了暮屡。
當(dāng)然撤摸,隨機(jī)的測(cè)試只是能有效的找到 bug,并不能保證 100% 找到。所以我們還有其他的做法來(lái)更多的發(fā)現(xiàn)問(wèn)題愁溜,譬如 A randomized scheduler with probabilistic guarantees of finding bugs疾嗅。更進(jìn)一步,為了保證從設(shè)計(jì)上面就是正確的冕象,我們也可以直接使用 TLA+代承。
分布式系統(tǒng)的測(cè)試是一件非常困難的事情,做這塊這么久了渐扮,我很大一個(gè)感觸就是寫(xiě)出一個(gè)分布式系統(tǒng)真的不難论悴,難的是你怎么確定它是對(duì)的。從事分布式系統(tǒng)的測(cè)試墓律,對(duì)于個(gè)人技術(shù)能力的提升是非常大的膀估,我甚至覺(jué)得比純寫(xiě)分布式系統(tǒng)得到的提升都要大。這塊我們做了不少工作耻讽,但遠(yuǎn)遠(yuǎn)不夠察纯,如果對(duì)這塊感興趣,歡迎聯(lián)系我:tl@pingcap.com针肥。