一、Redis的主從復制
1.1 Redis主從復制定義
主從復制是redis實現高可用的基礎,哨兵模式和集群都是在主從復制的基礎之上實現高可用;
主從復制實現數據的多級備份,以及讀寫分離(主服務器負責寫,從服務器只能讀)
1.2 主從復制流程
(主從復制推薦使用AOF)
1)若啟動一個slave機器進程,則它會向Master機器發送一個sync command命令,請求同步連接。
2)無論是第一次連接還是重新連接,Master機器都會啟動一個后臺進程,將數據快照保存到數據文件中(執行bgsave操作),同時Master還會記錄修改數據的所有命令并緩存在數據文件中。
3)后臺進程完成緩存操作之后,Master機器就會向slave機器發送數據文件,slave端機器將數據文件保存到硬盤上,然后將其加載到內存中,接著Master機器就會將修改數據的所有操作一并發送給slave端機器。若slave出現故障導致宕機,則恢復正常后會自動重新連接。
4)Master機器收到slave端機器的連接后,將其完整的數據文件發送給slave端機器,如果Master同時收到多個slave發來的同步請求,則Master會在后臺啟動一個進程以保存數據文件,然后將其發送給所有的slave端機器,確保所有的slave端機器都正常。
1.3 主從復制實操(一主二從)
主從復制架構
20.0.0.91:MASTER
20.0.0.92:SLAVE1
20.0.0.93:SLAVE2
關閉防火墻
systemctl stop firewalld
setenforce 0
修改master配置文件
vim /etc/redis/6379.conf
--70--
bind 0.0.0.0
#修改監聽地址為0.0.0.0,允許所有網段訪問--137--
daemonize yes
#開啟守護進程,后臺啟動 --172--
logfile /var/log/redis_6379.log
#指定日志文件存放目錄--264--
dir /var/lib/redis/6379
#指定工作目錄--700--
appendonly yes
#開啟AOF持久化功能/etc/init.d/redis_6379 restart
修改slave配置文件
#salve1、slave2相同操作
vim /etc/redis/6379.conf
--70--
bind 0.0.0.0
#修改監聽地址為0.0.0.0,允許所有網段訪問--137--
daemonize yes
#開啟守護進程,后臺啟動 --172--
logfile /var/log/redis_6379.log
#指定日志文件存放目錄--264--
dir /var/lib/redis/6379
#指定工作目錄--288--
replicaof 20.0.0.91 6379
#指定要同步的Master節點的IP和端口--700--
appendonly yes
#開啟AOF持久化功能
??
/etc/init.d/redis_6379 restart #重啟redis
ss -natp | grep redis #查看主從服務器是否已建立連接
測試
測試主從復制以及讀寫分離
?
測試slave斷開時,master寫入數據,slave恢復正常后能否復制
二、Rdis的哨兵模式
在主從復制的基礎上,哨兵引入了主節點的自動故障轉移。
2.1 哨兵模式的組成
哨兵節點: 哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不存儲數據。
數據節點: 主節點和從節點都是數據節點。
2.2?哨兵模式的原理
哨兵是一個分布式系統,部署在每一個redis的節點之上,用于在主從結構之間,對每一臺redis的服務進行監控。
1).監控: 哨兵會不斷地檢查主節點和從節點是否運作正常。
每個哨兵節點每隔一秒,通過ping命令方式,檢測主從之間的心跳線。
主節點在一定時間內沒有回復或者回復了錯誤的消息,此時哨兵就會主觀地認為主節點下線,
超過半數的哨兵節點認為主節點下線時,才會將主節點認為客觀下線。
2).自動故障轉移: 當主節點不能正常工作時,哨兵會開始自動故障轉移操作,它會將失效主節點的其中一個從節點升級為新的主節點,并讓其它從節點改為復制新的主節點。
主節點的選舉原則:
已經下線的從節點不會被選為主節點;
選擇配置文件當中優先級最高的從節點作為主節點(replica-priority 100);
選擇一個復制數據最完整的從節點作為主節點。
(如何實現切換:主節點出現故障時,從節點通過投票的方式選擇一個新的master )
3).通知(提醒): 哨兵可以將故障轉移的結果發送給客戶端。
2.3 哨兵模式實操
修改哨兵節點配置文件
#所有節點相同操作
vim /opt/redis-5.0.7/sentinel.conf
--17--
protected-mode no
#取消注釋,關閉保護模式--21--
port 26379
#Redis哨兵默認的監聽端口--26--
daemonize yes
#指定sentinel為后臺啟動--36--
logfile "/var/log/sentinel.log"
#指定日志文件存放路徑--65--
dir "/var/lib/redis/6379"
#指定數據庫存放路徑--84--
sentinel monitor mymaster 20.0.0.91 6379 2
#指定該哨兵節點監控20.0.0.91:6379這個主節點,該主節點的名稱是mymaster。
#最后的2的含義與主節點的故障判定有關:至少需要2個哨兵節點同意,才能判定主節點故障并進行故障轉移
?
--113--
sentinel down-after-milliseconds mymaster 30000
#判定服務器down掉的時間周期,默認30000毫秒(30秒)--146--
sentinel failover-timeout mymaster 180000
#同一個sentinel對同一個master兩次failover之間的間隔時間(180秒)
啟動哨兵模式并查看哨兵狀態
#啟動三臺節點上的哨兵模式
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &#在哨兵節點查看監控狀態
[root@localhost ~]# redis-cli -p 26379 info Sentinel
模擬故障測試
#Master
ps -elf | grep redis
kill -9 pid號 #Master節點上redis-server的進程號
netstat -natp | grep redis