Redis學習筆記七:主從集群
作者:Grey
原文地址:Redis學習筆記七:主從集群
單機,單節點,單實例的Redis會有什麼問題呢?
容易導致單點故障,那麼如何解決呢?
可以通過主備方式
同時可以實現讀寫分離
這裡的每個節點是全量的,鏡像的。
單節點的容量有限而且單點的壓力比較大,如何解決呢?
可以分不同的實例來存不同的業務數據
每種業務數據也可以根據不同的規則放到同一組的Redis庫中
引入多個Redis實例後,會出現數據一致性的問題,如何解決呢?
如果要達到強一致性(同步方式),就容易導致不可用性,比如一個節點寫成功後,同步到其他節點,假設其他節點有一個網絡延遲或者故障,就會導致整個服務不可用,所以,如果要保證可用 ,需要容忍丟失一些數據(主節點寫成功立即給客戶端返回成功,異步把數據同步到其他備用節點)。如果要保證數據不丟失(保證最終一致性),可以考慮使用消息隊列。
這裡就要求消息隊列本身是可靠的,這種方式保證了最終一致性,也會有問題,比如多個客戶端訪問的時候,有可能會取到不一致的數據。
主從方式
客戶端可以訪問主,也可以訪問從
主備方式
客戶端只訪問主,不訪問備,只有當主掛了才訪問備
無論主從和主備,主都成了單點故障,如何解決這個問題呢?
所以必須要對主做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.
即在從機無法做寫操作。