《Redis系列之(二):Redis主從同步,讀寫分離》要點:
本文介紹了Redis系列之(二):Redis主從同步,讀寫分離,希望對您有用。如果有疑問,可以聯系我們。
Redis支持主從同步.數據可以從主服務器向任意數量的從服務器上同步,同步使用的是發布/訂閱機制.
Mater Slave的模式,從Slave向Master發起SYNC命令.
可以是1 Master 多Slave,可以分層,Slave下可以再接Slave,可擴展成樹狀結構.
配置非常簡單,只需在slave的設定文件中指定master的ip和port
Master: test166
修改設定文件,服務綁定到ip上
# vi /etc/redis.confbind 10.86.255.166
重啟Redis
# systemctl restart redis
Slave: test167
修改設定文件,指定Master
slaveof <masterip> <masterport> 指定master的ip和portmasterauth <master-password> master有驗證的情況下slave-read-only yes 設置slave為只讀模式
也可以用命令行設定:
redis 127.0.0.1:9999> slaveof localhost 6379OK
Master:
127.0.0.1:6379> INFO replication# Replicationrole:masterconnected_slaves:1slave0:ip=10.86.255.167,port=6379,state=online,offset=309,lag=1……
Slave:
127.0.0.1:6379> INFO replication# Replicationrole:slavemaster_host:10.86.255.166master_port:6379master_link_status:upmaster_last_io_seconds_ago:7master_sync_in_progress:0slave_repl_offset:365slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0
同期正常時:
master_link_status:up
master_repl_offset和slave_repl_offset相等,
master_last_io_seconds_ago在10秒內.
Master不可用的情況下,停止Master,將Slave的設定無效化后,Slave升級為Master
redis 127.0.0.1:9999> SLAVEOF NO ONE OKredis 127.0.0.1:9999> info......role:master......
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> monitorOK1448515184.249169 [0 10.86.255.166:6379] "PING"
2.8以后,可以在設定文件中設置,Master只有當有N個Slave處于連接狀態時,接受寫操作
min-slaves-to-write 3min-slaves-max-lag 10
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的動作,設定文件可以根據具體情況自行調整
參照上文設定Master,Slave,并確認Mater和2個Slave的同期狀態正常
# vi /etc/redis-sentinel.confdaemonize yessentinel monitor mymaster <master ip> 6379 2
啟動sentinel
# redis-sentinel /etc/redis-sentinel.conf或# redis-server /etc/redis-sentinel.conf --sentinel
確認
# redis-cli -p 26379127.0.0.1:26379> INFO sentinel
確認Master信息
127.0.0.1:26379> sentinel masters
確認Slave信息
127.0.0.1:26379> sentinel slaves mymaster
在slave1上設定sentinel
# vi /etc/redis-sentinel.confdaemonize yessentinel monitor mymaster <master ip> 6379 2
啟動slave1
# redis-sentinel /etc/redis-sentinel.conf
在slave2上設定sentinel
# less /etc/redis-sentinel_36379.confdaemonize yesport 36379sentinel monitor mymaster <master ip> 6379 2
啟動slave2
# redis-sentinel /etc/redis-sentinel_36379.conf
停止Master
確認日志發生fail over
# tail /var/log/redis/sentinel.log
確認Slave2變成Master,Slave1是Slave
test167:7379> info replication
test166:6379> info replication
啟動剛才停掉的Master,確認Master變為Slave
10.86.255.167:6379> info replication
127.0.0.1:26379> sentinel masters127.0.0.1:26379> sentinel slaves mymaster127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster127.0.0.1:26379> SENTINEL reset mymaster127.0.0.1:26379> SENTINEL failover mymaster127.0.0.1:26379> SENTINEL flushconfig mymaster
本文介紹了Redis主從同步,讀寫分離,及HA,后續會繼續研究Redis.
歡迎參與《Redis系列之(二):Redis主從同步,讀寫分離》討論,分享您的想法,維易PHP學院為您提供專業教程。