Redis支持一個master服務器對多個slave服務器同步,同步使用發布/訂閱機制。
1個master對多個slave,還可以進行分層,每個slave下可以再同步slave,擴展成樹狀結構。
Redis默認的端口是6379,我們為了不影響原有Redis,使用新的端口
master 配置 redis_master.conf
port 6300requirepass 123456masterauth 123456daemonize yes
slave1 配置 redis_slave1.conf 設為master的slave
port 6301slaveof 127.0.0.1 6300requirepass 123456masterauth 123456daemonize yes
slave2 配置 redis_slave2.conf 設為master的slave
port 6302slaveof 127.0.0.1 6300requirepass 123456masterauth 123456daemonize yes
daemonize 表示后臺啟動。
requirepass 為主機認證密碼。
masterauth 為從機訪問主機驗證密碼,需要與主機的requirepass一致。
因后面需要演示主從切換,因此三組conf的驗證密碼都一致。
依次啟動master, slave1, slave2
redis-server redis_master.confredis-server redis_slave1.confredis-server redis_slave2.conf
執行后查看是否啟動成功
ps aux|grep redisroot 1858 Ss 3:55 0:00.01 redis-server *:6302 root 1849 Ss 3:54 0:00.01 redis-server *:6301 root 1842 Ss 3:54 0:00.02 redis-server *:6300
進入master,設置key abc的值為123
redis-cli -p 6300127.0.0.1:6300 auth 123456OK127.0.0.1:6300 set abc 123OK127.0.0.1:6300 get abc 123
分別進入slave1, slave2檢查是否同步數據
slave1:
redis-cli -p 6301127.0.0.1:6301 auth 123456OK127.0.0.1:6301 get abc 123 127.0.0.1:6301
slave2:
redis-cli -p 6302127.0.0.1:6302 auth 123456OK127.0.0.1:6302 get abc 123 127.0.0.1:6302
進入master修改key abc的值為456
127.0.0.1:6300 set abc 456OK127.0.0.1:6300 get abc 456
檢查slave1, slave2是否同步
slave1:
127.0.0.1:6301 get abc 456
slave2:
127.0.0.1:6302 get abc 456Redis主從切換
在運行過程中,如果master出現問題,我們可以通過設置,把另一臺slave機自動設為master使用。這里主要用到Redis的sentinel功能來實現主從切換。
sentinel1.conf
port 26301sentinel monitor master 127.0.0.1 6300 2sentinel auth-pass master 123456logfile /tmp/sentinel.log daemonize yes
sentinel2.conf
port 26302sentinel monitor master 127.0.0.1 6300 2sentinel auth-pass master 123456logfile /tmp/sentinel.log daemonize yes
sentinel monitor master 127.0.0.1 6300 2 中的 2 表示有2個以上的sentinel服務檢測到master失效,才會執行主從切換。
啟動兩個sentinel進程
redis-server sentinel1.conf --sentinelredis-server sentinel2.conf --sentinelps aux|grep redisroot 2643 Ss 4:28 0:00.02 redis-server *:26302 [sentinel] root 2636 Ss 4:28 0:00.02 redis-server *:26301 [sentinel]
Redis日志可以看到,啟動成功開始監控
Running mode=sentinel, port=26301.Sentinel ID is 3a23343948cd7f26662ccba1d01b92955311ef52+monitor master master 127.0.0.1 6300 quorum 2+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+slave slave 127.0.0.1:6302 127.0.0.1 6302 @ master 127.0.0.1 6300Running mode=sentinel, port=26302.Sentinel ID is ce0ee2af6b454205a3e475763945f505a10a7d6a+monitor master master 127.0.0.1 6300 quorum 2+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+slave slave 127.0.0.1:6302 127.0.0.1 6302 @ master 127.0.0.1 6300+sentinel sentinel 3a23343948cd7f26662ccba1d01b92955311ef52 127.0.0.1 26301 @ master 127.0.0.1 6300+sentinel sentinel ce0ee2af6b454205a3e475763945f505a10a7d6a 127.0.0.1 26302 @ master 127.0.0.1 6300
終止master,測試主從切換
kill master進程后,sentinel判斷master失效,執行主從切換處理。
日志如下:
+failover-state-reconf-slaves master master 127.0.0.1 6300+slave-reconf-sent slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+config-update-from sentinel 3a23343948cd7f26662ccba1d01b92955311ef52 127.0.0.1 26301 +switch-master master 127.0.0.1 6300 127.0.0.1 6302+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6302+slave slave 127.0.0.1:6300 127.0.0.1 6300 @ master 127.0.0.1 6302-odown master master 127.0.0.1 6300+slave-reconf-inprog slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+slave-reconf-done slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+failover-end master master 127.0.0.1 6300+switch-master master 127.0.0.1 6300 127.0.0.1 6302+convert-to-slave slave 127.0.0.1:6300 127.0.0.1 6300 @ master 127.0.0.1 6302
從日志可以看出,主從切換執行了以下操作:
1.將slave2切換為新的master,redis_slave2.conf 中的 slaveof 127.0.0.1 6300 被自動刪除。
2.將redis_slave1.conf的 slaveof 127.0.0.1 6300 自動更新為 slaveof 127.0.0.1 6302,使用slave2作為新的master。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答