Redis學習筆記七:主從叢集

Grey Zeng發表於2021-05-28

作者:Grey

原文地址:Redis學習筆記七:主從叢集

單機,單節點,單例項的Redis會有什麼問題呢?

容易導致單點故障,那麼如何解決呢?

可以通過主備方式

image

同時可以實現讀寫分離

image

這裡的每個節點是全量的,映象的。

單節點的容量有限而且單點的壓力比較大,如何解決呢?

可以分不同的例項來存不同的業務資料

每種業務資料也可以根據不同的規則放到同一組的Redis庫中

引入多個Redis例項後,會出現資料一致性的問題,如何解決呢?

如果要達到強一致性(同步方式),就容易導致不可用性,比如一個節點寫成功後,同步到其他節點,假設其他節點有一個網路延遲或者故障,就會導致整個服務不可用,所以,如果要保證可用 ,需要容忍丟失一些資料(主節點寫成功立即給客戶端返回成功,非同步把資料同步到其他備用節點)。如果要保證資料不丟失(保證最終一致性),可以考慮使用訊息佇列。

image

這裡就要求訊息佇列本身是可靠的,這種方式保證了最終一致性,也會有問題,比如多個客戶端訪問的時候,有可能會取到不一致的資料。

主從方式

客戶端可以訪問主,也可以訪問從

主備方式

客戶端只訪問主,不訪問備,只有當主掛了才訪問備

無論主從和主備,主都成了單點故障,如何解決這個問題呢?

所以必須要對主做HA(比如主掛了,從機頂上去做主機)
要對主進行HA,必須要選擇一個高可用的監控程式,
監控程式的設計要考慮,是多個監控程式報告Redis掛了才算Redis真的掛了(如果不這樣,容易產生腦裂問題,即:出現資料分割槽)

如果有N個節點,需要N/2+1個節點報告異常(過半),才算真的異常。

腦裂是否要處理,要看你的分割槽容忍性。

機器的臺數是奇數比較好。

主從複製實驗

通過install_server.sh指令碼在一臺機器安裝三個redis例項

  • 6379

  • 6380

  • 6381

首先停掉這三個例項,然後把這三個例項的配置檔案統一放到一個地方,我放在/data目錄下

cp /etc/redic/*.conf /data/

修改三個例項的如下配置

# 關閉aof
appendonly no

# 設定前臺執行
daemonize no

# 註釋掉logfile
# logfile /var/log/redis_6379.log

然後啟動三個例項

redis-server /data/6379.conf
redis-server /data/6380.conf
redis-server /data/6381.conf

啟動客戶端

redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381

把6380 和 6381 設定為6379的從機,在6380和6381兩個客戶端均執行

replicaof 127.0.0.1 6379

我們在6379客戶端執行一條語句

set k1 from6379

然後在6380和6381都執行

127.0.0.1:6381> get k1
"from6379"

127.0.0.1:6380> get k1
"from6379"

可以看到從機同步到了主機的資料

在6380或者6381中任意一臺的客戶端執行

127.0.0.1:6381> set k2 asdfasd
(error) READONLY You can't write against a read only replica.

會提示如下資訊:

(error) READONLY You can't write against a read only replica.

即在從機無法做寫操作。

假設兩臺從機掛了一臺,掛完以後,主機還做了若干次的操作,此時如果掛了的從機繼續啟動(以--appendonly no模式),只會增量同步資料。
如果是以appendonly yes方式啟動掛了的從機,則會觸發全量同步

rdb方式可以記錄當初追隨者的資訊,所以可以做到增量,而aof不會記錄,所以只能全量。

假如主機掛了,由於從只能讀不能寫,我們可以人為把其中的一臺從機變成主(先在這個從機上執行:replicaof no one),然後讓另外一個從機追隨這個主即可,追隨過程中,如果從機開啟了replica-serve-stale-data=yes, 則從機在同步主機資料的時候,還可以查詢自身的舊資料,

replica-diskless-sync yes 表示直接用網路來同步主機和從機的資料(不落磁碟),這種情況一般適用於磁碟效能低於網路效能的情況。

repl—backlog-size 1mb
主機維護的佇列大小,防止從機重啟後又掛掉,這個維護的是一個偏移量,如果寫的頻率不高,則可以設定為1mb,如果寫的頻率非常高,這個值要適當調大。

# 規定最少寫成功的數值
min-replicas-to-write 3
min-replicas-max-lag 10

主從複製的問題:

所以需要人工維護主的故障問題!

所以需要HA

相關文章