Redis複製與哨兵 搭建主備集羣

redis以其優秀的性能,豐富的數據結構,高可用和分佈式的特性,應用各類大大小小的系統中。做爲當今爛大街的技術,redis是開發者必須掌握的技能之一 大數據時代單點已知足不了企業及系統各類需求,分佈式及微服務盛行。redis3.0推出了redis cluster的集羣方案。目前已成爲主流 複製與哨兵是redis實現高可用的基礎。下文將學習搭建主備結構的單機多實例集羣,下一節學習redis clusterredis

搭建主從結構

令一個redis節點成爲另外一個節點的從節點的配置很簡單bash

slaveof {masterIP} {port}
複製代碼

能夠經過配置文件,也能夠在運行期動態配置網絡

準備四個配置文件,分別爲redis-6379.conf, redis-6380.conf, redis-6381.conf, redis-6382.conf。其中redis-6379.conf爲主節點,其他三個爲從節點數據結構

redis-6379.conf配置app

# 綁定爲本地IP
bind 127.0.0.1
# 是否設置爲守護進程
daemonize yes
# 端口
port 6379
# 工做目錄
dir /var/redis
# 日誌文件
logfile redis-6379.log
# 開啓AOF
appendonly yes
# AOF文件名
appendfilename redis-6379.aof
複製代碼

redis-6380.conf配置分佈式

# 綁定爲本地IP
bind 127.0.0.1
# 是否設置爲守護進程
daemonize yes
# 端口
port 6380
# 工做目錄
dir /var/redis
# 日誌文件
logfile redis-6380.log
# 使其成爲redis-6379的從節點
slaveof 127.0.0.1 6379
複製代碼

其他兩個從節點配置如redis-6380,修改端口便可。其他配置採用默認配置微服務

啓動四個redis服務性能

redis-server ./redis-6379.conf
redis-server ./redis-6380.conf
redis-server ./redis-6381.conf
redis-server ./redis-6382.conf
複製代碼

若是配置錯誤啓動會失敗並輸出錯誤信息。啓動後能夠用redis-cli發送ping學習

redis-cli -p 6379 ping
複製代碼

輸出pong,代表redis服務已正常啓動測試

亦可經過ps命令查看進程

ps -ef | grep redis
複製代碼

img

redis-cli客戶端鏈接主節點,使用info replication查看主節點信息

img
redis-cli客戶端鏈接從節點,使用info replication查看從節點信息
img
可觀察到主從模式的集羣已搭建完成。簡單測試一下,打開四個終端分別鏈接四個節點,get一個不存在的鍵
img

再向主節點set這個鍵,從節點再次get這個鍵

img
成功在從節點讀取到key。其餘的數據結構也同樣,這裏不作演示。

至此,一主三從的單機多實例redis集羣已搭建結束。這種結構適合有大量的讀場景,能夠把讀命令分擔到從節點,主節點只負責寫,從而下降主節點的壓力。但對於有寫較多的場景,這種結構反而會由於主節點不斷向直連的從節點發送寫命令形成大量網絡開銷,同時也下降主節點的穩定性。此時能夠採用樹狀的主從結構,即從節點下還有從節點(從節點slaveof從節點),經過中間層,能夠下降主節點壓力,延遲偏大是缺點之一

img

哨兵

在主從模式下的集羣,若是master掛掉了,會帶來巨大的災難,首先要選出一個節點爲主節點,再修改其他從節點的主節點配置,同時還要讓使用服務的客戶端修改相應的節點地址,這種繁瑣的處理將會帶來巨大的損失。在redis2.8推出了哨兵模式,redis sentinel來幫助解決主節點故障的問題(ps: redis sentinel不支持樹狀的集羣)

sentinel會按期檢測redis,若是超過了指定數目的sentinel認爲主節點已下線了,那麼sentinel將會從全部從節點中選舉一個節點成爲主節點,幫助完成故障轉移處理

setinel的主要配置爲 sentinel monitor {masterName} {masterIP} {port} {num} 其中masterName爲給主節點起的名字,num表示當多少sentinel認爲主節點下線進行故障轉移

常見配置還有以下

# sentinel按期檢測節點,當超過配置時間時,sentinel主觀認爲該節點已下線
sentinel down-after-milliseconds {masterName} {times(毫秒)}

# sentinel故障轉移時間限制,超過該時間則認爲本次故障轉移失敗
sentinel failover-timeout {masterName} {times(毫秒)}

# 監控的主節點設置了密碼,sentinel必須配置相應的密碼
sentinel auth-pass {masterName} {times(毫秒)}
複製代碼

更多配置可參考sentinel文檔 redis.io/topics/sent…

配置三個哨兵

準備三個配置文件sentinel-26379.conf,sentinel-26380.conf,sentinel-26381.conf

# 綁定本地ip
bind 127.0.0.1
# 三個否爲守護進程
daemonize yes
# 端口
port 26379
# 工做目錄
dir /var/redis
# 日誌文件
logfile sentinel-26379.log
# 哨兵配置
sentinel monitor redis6379 127.0.0.1 6379 2
複製代碼

由於sentinel會監控主節點,其他節點就沒必要再配置,由sentinel自動幫助完成

其餘sentinel配置採用默認,剩餘兩個配置相似,只需修改一下端口及日誌文件

啓動sentinel服務

redis-sentinel sentinel-26379.conf
redis-sentinel sentinel-26380.conf
redis-sentinel sentinel-26381.conf
複製代碼

啓動後咱們觀察配置文件

# 綁定本地ip
bind 127.0.0.1
# 三個否爲守護進程
daemonize yes
# 端口
port 26379
# 工做目錄
dir "/private/var/redis"
# 日誌文件
logfile "sentinel-26379.log"
# 哨兵配置
sentinel myid 6fbd88616019490a57593fb53cd25ee2378c7ff5
# Generated by CONFIG REWRITE
protected-mode no
sentinel deny-scripts-reconfig yes
sentinel monitor redis6379 127.0.0.1 6379 2
sentinel config-epoch redis6379 0
sentinel leader-epoch redis6379 0
sentinel known-replica redis6379 127.0.0.1 6382
sentinel known-replica redis6379 127.0.0.1 6380
sentinel known-replica redis6379 127.0.0.1 6381
sentinel known-sentinel redis6379 127.0.0.1 26381 7d9673a79af38b090caa73105f76a4ac67f9fc76
sentinel known-sentinel redis6379 127.0.0.1 26380 890fa4e3723e7faaaf60fddadf1857821e07e873
sentinel current-epoch 0
複製代碼

sentinel自動發現了從節點以及其他的sentinel節點

img

模擬主節點故障下線狀況,鏈接redis-6379,發送shutdown命令(亦可kill -9進程)

redis-cli -p 6379 shutdown
複製代碼

此時咱們再查看redis-6380和redis-6381信息

redis-cli -p 6380 info replication
複製代碼
redis-cli -p 6381 info replication
複製代碼

img
能夠看到redis-6380已晉升爲主節點,其他從節點的主節點配置也變動了,sentinel已自動完成故障轉移
相關文章
相關標籤/搜索