天天看點

一主一從二哨兵_redis(一主兩從三哨兵模式搭建)記錄

目的:

讓看看這篇文章的的人能夠知道:軟體架構、軟體的安裝、配置、基本運維的操作、高可用測試、也包含我自己,能夠節省對應的時間。

軟體架構:

生産環境使用三台伺服器搭建redis哨兵叢集,3個redis執行個體(1主2從)+ 3個哨兵執行個體。生産環境能夠保證在哨兵存活兩台的情況下,隻有一台redis能夠繼續提供服務(一主兩從三哨兵)

主虛拟機1從虛拟機2從虛拟機3

172.16.48.129

172.16.48.130

172.16.48.131

軟體安裝:分别在三台機器上通過yum進行redis的下載下傳和安裝以及開機啟動

# 添加軟體安裝源

yum install epel-release

# 安裝redis

yum install redis -y

# 啟動redis、啟動redis哨兵

systemctl start redis

systemctl start redis-sentinel

# 允許開機啟動

systemctl enable redis

systemctl enable redis-sentinel

# 之後進行配置修改:為哨兵叢集,重新開機啟動服務

/etc/redis.conf(主庫配置)

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

# 1. 修改綁定ip為伺服器内網ip位址,做綁定,三台各自填寫各自的ip位址

bind 172.16.48.129

# 2. 保護模式修改為否,允許遠端連接配接

protected-mode no

# 4. 設定密碼

requirepass "123456789"

# 5. 設定主庫密碼與目前庫密碼同步,保證從庫能夠提升為主庫

masterauth "123456789"

# 6. 打開AOF持久化支援

appendonly yes

/etc/redis.conf(兩個從庫配置)

基本配置和主庫相同,bindip位址各自對應各自的。

需要添加主庫同步配置

# 主庫為主虛拟機1的位址

slaveof 172.16.48.129 6379

/etc/redis-sentinel.conf(哨兵配置)

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

# 1. 綁定的位址

bind 172.19.131.247

# 2. 保護模式修改為否,允許遠端連接配接

protected-mode no

# 3. 設定sentinel myid 每個都不一樣,使用yum安裝的時候,直接就生成了

sentinel myid 04d9d3fef5508f60498ac014388571e719188527

# 4. 設定監控位址,為對應的主redis庫的内網位址

sentinel monitor mymaster 172.16.48.129 6379 2

# 5. 設定5秒内沒有響應,說明伺服器挂了,需要将配置放在sentinel monitor master 127.0.0.1 6379 1下面

sentinel down-after-milliseconds mymaster 5000

# 6. 設定15秒内master沒有活起來,就重新選舉主

sentinel failover-timeout mymaster 15000

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

sentinel parallel-syncs mymaster 2

# 8. 主資料庫密碼,需要将配置放在sentinel monitor master 127.0.0.1 6379 1下面

sentinel auth-pass mymaster 123456789

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

3. 重新啟動

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

# 啟動redis

systemctl restart redis

# 啟動redis哨兵

systemctl restart redis-sentinel

高可用測試:

1. 連接配接redis腳本

# 主虛拟機1

redis-cli -h 172.16.48.129 -p 6379 -a 123456789

# 從虛拟機2

redis-cli -h 172.16.48.130 -p 6379 -a 123456789

# 從虛拟機3

redis-cli -h 172.16.48.131 -p 6379 -a 123456789

2. 同步狀态檢視

# 連接配接完成後輸入指令

info replication

# 主庫顯示如下,即可算完成(包含兩個從庫ip位址)

# Replication

role:master

connected_slaves:2

slave0:ip=172.16.48.131,port=6379,state=online,offset=188041,lag=1

slave1:ip=172.16.48.130,port=6379,state=online,offset=188041,lag=1

master_repl_offset:188041

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:188040

# 從庫顯示如下,即可算完成

# Replication

role:slave

master_host:172.16.48.129

master_port:6379

master_link_status:up

master_last_io_seconds_ago:1

master_sync_in_progress:0

slave_repl_offset:174548

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

3. 主庫寫入測試同步

# 主虛拟機1

set b b

# 從虛拟機2

keys *

get b

# 從虛拟機3

keys *

get b

4. 從庫隻讀測試

# 從虛拟機2

set c c

# result : (error) READONLY You can't write against a read only slave.

# 從虛拟機3

set c c

# result : (error) READONLY You can't write against a read only slave.

5. 成功redis-sentinel日志

# 檢視日志:

tailf /var/log/redis/sentinel.log

成功日志,+slave slave包含兩台從庫的位址,+sentinel sentinel包含兩台哨兵的id

