redis4.0.1主從配置及Sentinel配置自動Failover
1、前提條件
yum install gcc-c++
2、安裝redis
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar -xf redis-4.0.1.tar.gz
cd redis-xxxx
make
make install
3、測試Redis是否安裝成功
後臺啟動redis
./redis-server redis.conf
注:分別在每臺機器上安裝以上過程
4、redis主從複製1)概述說明
A)Redis的複製功能是支援多個資料庫之間的資料同步。一類是主資料庫(master)一類是從資料庫(slave),主資料庫可以進行讀寫操作,當發生寫操作的時候自動將資料同步到從資料庫,而從資料庫一般是隻讀的,並接收主資料庫同步過來的資料,一個主資料庫可以有多個從資料庫,而一個從資料庫只能有一個主資料庫。
B)通過redis的複製功能可以很好的實現資料庫的讀寫分離,提高伺服器的負載能力。主資料庫主要進行寫操作,而從資料庫負責讀操作。
2)主從複製過程
主從複製過程:見下圖
3)過程:
1:當一個從資料庫啟動時,會向主資料庫傳送sync命令,
2:主資料庫接收到sync命令後會開始在後臺儲存快照(執行rdb操作),並將儲存期間接收到的命令快取起來
3:當快照完成後,redis會將快照檔案和所有快取的命令傳送給從資料庫。
4:從資料庫收到後,會載入快照檔案並執行收到的快取的命令。
注意:redis2.8之前的版本:當主從資料庫同步的時候從資料庫因為網路原因斷開重連後會重新執行上述操作,不支援斷點續傳。
redis2.8之後支援斷點續傳。
4)配置圖說明整個過程
- 1)Redis主從結構支援一主多從
主節點:192.168.1.220
從節點:192.168.1.221
從節點:192.168.1.222
注意:所有從節點的配置都一樣
- redis伺服器上各自存在一個Sentinel,監控本機redis的執行情況,並通知給閉路環上其它的redis節點;
- 當master發生異常(例如:宕機和斷電等)導致不可執行時,Sentinel將通知給其它節點,而剩餘節點上的Sentinel將重新選舉出新的master,而原來的master重新恢復正常後,則一直扮演slave角色;
- 規定整個架構體系中,master提供讀寫服務,而slave只提供讀取服務。
5)實現過程
5.1、編輯master(220)的配置檔案
vi /etc/redis/redis.conf
# 開啟守護模式 daemonize yes
# 指定資料儲存目錄 dir /home/data/redis
# 每秒一次aof寫 appendfsync everysec
# 開啟aof持久化 appendonly yes
5.2、編輯slave(221和222上)的配置檔案
Slave redis.conf# 指定所屬的主機
slaveof 192.168.1.220 6379
# 指定從機"只讀"
slave-read-only yes
啟動所有主從上的redis;
redis-server redis.conf &
5.3、編輯Sentinel檔案
注:所有節點上都需要配置
# 將sentinel配置檔案拷貝到/etc/redis目錄後編輯
cp /usr/local/redis/sentinel.conf /etc/redis/sentinel.conf
vi /etc/redis/sentinel.conf
# sentinel通訊埠
port 26379
# sentinel需要監控的master/slaver資訊,格式為sentinel monitor <mastername> <masterIP> <masterPort> <quorum>
# 其中<quorum>應該小於叢集中slave的個數,當失效的節點數超過了<quorum>,則認為整個體系結構失效
sentinel monitor redisMaster 192.168.1.220 6379 2
# master被當前sentinel例項認定為失效的間隔時間,格式為sentinel down-after-milliseconds <mastername> <milliseconds>
sentinel down-after-milliseconds redisMaster 10000
# 當新master產時,同時進行“slaveof”到新master並進行同步複製的slave個數
# 在salve執行salveof同步時,將會終止客戶端請求。
# 此值較大,意味著“叢集”終止客戶端請求的時間總和和較大。
# 此值較小,意味著“叢集”在故障轉移期間,多個salve向客戶端提供服務時仍然使用舊資料。
sentinel parallel-syncs redisMaster 1
# failover過期時間。當failover開始後,在此時間內仍然沒有觸發任何failover操作,當前sentinel將會認為此次failoer失敗。
sentinel failover-timeout redisMaster 60000
完成後,將此配置檔案拷貝到其它節點的相同目錄下。
5.4、啟動所有主從上的sentinel
前提是它們各自的server已成功啟動
cd /usr/local/redis/src
./redis-sentinel /etc/redis/sentinel.conf
6)測試
6.1、在任意一個節點上檢視主從機的複製資訊
cd /usr/local/redis/src
1)檢視Master節點資訊:
./redis-cli -h 192.168.1.220 -p 6379 info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.221,port=6379,state=online,offset=128948,lag=1
slave1:ip=192.168.1.222,port=6379,state=online,offset=128948,lag=0
master_replid:5028bb58ea35368581727adcdba72163a8e70670
master_replid2:98859319bdef11765e0ec74d61abc2d7be43340b
master_repl_offset:128948
second_repl_offset:125275
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:81109
repl_backlog_histlen:47840
從上圖可看出,此時220的角色為master,有兩個slave(221和222)被連線成功。此時開啟master的sentinel.conf,在末尾可看到如下自動寫入的內容:
# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel monitor redismaster 192.168.1.220 6379 2
sentinel config-epoch redismaster 0
sentinel leader-epoch redismaster 0
sentinel known-slave redismaster 192.168.1.222 6379
sentinel known-slave redismaster 192.168.1.221 6379
sentinel known-sentinel redismaster 192.168.1.222 26379 370a40a8d49ebce870eb59444a5a24f26cfbf315
sentinel known-sentinel redismaster 192.168.1.221 26379 4cc596d8e9cf2e370718adf16d1034ab8cf32192
sentinel current-epoch 0
2)檢視Slave節點資訊:
./redis-cli -h 192.168.1.221 -p 6379 info Replication
此時221(或222,將命令列的ip換為222)的角色為slave,它們所屬的master為220。此時開啟slave的sentinel.conf,在末尾可看到如下自動寫入的內容:
[email protected]:/root#redis-cli -h 192.168.1.221 -p 6379 info replication
# Replication
role:slave
master_host:192.168.1.220
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:954319
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:3e435dc0968df07f64bb40b6beac6e6ec0df0b32
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:954319
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:342831
repl_backlog_histlen:611489
[email protected]:/root#
3)客戶端連線到master後,set一條測試資料
[email protected]:/root#redis-cli -h 192.168.1.220 -p 6379
192.168.1.220:6379> set name 1000;
OK
4)連線到任意一個節點上後,通過get命令可以獲取資料
[email protected]:/root#redis-cli -h 192.168.1.222
192.168.1.222:6379> get name
"1000;"
5)在任意一個slave上執行諸如set這樣的寫入操作時,將得到如下示例的錯誤資訊:
[email protected]:/root#redis-cli -h 192.168.1.222
192.168.1.222:6379> get name
"1000;"
192.168.1.222:6379> set a 10
(error) READONLY You can't write against a read only slave.
6)關掉任意一個slave節點,所有節點的sentinel都可以檢測到,出現如下示例資訊:
[email protected]:/root#redis-cli -h 192.168.1.222
192.168.1.222:6379> get name
"1000;"
192.168.1.222:6379> set a 10
(error) READONLY You can't write against a read only slave.
192.168.1.222:6379> shutdown
從上圖可看出221被sentinel檢測到已處於關閉狀態,此時再來檢視剩餘節點的主從資訊,它們的角色不會發生變化,只是master上的connected_slaves變為了1
[email protected]:/root#redis-cli -h 192.168.1.220 -p 6379 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.221,port=6379,state=online,offset=1068437,lag=1
master_replid:3e435dc0968df07f64bb40b6beac6e6ec0df0b32
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1068581
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:342376
repl_backlog_histlen:726206
[email protected]:/root#
17312:X 18 Aug 13:57:14.238 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
17312:X 18 Aug 13:57:14.238 # Sentinel ID is 370a40a8d49ebce870eb59444a5a24f26cfbf315
17312:X 18 Aug 13:57:14.238 # +monitor master redismaster 192.168.1.220 6379 quorum 2
17312:X 18 Aug 13:57:14.238 # +monitor master mymaster 127.0.0.1 6379 quorum 2
17312:X 18 Aug 13:57:24.262 # +sdown master mymaster 127.0.0.1 6379
17312:X 18 Aug 13:57:44.279 # +sdown sentinel fc14ecf5463a0cf7141bf276333c8d4b7df1350d 192.168.1.220 26379 @ redismaster 192.168.1.220 6379
17312:X 18 Aug 13:57:44.279 # +sdown sentinel 4cc596d8e9cf2e370718adf16d1034ab8cf32192 192.168.1.221 26379 @ redismaster 192.168.1.220 6379
17312:X 18 Aug 14:06:11.139 # +sdown slave 192.168.1.215:6379 192.168.1.222 6379 @ redismaster 192.168.1.220 6379
7)重啟被關閉的slave節點,所有節點的sentinel都可以檢測到,可看出221又被sentinel檢測到已處於可用狀態,此時再來檢視節點的主從資訊,它們的角色仍然不會發生變化,master上的connected_slaves又變為了2
./redis-cli -h 192.168.1.220 -p 6379 info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.221,port=6379,state=online,offset=128948,lag=1
slave1:ip=192.168.1.222,port=6379,state=online,offset=128948,lag=0
master_replid:5028bb58ea35368581727adcdba72163a8e70670
master_replid2:98859319bdef11765e0ec74d61abc2d7be43340b
master_repl_offset:128948
second_repl_offset:125275
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:81109
repl_backlog_histlen:47840
8)關掉220master節點,待所有節點的sentinel都檢測到後,再來檢視兩個Slave節點的主從資訊,發現其中一個節點的角色通過選舉後會成為master:
./redis-cli -h 192.168.1.221 -p 6379 info Replication
# Replication
role:master
connected_slaves:1
slave1:ip=192.168.1.222,port=6379,state=online,offset=128948,lag=0
master_replid:5028bb58ea35368581727adcdba72163a8e70670
master_repl_offset:128948
second_repl_offset:125275
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:81109
repl_backlog_histlen:47840
從上圖的最後一行監控資訊可看出,222此時被選舉為master,此時開啟的222的redis.conf檔案,slaveof配置項已被自動刪除了。而221和220的redis.conf檔案中slaveof配置項的值被自動修改為192.168.31.222 6379。
在這個新master上執行諸如set這樣的寫入操作將被成功執行
set name daniele_222
9)重啟220,待所有節點的sentinel都檢測到後,再來檢視所有節點的主從資訊,此時222的master角色不會被重新搶佔,而220角色會從原來的master變為了slave
./redis-cli -h 192.168.1.221 -p 6379 info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.220,port=6379,state=online,offset=128948,lag=1
slave1:ip=192.168.1.222,port=6379,state=online,offset=128948,lag=0
master_replid:5028bb58ea35368581727adcdba72163a8e70670
master_replid2:98859319bdef11765e0ec74d61abc2d7be43340b
master_repl_offset:128948
second_repl_offset:125275
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:81109
repl_backlog_histlen:47840
此時執行get name得到的值為daniele_222,而不是原來的daniele_220,因為220重啟後會自動從新的master中同步資料。此時開啟220的redis.conf檔案,會在末尾找到如下資訊:
slaveof 192.168.1.222 6379