Redis哨兵模式配置測試

夢夕林1992發表於2023-01-28


Redis 的哨兵(sentinel)  系統用於管理多個 Redis  伺服器, 該系統執行以下三個任務:

監控(Monitoring):  哨兵(sentinel)  會不斷地檢查你的Master Slave 是否運作正常。

提醒(Notification): 當被監控的某個 Redis 出現問題時哨兵(sentinel)  可以透過 API  向管理員或者其他應用程式傳送通知。

  自動故障遷移(Automatic failover): 當一個Master 不能正常工作時,哨兵(sentinel)  會開始一次自動故障遷移操作, 它會將失效Master 的其中一個Slave 升級為新的Master,  並讓失效Master 的其他Slave 改為複製新的Master; 如果修復好的master 重新啟動後,原master 變成slave

 

本文在redis主從已經搭建好的前提下做哨兵的簡單配置。(想要安裝redis主從具體步驟的可以翻看上一篇文章)

 

在安裝的redis 目錄下,有sentinel.conf 檔案,可以設定超時等等。

本次測試是我自己新建一個檔案格式如下:

[root@localhost ~]# cd /redis/redis-5.0.5/

[root@localhost redis-5.0.5]# cp sentinel.conf redis_master/sentinel_6379.conf

[root@localhost redis_master]# vi sentinel_6379.conf

 

修改redis-sentinel 配置檔案:/etc/redis-sentinel.conf

# 1.  繫結的地址

bind 0.0.0.0

# 2.  設定埠

port 26379

# 3.  daemonize 的值從no 設定為yes (設定哨兵模式為後臺啟動)

daemonize yes

# 4.  搜尋pidfile pid 檔案),設定值

pidfile /redis/redis-5.0.5/redis_master/sentinel_26379.pid

# 5.  搜尋logfile (日誌檔案),設定值

logfile "/redis/redis-5.0.5/redis_master/sentinel_26379.log"

# 6.  搜尋dir( 工作目錄) ,設定值

dir /redis-data/master/26379

# 7.  設定監控地址,為對應的主redis 庫的內網地址

sentinel monitor mymaster 192.168.242.70 6379 2

# 8.  主資料庫密碼, 需要將配置放在sentinel monitor mymaster 192.168.242.70 6379 2 下面

sentinel auth-pass mymaster hzmcdba

# 9.  設定5 秒內沒有響應,說明伺服器掛了, 需要將配置放在sentinel monitor mymaster 192.168.242.70 6379 2 下面

sentinel down-after-milliseconds mymaster 5000

# 10.  設定15 秒內master 沒有活起來,就重新選舉主(根據需求調整)

sentinel failover-timeout mymaster 15000

# 11.  表示如果master 重新選出來後,其它slave 節點能同時並行從新master 同步快取的臺數有多少個,顯然該值越大,所有slave 節點完成同步切換的整體速度越快,但如果此時正好有人在訪問這些slave ,可能造成讀取失敗,影響面會更廣。最保定的設定為1 ,只同一時間,只能有一臺幹這件事,這樣其它slave 還能繼續服務,但是所有slave 全部完成快取更新同步的程式將變慢。

sentinel parallel-syncs mymaster 2

 

注意:含有mymaster 的配置,都必須放置在sentinel monitor mymaster 192.168.242.70 6379 2 之後,否則會出現問題

 

sentinel monitor mymaster  後監控的是redis 中的master 節點,也就是192.168.242.70 ,所以這個檔案在三臺機器上是相同的。將該檔案複製至其他兩個節點,放到相應目錄,並建立檔案中使用到得目錄。

 

因為主從前面已經啟動,所以這邊直接啟動哨兵即可(三個節點都啟動):

root@localhost redis_master]# redis-sentinel /redis/redis-5.0.5/redis_master/sentinel_6379.conf

檢視日誌:

[root@test1 redis_master]# tail -100f sentinel_26379.log

 

如果主從都重啟,則需要按照下面順序啟動

啟動需要按照Master->Slave->Sentinel 的順序進行啟動

 

檢視哨兵資訊:

[root@localhost redis_master]# redis-cli -h 192.168.242.70 -p 26379 

192.168.242.70:26379> info sentinel 

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=mymaster,status=ok,address=192.168.242.70:6379,slaves=2,sentinels=3

 

[root@localhost redis_master]#  redis-cli -h 192.168.242.71 -p 26379

192.168.242.71:26379> info sentinel

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=mymaster,status=ok,address=192.168.242.70:6379,slaves=2,sentinels=3

192.168.242.71:26379> exit

 

[root@localhost redis_master]#  redis-cli -h 192.168.242.72 -p 26379

192.168.242.72:26379> info sentinel 

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=mymaster,status=ok,address=192.168.242.70:6379,slaves=2,sentinels=3

 

檢視日誌資訊

[root@test1 redis_master]# tail -100f sentinel_26379.log

成功日誌,+slave slave 包含兩臺從庫的地址,+sentinel sentinel 包含兩臺哨兵的id

 

高可用測試case

