Redis系列之(二):Redis主從同步,讀寫分離


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_ago10秒內。

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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM