redis主從

  • 2021 年 10 月 10 日
  • 筆記

單機瓶頸

1 雖然Redis可以實現單機的數據持久化,但是無論是RDB還是AOF,都解決不了單點宕機問題。

2 即一台單機Redis伺服器本身出現系統故障,硬體故障等問題後,就會直接造成數據的丟失,

3 此外,單機的性能也是有極限的,因此需要使用另外的技術來解決單點故障和性能擴展的問題

主從複製原理

1 salve 向master發送sync命令

2 master啟動後台存檔進程,並手機所有修改數據命令

3 master完成存檔後,傳送整個數據文件到slave

4 slave接受數據文件,載入到記憶體中完成首次完全同步

5 後續有新數據產生時,master繼續將新的數據命令傳遞給slave完成同步

主從複製架構特點

三種結構模式:
一主一從
一主多從
主從從

一個master可以有多個slave

一個slave只能有一個master

數據流向是單向的,master到slave

主從複製實現

一旦某個slave成為一個master的slave,redis slave服務會清空當前的redis伺服器上的所有數據並將master的數據導入到自己的記憶體,但是如果只是斷開同步關係後,則不會刪除當前已經同步過的數據
redis slave 也要開始持久化並設置和master同樣的連接密碼,因為後期slave會有提升為master的可能,slave切換為master同步後會丟失之前的所有數據,而通過持久化可以恢複數據

當配置redis複製功能時,強烈建議打開主伺服器的持久化功能,否則的話,由於延遲等問題,部署的服務應該要避免自動啟動

參考案例:

導致主從伺服器數據全部丟失

1.假設節點a為主伺服器,並且關閉了持久化。並且節點b和節點c都從a節點複製數據

2.節點a崩潰,然後由自動拉起服務重啟了節點a,由於節點a的持久化被關閉了,所以重啟之後沒有任何數據

3.節點b和節點c 將從a節點複製數據,但是a的數據是空的,於是就把自身保存的數據副本刪除

在關閉主伺服器的持久化,並且同時開啟自動拉起進程的情況下,即使使用sentinel來實現redis高可用,也是非常危險的。因為主伺服器可能拉起的非常快,以至於sentinel在配置心跳時間間隔內沒有檢測主伺服器已被重啟,然後還是會執行上面的數據丟失流程無論何時,數據安全都是極其重要的,所以應該禁止主伺服器關閉持久化的同時自動啟動

redis主從其中伺服器不需要設置密碼並且要關閉防火牆  /etc/selinux/conf要設置到disabled模式

在第一台伺服器上第一步:在/etc/redis.conf中修改protected-mode no 以及bind  0.0.0.0

第二步:重啟服務service redis restart

第三步:[root@localhost ~]# redis-cli

127.0.0.1:6379> slaveof 192.168.0.121 6379
OK

127.0.0.1:6379> keys *
(empty list or set)查看是否有數據

在第二台伺服器上:

[root@localhost redis]# redis-cli -h 127.0.0.1 -p 6379 -a 1234
127.0.0.1:6379> keys *
1) “1”

複製第一台伺服器檢測埠telnet 192.168.0.121

 netstat -tnlp查看埠

在第一台伺服器上slaveof 192.168.0.121 6379

注意關閉自動拉起服務和持久化

一主兩從在第三台伺服器的/etc/redis.cong中搜索slaveof添加 

slaveof 192.168.0.121 6379  修改bind 0.0.0.0

級聯複製:在第三台伺服器/etc/redis.conf中搜索120修改IP為第一台伺服器的IP 在第一台伺服器上關閉防火牆systemctl stop firewalld在第三台伺服器上重啟redis   登錄redis  查看keys* 

slaveof no one 切斷主從  檢測是否切斷主從info replication