Redis集群的高可用性
在本文中,我們將研究以下主題:
- Redis集群的高可用性。
- Redis集群的自動故障轉(zhuǎn)移。
- Redis集群中的腦裂問題及其解決方案。
問題: Redis-Cluster如何提供高可用性?
答案: 高可用性是指集群在面臨某些故障時仍能保持操作能力。例如,集群可以檢測到主分片失敗并在無需外部手動干預(yù)的情況下將副本提升為主分片。
問題: Redis-Cluster如何提供自動故障轉(zhuǎn)移?
答案: Redis-Cluster可以迅速了解主分片何時失敗,并且可以將其副本晉升為新主分片。
- 假設(shè)我們?yōu)槊總€主分片都有一個副本。如果我們的數(shù)據(jù)分布在三個Redis服務(wù)器之間,我們將需要一個六成員的集群,其中三個主分片和三個副本。
- 所有六個分片通過TCP相互連接,并不斷地相互ping并交換消息。這些消息允許集群確定哪些分片是活動的。
- 當(dāng)足夠多的分片報告給定主分片未響應(yīng)它們時,它們可以同意觸發(fā)故障轉(zhuǎn)移,并將分片的副本提升為新的主分片。在觸發(fā)故障轉(zhuǎn)移之前需要同意離線同行的分片數(shù)量在集群創(chuàng)建時是可配置的。
問題: 用Redis-Cluster演示腦裂的情況?
答案: 以下是腦裂情況的演示方式:
步驟#1: 想象一下,我們有一個具有三個主分片和每個主分片一個副本的Redis-Cluster??傮w而言,我們的Redis集群是一個六成員的集群,其中有三個主分片和三個副本。進(jìn)一步想象,網(wǎng)絡(luò)分區(qū)已經(jīng)發(fā)生,即左側(cè)的組將無法與右側(cè)的組中的分片通信。
現(xiàn)在,兩個集群組都認(rèn)為它們處于脫機(jī)狀態(tài),兩者都將觸發(fā)任何主分片的故障轉(zhuǎn)移,導(dǎo)致左側(cè)具有所有主分片,右側(cè)也將具有所有主分片。
步驟#2: 兩側(cè)認(rèn)為它們具有所有主分片,將繼續(xù)接收修改數(shù)據(jù)的客戶端請求。這是一個問題,因為也許客戶端A在左側(cè)將鍵foo的值設(shè)置為bar,但客戶端B在右側(cè)將相同鍵的值設(shè)置為baz。
步驟#3: 當(dāng)網(wǎng)絡(luò)分區(qū)被刪除并且分片嘗試重新連接時,我們將會有沖突,因為我們有兩個保存不同數(shù)據(jù)的分片,聲稱是主分片,我們不會知道哪些數(shù)據(jù)是有效的。這稱為腦裂情況,在分布式系統(tǒng)的世界中是一個非常常見的問題。
問題: 如何解決腦裂的問題?
答案: 在集群中保持奇數(shù)個主分片和每個主分片兩個副本。以下是解決此問題的詳細(xì)解決方案:
- 為防止在Redis集群中發(fā)生一種稱為腦裂情況的情況,始終保持奇數(shù)個分片。
- 現(xiàn)在,當(dāng)我們得到網(wǎng)絡(luò)分割時,左側(cè)和右側(cè)的組將進(jìn)行計數(shù),并查看它們是在更大的(多數(shù))還是更小的組(少數(shù))?
- 如果特定組處于少數(shù),它將不嘗試觸發(fā)故障轉(zhuǎn)移,并且將不接
受任何客戶端寫入請求。
讓我們來看看下面的集群:
現(xiàn)在,假設(shè)發(fā)生網(wǎng)絡(luò)分割,如下所示:
在這里,左側(cè)組(節(jié)點集合)處于少數(shù),因此它不會嘗試觸發(fā)故障轉(zhuǎn)移,并將停止接受任何客戶端寫入請求。
右側(cè)組(節(jié)點集合)處于多數(shù),因此它具有觸發(fā)任何主分片故障轉(zhuǎn)移的權(quán)限和能力。