Redis哨兵集群工作原理及架構部署(八)
Redis哨兵集群工作原理及架構部署
文章目錄
Redis哨兵集群工作原理及架構部署
1.redis哨兵模式原理
2.搭建redis哨兵集群
2.1.環(huán)境準備
2.2.在所有機器上部署redis
2.3.三臺redis部署完成
2.4.配置redis主從
2.5.部署哨兵進程sentinel
2.6.啟動哨兵觀察配置文件的變化
2.7.模擬主庫故障驗證應用是否可用
2.8.主庫掛掉其他節(jié)點配置文件的變化
1.redis哨兵模式原理
redis主從復制的不足: 當主庫宕機后,slave無法自己變成主庫,進行數(shù)據(jù)的寫入,每次都需要人為配置將從庫變?yōu)橹鲙觳拍苓M行數(shù)據(jù)寫入,當主庫修復后還需要人為配置導入從庫主機在配置主從復制
redis哨兵模式的優(yōu)勢: redis哨兵建立在主從之上,有一個監(jiān)控功能,監(jiān)控主庫是否異常,當主庫異常之后會自動將某一個slave變?yōu)橹鲙欤〉袅巳藶榕渲?/p>
redis哨兵模式原理: 哨兵模式建立在主從復制基礎之上,會在每一個redis節(jié)點上打開一個sentinel監(jiān)控,每個sentinel進程都有自己的端口號和IP,所有sentinel共享集群信息,集群中所有的sentinel都是可以通信的,當主庫宕機后,主庫上的sentinel就會向集群中的其他節(jié)點的sentinel發(fā)送信息說主庫宕機了,需要在從庫上選舉master,這時每個節(jié)點上的sentinel會比較自己redis配置的ID號,比如slave1的ID號大,slave1就會選舉為master作為主庫,當故障的主庫重新加入集群后,主庫上的sentinel會向其他節(jié)點的sentinel詢問誰是主庫,這時slave1上的sentinel就會告訴主庫上的sentinel說slave1是主庫,重新加入集群的主庫就會找slave1同步數(shù)據(jù),如果重新加入的主庫想再次成為主庫,只需要執(zhí)行提權命令就可以重新成為主庫。
主從復制的時候程序配置redis地址的時候都是寫死主庫的地址,每次主庫宕機都需要手動修改應用
有了哨兵模式后,在程序代碼中配置不是redis地址,而是配置的所有哨兵的地址,形成一個地址池,即使集群中一個哨兵壞掉了,還有其他兩個哨兵,每次需要找redis寫入數(shù)據(jù)時,程序首先會找哨兵進程,哨兵之間信息共享,會立馬告訴程序誰是主庫,這時程序拿到哨兵告訴它的redis主庫地址,就會去找主庫存數(shù)據(jù),因此即使主庫壞了,也不需要修改程序代碼
哨兵的配置文件在啟動哨兵服務后,盡量不要去修改,因為哨兵會自動增加配置
哨兵集群個數(shù)建議是奇數(shù),比如3/5/7
配置了哨兵后,當主庫掛掉,哨兵選舉了新庫,會自動把配置文件修改為最新主庫的地址
哨兵的選舉規(guī)則: 首選判斷slave-priority權重優(yōu)先級,誰的高誰當選為master主庫,如果都一致,那么久比較各個節(jié)點的id,誰的大誰當選
哨兵模式架構和主從復制架構對比
2.搭建redis哨兵集群
2.1.環(huán)境準備
配置哨兵集群步驟:
1.在所有節(jié)點搭建redis
2.配置主從復制,一主兩從
3.在所有節(jié)點配置sentinel,啟動sentinel后,配置文件會自動增加
2.2.在所有機器上部署redis
192.168.81.210配置
1.創(chuàng)建redis部署路徑 [root@redis-1 ~]# mkdir -p /data/redis_cluster/redis_6379/{conf,pid,logs,data} 2.下載redis [root@redis-1 ~]# mkdir /data/soft [root@redis-1 ~]# cd /data/soft [root@redis-1 /data/soft]# wget https://repo.huaweicloud.com/redis/redis-3.2.9.tar.gz 3.便于安裝redis [root@redis-1 /data/soft]# tar xf redis-3.2.9.tar.gz -C /data/redis_cluster/ [root@redis-1 /data/soft]# cd /data/redis_cluster/ [root@redis-1 /data/redis_cluster]# ln -s redis-3.2.9/ redis [root@redis-1 /data/redis_cluster]# cd redis/src [root@redis-1 /data/redis_cluster/redis]# make && make install 4.準備配置文件 [root@redis-1 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf daemonize yes bind 192.168.81.210 127.0.0.1 port 6379 pidfile /data/redis_cluster/redis_6379/pid/redis_6379.pid logfile /data/redis_cluster/redis_6379/logs/redis_6379.log databases 16 dbfilename redis_6379.rdb dir /data/redis_cluster/redis_6379/data/ save 900 1 save 300 100 save 60 10000 5.啟動redis [root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
192.168.81.220配置
由于redis-1已經部署好了一套redis,我們可以直接復制過來使用
1.使用rsync將redis-1的redis目錄拷貝過來你 [root@redis-1 ~]# rsync -avz /data root@192.168.81.220:/ 2.查看拷貝過來的目錄文件 [root@redis-2 ~]# ls /data/redis_cluster/ redis redis-3.2.9 redis_6379 [root@redis-2 ~]# ls /data/redis_cluster/redis_6379/ conf data logs pid 3.編譯安裝redis,使系統(tǒng)能使用redis命令 直接執(zhí)行make install即可,因為編譯步驟在redis-1已經做了 [root@redis-2 ~]# cd /data/redis_cluster/redis-3.2.9/ [root@redis-2 /data/redis_cluster/redis-3.2.9]# make install 4.修改redis配置文件 [root@redis-2 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf bind 192.168.81.220 127.0.0.1 5.啟動redis [root@redis-2 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
192.168.81.230配置
由于redis-1已經部署好了一套redis,我們可以直接復制過來使用
1.使用rsync將redis-1的redis目錄拷貝過來你 [root@redis-1 ~]# rsync -avz /data root@192.168.81.230:/ 2.查看拷貝過來的目錄文件 [root@redis-3 ~]# ls /data/redis_cluster/ redis redis-3.2.9 redis_6379 [root@redis-3 ~]# ls /data/redis_cluster/redis_6379/ conf data logs pid 3.編譯安裝redis,使系統(tǒng)能使用redis命令 直接執(zhí)行make install即可,因為編譯步驟在redis-1已經做了 [root@redis-3 ~]# cd /data/redis_cluster/redis-3.2.9/ [root@redis-3 /data/redis_cluster/redis-3.2.9]# make install 4.修改redis配置文件 [root@redis-3 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf bind 192.168.81.230 127.0.0.1 5.啟動redis [root@redis-3 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2.3.三臺redis部署完成
[root@redis-1 ~]# ps aux | grep redis root 21860 0.1 0.5 139020 9740 ? Ssl 09:36 0:16 redis-server 192.168.81.210:6379 root 25296 0.0 0.0 112724 984 pts/0 S+ 13:15 0:00 grep --color=auto redis [root@redis-1 ~]# ssh 192.168.81.220 "ps aux | grep redis" root 47658 0.1 0.5 141068 10780 ? Ssl 1月28 1:24 redis-server 192.168.81.220:6379 root 63254 0.0 0.0 113176 1588 ? Ss 13:15 0:00 bash -c ps aux | grep redis root 63271 0.0 0.0 112724 968 ? S 13:15 0:00 grep redis [root@redis-1 ~]# ssh 192.168.81.230 "ps aux | grep redis" root 56584 0.1 0.7 136972 7548 ? Ssl 13:13 0:00 redis-server 192.168.81.230:6379 root 56644 0.0 0.1 113176 1588 ? Ss 13:15 0:00 bash -c ps aux | grep redis root 56661 0.0 0.0 112724 968 ? S 13:15 0:00 grep redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2.4.配置redis主從
要在兩臺slave上同步主庫配置
1.配置主從復制 [root@redis-2 ~]# redis-cli 127.0.0.1:6379> SLAVEOF 192.168.81.210 6379 OK [root@redis-3 ~]# redis-cli 127.0.0.1:6379> SLAVEOF 192.168.81.220 6379 OK 2.主庫新建一個key 127.0.0.1:6379> set name jiangxl OK 3.從庫查看是否復制 [root@redis-2 ~]# redis-cli 127.0.0.1:6379> get name "jiangxl" [root@redis-3 ~]# redis-cli 127.0.0.1:6379> get name "jiangxl"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2.5.部署哨兵進程sentinel
配置文件解釋
sentinel monitor mymaster 192.168.81.210 6379 2 //設置主節(jié)點信息,mymaster是主節(jié)點別名,就是隨便起一個名字,然后填寫主節(jié)點的ip地址,2表示當主節(jié)點掛掉后,有2個sentinel同意后才會選舉新的master,一組哨兵集群,要把名稱都寫成一樣的 sentinel down-after-milliseconds mymaster 3000 //主庫宕機多少秒,從庫在進行切換,因為有時因為網絡波動,如果只要主庫一宕機就切換主從,那么redis可能一直處于正在切換狀態(tài) sentinel parallel-syncs mymaster 1 //允許幾個節(jié)點同時向主庫同步數(shù)據(jù) sentinel failover-timeout mymaster 18000 //故障轉移超時時間,當從庫同步主庫的rdb文件,多長時間沒有同步完就認為超時
1
2
3
4
5
三臺redis服務器都要按如下配置,已經將配置文件中的bind寫成了系統(tǒng)變量,在配合cat寫入到文件,因此直接執(zhí)行如下命令即可
1.創(chuàng)建哨兵服務配置路徑 mkdir -p /data/redis_cluster/redis_26379/{conf,data,pid,logs} 2.寫入哨兵配置文件 cat > /data/redis_cluster/redis_26379/conf/redis_26379.conf < 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 配置完記得查看下配置文件bind一列是否是各自主機的ip地址 2.6.啟動哨兵觀察配置文件的變化 三臺機器都這么操作啟動哨兵 redis-sentinel /data/redis_cluster/redis_26379/conf/redis_26379.conf 1 觀察哨兵啟動前后配置文件的變化 啟動前 啟動后 每臺哨兵主機都自動增加了一個myid的配置,這個就是當主庫掛掉后,哨兵選舉的依據(jù),判斷誰的myid大誰就當選為主庫 每臺哨兵主機還自動增加了sentinel known-sentinel這個配置,這個配置每個哨兵會記錄集群中其他節(jié)點的id號,這樣就能夠實現(xiàn)信息共享,即使應用在詢問哨兵進程誰是主庫,這時由于每個哨兵進程都有其他節(jié)點的信息,因此就能里面告訴應用誰是主庫 2.7.模擬主庫故障驗證應用是否可用 配置完哨兵后,每個節(jié)點上都有集群的信息共享,當主庫掛掉后,哨兵進程確認主庫下線了,哨兵根據(jù)各自的id大小選舉新的主庫,接替主庫的工作,保證應用程序不受影響,當主庫修復好后,在通過提權的方式先同步目前主庫的數(shù)據(jù),在讓自身成為主庫 1.關閉主庫的redis服務,reids正常關閉,sentinel直接kill [root@redis-1 ~]# redis-cli shutdown [root@redis-1 ~]# pkill redis 4.查看配置文件看看誰的myid大 redis-2的myid比較大 [root@redis-1 ~]# grep 'known-sentinel' /data/redis_cluster/redis_26379/conf/redis_26379.conf sentinel known-sentinel mymaster 192.168.81.220 26379 df44bb3e9fdf8c635628b1ae724b2db7d3ef144c sentinel known-sentinel mymaster 192.168.81.230 26379 de282d14bb0a79df90603eb92243cd1f362dd46d 2.測試redis-2是否可用寫入數(shù)據(jù) 可以寫入數(shù)據(jù),redis-2被選為主庫 [root@redis-1 ~]# redis-cli -h 192.168.81.220 set gzzy_test guzhangzhuanyi OK [root@redis-1 ~]# redis-cli -h 192.168.81.220 config get slaveof 1) "slaveof" 2) "" 4.測試redis-3是否可用寫入數(shù)據(jù) 寫入數(shù)據(jù)失敗,并且同步的是redis-2的數(shù)據(jù),因此redis-2為主庫 [root@redis-1 ~]# redis-cli -h 192.168.81.230 set kkkk111 vvv (error) READONLY You can't write against a read only slave. [root@redis-1 ~]# redis-cli -h 192.168.81.230 config get slaveof 1) "slaveof" 2) "192.168.81.220 6379" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2.8.主庫掛掉其他節(jié)點配置文件的變化 主庫掛掉后,其他兩個節(jié)點選舉出master后,配置文件也會填寫為新master的地址 Redis 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。