文章目錄
前言:
redis集羣基礎理論知識見我之前博客:
一、redis集羣----主從複製
1.1 實驗環境
-
在主從模式的redis系統中,從數據庫在整個系統中起到了數據冗餘備份和讀寫分離的作用
-
節點部署:
master IP地址:192.168.226.128
- 功能:提供讀、寫
slave1 IP地址:192.168.226.132
- 功能:只讀
slave2 IP地址:192.168.226.133
- 功能:只讀
1.2 實驗過程
-
① 所有節點安裝redis
此處只演示master節點
[root@master ~]# yum install -y gcc gcc-c++ make
#可以選擇直接下載壓縮包,本次實驗已將壓縮包下好,所以直接掛載使用就好了
#在線下載命令:
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
#掛載使用
[root@master ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:
[root@master ~]# cd /mnt
[root@master mnt]# tar zxvf redis-5.0.7.tar.gz -C /usr/local
#編譯安裝
[root@master mnt]# cd /usr/local
[root@master local]# mv redis-5.0.7 redis
[root@master redis]# cd redis
[root@master redis]# make
[root@master src]# cd src
[root@master src]# make install
.......省略部分內容
- ② 修改主配置文件
#master節點
[root@master src]# vim /usr/local/redis/redis.conf
#69行 修改監聽地址爲0.0.0.0(在實驗環境使用),現網環境建議綁定從服務器IP地址
#136行 開啓守護進程
daemonize yes
#171行 修改日誌文件目錄
logfile /usr/local/redis/redis.log
#263行 修改工作目錄
dir /usr/local/redis
#699行 開啓AOF持久化功能
appendonly yes
#slave節點
#與master節點修改一直,多修改一個同步master節點IP和端口
replicaof 192.168.226.128 6379
- ③ 所有節點設置防火牆規則、放通6379端口的信息流通
[root@master src]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
success
[root@master src]# firewall-cmd --reload
success
- ④ 設置內存分配策略
[root@master src]# vim /etc/sysctl.conf
#在行尾添加以下內容
vm.overcommit_memory = 1
----》wq
#刷新生效
[root@master src]# sysctl -p
-
內核參數overcommit_memory
overcommit_memory是內核分配策略
可選值:0、1、2
- 0 表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
- 1 表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
- 2 表示內核允許分配超過所有物理內存和交換空間總和的內存
-
⑤ 啓動redis服務,先啓動master節點、再啓動slave節點
[root@master src]# /usr/local/redis/src/redis-server /usr/local/redis/redis.conf
[root@master src]# netstat -natp | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 93265/redis-server
- 此時查看日誌可看到兩個slave節點已成功連接
[root@master src]# tail -f /usr/local/redis/redis.log
93265:M 26 Mar 2020 20:43:21.781 * Background saving terminated with success
93265:M 26 Mar 2020 20:43:21.781 * Synchronization with replica 192.168.226.132:6379 succeeded
93265:M 26 Mar 2020 20:43:24.224 * Replica 192.168.226.133:6379 asks for synchronization
93265:M 26 Mar 2020 20:43:24.224 * Full resync requested by replica 192.168.226.133:6379
93265:M 26 Mar 2020 20:43:24.224 * Starting BGSAVE for SYNC with target: disk
93265:M 26 Mar 2020 20:43:24.224 * Background saving started by pid 94625
94625:C 26 Mar 2020 20:43:24.225 * DB saved on disk
94625:C 26 Mar 2020 20:43:24.225 * RDB: 2 MB of memory used by copy-on-write
93265:M 26 Mar 2020 20:43:24.299 * Background saving terminated with success
93265:M 26 Mar 2020 20:43:24.300 * Synchronization with replica 192.168.226.133:6379 succeeded
- 可通過登錄數據庫查看master信息
[root@master src]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2 #以下爲已連接的從服務器信息
slave0:ip=192.168.226.132,port=6379,state=online,offset=168,lag=1
slave1:ip=192.168.226.133,port=6379,state=online,offset=168,lag=0
master_replid:c358000ba4eaaebd56176e3b273e7973bb5efa8b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168
-
⑤ 驗證主從複製
再主節點創建鍵值對,從服務也可查詢到信息,但是不能創建新的鍵值對
#master節點
127.0.0.1:6379> set work money
OK
127.0.0.1:6379> keys *
1) "work"
127.0.0.1:6379> get work
"money"
127.0.0.1:6379> exit
#slave節點
[root@slave1 src]# redis-cli -h 192.168.226.132 -p 6379
192.168.226.132:6379> keys *
1) "work"
192.168.226.132:6379> get work
"money"
二、redis 羣集----哨兵模式
2.1 哨兵模式原理
- 哨兵(sentinel) 是一個分佈式系統,用於對主從結構中的每臺服務器進行監控,當出現故障時通過投票機制選擇新的master並將所有slave連接到新的master。
2.2 哨兵模式作用
-
① 監控
不斷的檢查master和slave是否正常運行。
master存活檢測、master與slave運行情況檢測
-
② 通知(提醒)
當被監控的服務器出現問題時,向其他(哨兵間,客戶端)發送通知。
-
③ 自動故障轉移
斷開master與slave連接,選取一個slave作爲master,將其他slave連接到新的master,並告知客戶端新的服務器地址
PS:哨兵也是一臺redis服務器,只是不提供數據服務
通常哨兵配置數量爲單數(因爲哨兵在監控時通常只要哨兵數量的一半加1認爲master宕機了就認定master宕機了
哨兵一般是與redis工作節點是分開設置的,服務啓動順序爲:先啓動主機、在啓動從機、最後啓動哨兵
2.3 哨兵配置項
2.4 哨兵工作原理
-
主從切換
哨兵在進行主從切換的過程中經歷三個階段
-
① 監控:同步信息
-
② 通知:保持連通
-
③ 故障轉移:
發現問題
競選負責人
優先新master
新master上任後,其他slave切換master,原master作爲slave故障恢復後連接
-
-
階段一:監控階段
-
階段二:通知階段
- 階段三:故障轉移階段
2.5 實驗過程
- 修改哨兵模式的配置文件(所有節點)
[root@master src]# cd ..
[root@master redis]# vim sentinel.conf
#17行 開啓:關閉保護模式
protected-mode no
#26行 指定sentinel爲後臺啓動
daemonize yes
#36行 指定日誌存放路徑
logfile /usr/local/redis/sentinel.log
#65行 指定數據庫存放路徑
dir /usr/local/redis
#84行 至少有幾個哨兵檢測到主服務器故障了,才進行故障遷移
sentinel monitor mymaster 192.168.226.128 6379 2
#113行 指定哨兵在監控Redis服務時,判定服務器掛掉的時間週期,默認30000毫秒(30秒)
#此處爲了見效快,改爲3秒
sentinel down-after-milliseconds mymaster 3000
#146行 指定出現故障後,故障切換的最大超時時間,超過該值,認定切換失敗,默認爲180000毫秒(3分鐘)
sentinel failover-timeout mymaster 120000
-
開啓哨兵模式
哨兵模式,現開啓master節點的,再開啓slave節點的
#後臺運行
/usr/local/redis/src/redis-sentinel /usr/local/redis/sentinel.conf &
- 查看哨兵信息
[root@master redis]# redis-cli -h 192.168.226.128 -p 26379 info Sentinel
2.6 故障模擬
- 查看redis-server進程號
[root@master redis]# ps -ef | grep redis
root 29568 1 0 21:39 ? 00:00:01 /usr/local/redis/src/redis-sentinel *:26379 [sentinel]
root 44714 12307 0 21:52 pts/0 00:00:00 grep --color=auto redis
root 93265 1 0 20:42 ? 00:00:04 /usr/local/redis/src/redis-server 0.0.0.0:6379
- kill進程號模擬故障
[root@master redis]# kill -9
#查看日誌
[root@master redis]# tail -f /usr/local/redis/sentinel.log
#以下爲主節點故障,從節點頂替主節點
switch-master mymaster 192.168.226.128 6379 192.168.226.132 6379