1. Redis主從同步
Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,同步使用的是發布/訂閱機制。
2. 配置主從同步
Mater Slave的模式,從Slave向Master發起SYNC命令。
可以是1 Master 多Slave,可以分層,Slave下可以再接Slave,可擴展成樹狀結構。
2.1 配置Mater,Slave
配置非常簡單,只需在slave的設定文件中指定master的ip和port
Master: test166
修改設定文件,服務綁定到ip上
# vi /etc/redis.conf bind 10.86.255.166
重啟Redis
# systemctl restart redis
# less /etc/redis.conf
Slave: test167
修改設定文件,指定Master
slaveof <masterip> <masterport> 指定master的ip和port masterauth <master-password> master有驗證的情況下 slave-read-only yes 設置slave為只讀模式
也可以用命令行設定:
redis 127.0.0.1:9999> slaveof localhost 6379 OK
2.2 同期情況確認
Master:
127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:1 slave0:ip=10.86.255.167,port=6379,state=online,offset=309,lag=1 ……
Slave:
127.0.0.1:6379> INFO replication # Replication role:slave master_host:10.86.255.166 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:365 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
同期正常時:
master_link_status:up
master_repl_offset和slave_repl_offset相等,
master_last_io_seconds_ago在10秒內。
2.3 Slave升級為Master
Master不可用的情況下,停止Master,將Slave的設定無效化后,Slave升級為Master
redis 127.0.0.1:9999> SLAVEOF NO ONE OK redis 127.0.0.1:9999> info ...... role:master ......
2.4 Health Check
Slave按照repl-ping-slave-period的間隔(默認10秒),向Master發送ping。
如果主從間的鏈接中斷后,再次連接的時候,2.8以前按照full sync再同期。2.8以后,因為有backlog的設定,backlog存在master的內存里,重新連接之前,如果redis沒有重啟,並且offset在backlog保存的范圍內,可以實現從斷開地方同期,不符合這個條件,還是full sync
用monitor命令,可以看到slave在發送ping
127.0.0.1:6379> monitor OK 1448515184.249169 [0 10.86.255.166:6379] "PING"
2.5 設置Master的寫行為
2.8以后,可以在設定文件中設置,Master只有當有N個Slave處於連接狀態時,接受寫操作
min-slaves-to-write 3 min-slaves-max-lag 10
3. Redis HA管理工具
redis-sentinel 能監視同期的狀態,發現Master down的時候,會進行failover,將Slave升級為Master,啟動后會自動更新sentinel設定文件,發生failover時,會自動修改sentinel和redis的設定文件
環境:
Master: 10.86.255.167 :6379 sentinel:26379
Slave1: 10.86.255.166 :6379 sentinel:26379
Slave2: 10.86.255.167 :7379 sentinel:36379
Sentinel的設定文件在/etc/redis-sentinel.conf,對failover的動作等可以進行一些定義,本次主要驗證Sentinel的動作,設定文件可以根據具體情況自行調整
3.1 設定Master,Slave
參照上文設定Master,Slave,並確認Mater和2個Slave的同期狀態正常
3.2 Master上設定Sentinel
# vi /etc/redis-sentinel.conf daemonize yes sentinel monitor mymaster <master ip> 6379 2
啟動sentinel
# redis-sentinel /etc/redis-sentinel.conf 或 # redis-server /etc/redis-sentinel.conf --sentinel
確認
# redis-cli -p 26379 127.0.0.1:26379> INFO sentinel

確認Master信息
127.0.0.1:26379> sentinel masters

確認Slave信息
127.0.0.1:26379> sentinel slaves mymaster

3.3 Slave上設定Sentinel
在slave1上設定sentinel
# vi /etc/redis-sentinel.conf daemonize yes sentinel monitor mymaster <master ip> 6379 2
啟動slave1
# redis-sentinel /etc/redis-sentinel.conf
在slave2上設定sentinel
# less /etc/redis-sentinel_36379.conf daemonize yes port 36379 sentinel monitor mymaster <master ip> 6379 2
啟動slave2
# redis-sentinel /etc/redis-sentinel_36379.conf
3.4 動作確認
停止Master
127.0.0.1:6379> SHUTDOWN
確認日志發生fail over
# tail /var/log/redis/sentinel.log
確認Slave2變成Master,Slave1是Slave
test167:7379> info replication

test166:6379> info replication

啟動剛才停掉的Master,確認變為Slave
10.86.255.167:6379> info replication

3.5 Sentinel命令
127.0.0.1:26379> sentinel masters 127.0.0.1:26379> sentinel slaves mymaster 127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster 127.0.0.1:26379> SENTINEL reset mymaster 127.0.0.1:26379> SENTINEL failover mymaster 127.0.0.1:26379> SENTINEL flushconfig mymaster
4. 后記
本文介紹了Redis主從同步,讀寫分離,及HA,后續會繼續研究Redis。