哨兵作為對redis 例項的監控,透過選舉演算法保證哨兵的魯棒性和高可用,所以哨兵至少要部署3 臺,符合半數原則,需要5 或者,7 ,超過一半,不包含一半存活的時候,才能夠選舉出leader ,才能進行主從的切換功能。

redis 服務,至少需要存活一臺,才能保證服務正常執行sentinel  選擇新 master  的原則是最近可用    資料最新    優先順序最高    活躍最久 

哨兵高可用測試:分別連線對應的redis 服務端,手動停止哨兵,停止主reids 服務,看主從是否切換成功。

三哨兵情況:redis 例項掛掉兩臺,剩下一臺能夠成為主,自動切換

 

Master 檢查狀態

[root@localhost redis_master]# redis-cli -h 192.168.242.70 -p 6379 -a hzmcdba

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

192.168.242.70:6379> set k3 3

OK

192.168.242.70:6379> get k3

"3"

192.168.242.70:6379> info replication

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.242.71,port=6380,state=online,offset=887111,lag=0

slave1:ip=192.168.242.72,port=6381,state=online,offset=886968,lag=0

master_replid:8b90010b378c34aaf89c39a9002684363de31b40

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:887111

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:887111

 

salve1 檢查狀態

[root@test2 slave1]#  redis-cli -h 192.168.242.71 -p 6380 -a hzmcdba

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

192.168.242.71:6380> get k3

"3"

192.168.242.71:6380> info replication

# Replication

role:slave

master_host:192.168.242.70

master_port:6379

master_link_status:up

master_last_io_seconds_ago:0

master_sync_in_progress:0

slave_repl_offset:888541

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:8b90010b378c34aaf89c39a9002684363de31b40

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:888541

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:888541

 

salve2 檢查狀態

[root@test3 slave2]#  redis-cli -h 192.168.242.72 -p 6381 -a hzmcdba

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

192.168.242.72:6381> get k3

"3"

192.168.242.72:6381> info replication

# Replication

role:slave

master_host:192.168.242.70

master_port:6379

master_link_status:up

master_last_io_seconds_ago:0

master_sync_in_progress:0

slave_repl_offset:889127

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:8b90010b378c34aaf89c39a9002684363de31b40

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:889127

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:889127

 

在從庫嘗試寫:

192.168.242.72:6381> set c c

(error) READONLY You can't write against a read only replica

失敗。

 

可以看到一主而從得複製目前是正常同步的,且主庫可以讀寫,從庫只能讀。

 

模擬master 節點down

192.168.242.70:6379> shutdown

not connected>

 

檢視master 的哨兵日誌

從中看出failover 到原slave1

 

檢視原salve1( master)  哨兵程式日誌:

Slave1  為新master

 

檢視slave2 日誌

Salve2 變成原slave1 的從庫了

 

檢視新master 資訊:

192.168.242.71:6380> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=192.168.242.72,port=6381,state=online,offset=1644182,lag=1

master_replid:284d7b39a0b6ef7ba9fc0e821f5841e39b52d3f1

master_replid2:8b90010b378c34aaf89c39a9002684363de31b40

master_repl_offset:1644468

second_repl_offset:890272

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:595893

repl_backlog_histlen:1048576

 

角色為master, 一個從庫, 為原slave1

 

檢視新從庫資訊:

192.168.242.72:6381> info replication

# Replication

role:slave

master_host: 192.168.242.71

master_port:6380

master_link_status:up

master_last_io_seconds_ago:1

master_sync_in_progress:0

slave_repl_offset:1655692

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:284d7b39a0b6ef7ba9fc0e821f5841e39b52d3f1

master_replid2:8b90010b378c34aaf89c39a9002684363de31b40

master_repl_offset:1655692

second_repl_offset:890272

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:607117

repl_backlog_histlen:1048576

 

slave 角色,新的主庫為192.168.242.71

 

測試是否同步

master

192.168.242.71:6380> set k4 4

OK

192.168.242.71:6380> set k5 5

OK

192.168.242.71:6380> set k6 6

OK

 

從庫(slave2

192.168.242.72:6381> get k4

"4"

192.168.242.72:6381> get k5

"5"

192.168.242.72:6381> get k6

"6"

 

看到同步正常

 

 

 

master 修好後

master 修好後,啟動後檢視日誌:

哨兵日誌提示為192.168.242.71 的從庫了

 

檢視複製情況:

[root@localhost redis_master]# redis-cli -h 192.168.242.70 -p 6379 -a hzmcdba

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

192.168.242.70:6379> info replication

# Replication

role:slave

master_host:192.168.242.71

master_port:6380

master_link_status:up

master_last_io_seconds_ago:0

master_sync_in_progress:0

slave_repl_offset:1703883

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:284d7b39a0b6ef7ba9fc0e821f5841e39b52d3f1

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:1703883

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1699100

repl_backlog_histlen:4784

 

變成現在master 的從機了,並不會變成獨立的一臺master

 

測試資料同步正常。

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29956245/viewspace-2933100/,如需轉載,請註明出處,否則將追究法律責任。

相關文章