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

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

軟件架構:
生產環境使用三臺服務器搭建redis哨兵集羣,3個redis實例(1主2從)+ 3個哨兵實例。生產環境能夠保證在哨兵存活兩臺的情況下,只有一臺redis能夠繼續提供服務(一主兩從三哨兵)
在這裏插入圖片描述
軟件安裝:分別在三臺機器上通過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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章