57611:X 21 Oct 02:03:27.777 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

57611:X 21 Oct 02:03:27.777 # Sentinel ID is 42975048e2f70d0f4d718f77427930c16bc0b522

57611:X 21 Oct 02:03:27.777 # +monitor master mymaster 172.16.48.129 6379 quorum 2

57611:X 21 Oct 02:03:27.778 * +slave slave 172.16.48.131:6379 172.16.48.131 6379 @ mymaster 172.16.48.129 6379

57611:X 21 Oct 02:03:27.779 * +slave slave 172.16.48.130:6379 172.16.48.130 6379 @ mymaster 172.16.48.129 6379

57611:X 21 Oct 02:03:29.767 * +sentinel sentinel 29222b827e3739b564939c6f20eb610802b48706 172.16.48.130 26379 @ mymaster 172.16.48.129 6379

57611:X 21 Oct 02:03:29.769 * +sentinel sentinel ea3c41804d2840a4393bbdaf0f32dab321267a9c 172.16.48.131 26379 @ mymaster 172.16.48.129 6379

6. 成功sentinel的連接配接狀态

# 主虛拟機1

redis-cli -h 172.16.48.129 -p 26379 INFO Sentinel

# result:

# 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=172.16.48.129:6379,slaves=2,sentinels=

# 從虛拟機2

redis-cli -h 172.16.48.130 -p 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=172.16.48.129:6379,slaves=2,sentinels=3

# 從虛拟機3

redis-cli -h 172.16.48.131 -p 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=172.16.48.129:6379,slaves=2,sentinels=3

7. 高可用測試case

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

redis服務,至少需要存活一台,才能保證服務正常運作sentinel 選擇新 master 的原則是最近可用 且 資料最新 且 優先級最高 且 活躍最久 !

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

三哨兵情況:redis執行個體挂掉兩台,剩下一台能夠成為主,自動切換

# 保持三個哨兵程序都存在的情況下

# 1. 三個終端分别連接配接redis,使用info replication檢視目前連接配接狀态:

# 主虛拟機1

redis-cli -h 172.16.48.129 -p 6379 -a 123456789 info replication

# 從虛拟機2

redis-cli -h 172.16.48.130 -p 6379 -a 123456789 info replication

# 從虛拟機3

redis-cli -h 172.16.48.131 -p 6379 -a 123456789 info replication

# 2. 停止目前role:master的對應的redis服務,重新檢查狀态看是否切換

systemctl stop redis

# 虛拟機1的執行個體轉換成為主的redis

# 3. 繼續停止剩下兩台:role:master的對應的redis服務,重新檢查連接配接狀态看是否切換

systemctl stop redis

# 虛拟機3的執行個體轉換成為了主的redis

# 切換順利,實作高可用

兩哨兵情況:redis執行個體挂掉兩台,剩下一台能夠成為主,自動切換

# 将全部虛拟機的redis + sentinel重新啟動

systemctl start redis

systemctl start redis-sentinel

# 停止虛拟機1的redis-sentinel,重新執行哨兵的案例測試

systemctl stop redis-sentinel

# 分别停止對應master執行個體的redis,最終剩下一台執行個體,成為了master,能夠自動切換

一哨兵情況:redis執行個體無法主從切換

# 将全部虛拟機的redis + sentinel重新啟動

systemctl start redis

systemctl start redis-sentinel

# 停止虛拟機1和2d的redis-sentinel,重新執行哨兵的案例測試

systemctl stop redis-sentinel

# 分别停止對應master執行個體的redis,最終剩下一台執行個體,無法實作主從切換

8. web服務連接配接測試

建立一個web項目,使用項目進行伺服器連接配接驗證,暫時不提供。使用spring boot + spring-data-redis進行測試

基本運維操作

基本指令操作

# 啟動

systemctl start redis

systemctl start redis-sentinel

# 重新開機

systemctl restart redis

systemctl restart redis-sentinel

# 停止

systemctl stop redis

systemctl stop redis-sentinel

# 開機啟動

systemctl enable redis

systemctl enable redis-sentinel

# 關閉開機啟動

systemctl disable redis

systemctl disable redis-sentinel

# 解除安裝,停止redis服務,sentinel服務之後,關閉開機啟動,進行解除安裝

yum remove redis -y

配置檔案目錄

redis配置檔案:/etc/redis.conf

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

日志檔案目錄

redis日志:/var/log/redis/redis.log

redis-sentinel日志:/var/log/redis/sentinel.log

持久化檔案目錄

redis-dump檔案:/var/lib/redis/dump.rdb

redis-appendonly檔案:/var/lib/redis/appendonly.aof

參考教程