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