Redis高可用部署

redis 高可用原理:

Redis使用sentinel機(jī)制來(lái)實(shí)現(xiàn)高可用,sentinel是另外一個(gè)集群,主要是用來(lái)監(jiān)控所有的Redis服務(wù)器,所有redis主節(jié)點(diǎn)和redis從節(jié)點(diǎn),監(jiān)控方式使用的是ping指令,sentinel每隔1秒向master發(fā)送【ping】,如果在一段時(shí)間內(nèi)沒(méi)有收到【pong】或者收到無(wú)效回復(fù),則認(rèn)為master下線。
sentinel對(duì)下線有兩種定義:
a.主觀下線(sdown):sentinel實(shí)例本身對(duì)服務(wù)實(shí)例的判斷
b.客觀下線(odown):多個(gè)sentinel實(shí)例對(duì)同一個(gè)服務(wù)SDOWN的狀態(tài)做出協(xié)商后的判斷,只有master才可能在odown狀態(tài) 。

簡(jiǎn)單的說(shuō),一個(gè)sentinel單獨(dú)做出的判斷只能是sdown,是沒(méi)有任何官方效力的,只有多個(gè)sentinel大家商量好,得到一致,才能將某個(gè)master狀態(tài)從sdown置為odown,只有確定master的狀態(tài)轉(zhuǎn)換為odown狀態(tài)后,才能做后續(xù)failover的操作。
sentinel能夠?qū)崿F(xiàn)監(jiān)控整個(gè)主從復(fù)制架構(gòu),你只要告訴sentinel誰(shuí)是主服務(wù)器就行了,它會(huì)從主服務(wù)器上,也就是向主服務(wù)發(fā)送info指令,了解這個(gè)主下面有哪些從服務(wù)器,如果發(fā)現(xiàn)主服務(wù)器離線了,它會(huì)自動(dòng)從這個(gè)主服務(wù)器下面的某個(gè)從服務(wù)器中選舉一個(gè)當(dāng)新的主節(jié)點(diǎn),那么此前從節(jié)點(diǎn)連的主節(jié)點(diǎn)是原來(lái)的老主,原來(lái)的主節(jié)點(diǎn)不在了怎么辦,sentinel告訴客戶(hù)端新的主是誰(shuí) ,向客戶(hù)端發(fā)送slaveof指定讓從節(jié)點(diǎn)重新選擇主節(jié)點(diǎn)。
如果sentinel連不主節(jié)點(diǎn)或者sentinel本身故障了怎么辦,所以sentinel需要做一個(gè)集群。由集群中的每個(gè)節(jié)點(diǎn)來(lái)共同判斷redis節(jié)點(diǎn)是否down了。
Sentinel作用是管理多個(gè)redis服務(wù)實(shí)現(xiàn)HA
監(jiān)控:Sentinel 會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。
通知:當(dāng)被監(jiān)控的某個(gè)Redis服務(wù)器出現(xiàn)問(wèn)題時(shí), Sentinel可以通過(guò)API向管理員或者其他應(yīng)用程序發(fā)送通知。
自動(dòng)故障轉(zhuǎn)移:當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí), Sentinel會(huì)開(kāi)始一次自動(dòng)故障遷移操作,它會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器,并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器;當(dāng)客戶(hù)端試圖連接失效的主服務(wù)器時(shí),集群也會(huì)向客戶(hù)端返回新主服務(wù)器的地址,使得集群可以使用新主服務(wù)器代替失效服務(wù)器。
使用的是流言協(xié)議,投票協(xié)議。

堅(jiān)守“ 做人真誠(chéng) · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專(zhuān)業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都門(mén)窗定制小微創(chuàng)業(yè)公司專(zhuān)業(yè)提供成都企業(yè)網(wǎng)站定制營(yíng)銷(xiāo)網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺(jué)設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁(yè)布局、功能開(kāi)發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

sentinel的啟動(dòng)

啟動(dòng)方式有兩種:

#通過(guò)redis-server 的sentinel參數(shù)啟動(dòng):
    redis-servier /etc/sentinel.conf  --sentinel
#通過(guò)redis-sentinel命令啟動(dòng):
    redis-sentinel /etc/sentinel.conf 

Sentinel依賴(lài)于配置文件,它必須用配置文件不停保存自已的狀態(tài)信息。

啟動(dòng)一個(gè)sentinel有以下幾個(gè)步驟:

  1. 服務(wù)器自身初始化 。
    運(yùn)行 redis-server 中專(zhuān)用于sentinel功能的代碼
  2. 初始化sentinel狀態(tài),根據(jù)給定的配置文件,初始化監(jiān)控的master服務(wù)器列表
  3. 創(chuàng)建連向master的連接。

sentinel專(zhuān)用配置文件解析

 #sentinel.conf為其專(zhuān)用配置文件,主要設(shè)置如下參數(shù):
#默認(rèn)Port
   port 26379 
#指定要監(jiān)控的master,mymaster是定義的master名字,quorum為法定票數(shù)2,此處指的是sentinel的數(shù),只有指定的sentinel同意時(shí)才認(rèn)為sentinel做的決策是有效的,一般大于sentinel數(shù)量的半數(shù)??梢杂卸鄠€(gè)master,一組sentinel集群可以監(jiān)控N個(gè)主從復(fù)制架構(gòu) 
   sentinel monitor mymaster 127.0.0.1 6379 2   
#指定要連接的redis master密碼 
   sentinel auth-pass mymaster redis  
#至少多長(zhǎng)時(shí)間 連不上才認(rèn)為主的離線了。單位為ms,   即連接超時(shí)時(shí)長(zhǎng)
   sentinel down-after-milliseconds mymaster 30000 
# 剛剛設(shè)定為新主時(shí),允許同時(shí)有多少個(gè)從向主發(fā)起同步請(qǐng)求。 
   sentinel parallel-syncs 1 
#當(dāng)master故障時(shí),把新的從提升為master,多長(zhǎng)時(shí)間提不上就認(rèn)為故障轉(zhuǎn)移失敗。 
   sentinel failover-timeout mymaster 180000 #故障轉(zhuǎn)移的超時(shí)時(shí)長(zhǎng)              

sentinel專(zhuān)用命令:

sentinel masters  #獲取所有監(jiān)控的master
sentinel slaves <master name>  #列出該master的所有從節(jié)點(diǎn) 
sentinel  get-master-addr-by-name <master name>#根據(jù)master名字來(lái)獲取地址 
sentinel  reset    #重置所有,從頭再來(lái) 
sentinel failover <mater name>  #手動(dòng)故障轉(zhuǎn)移,并指明向哪組master發(fā)起手動(dòng) 

Redis高可用配置示例

Redis版本:3.2.2
一主兩從:
主:10.3.1.15 6379
從:10.3.1.15 6378
從:10.3.1.15 6376
一個(gè)Sentinel:10.3.1.17

  • 在每個(gè)從節(jié)點(diǎn)的redis.conf 加上slaveof即可成為主從關(guān)系:
    slaveof <masterip> <masterport>

    在redis.conf配置文件中bind監(jiān)聽(tīng)如果有多個(gè)IP,應(yīng)將本機(jī)IP放在前面,回環(huán)地址放在最后,因?yàn)閞edis通常用最前面的IP與master通信。

  • 連接到主服務(wù)器上查看:
    #可以看到主從關(guān)系已正常
    127.0.0.1:6379> INFO replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=10.3.1.15,port=6378,state=online,offset=5204,lag=1
    slave1:ip=10.3.1.15,port=6376,state=online,offset=5204,lag=1
    master_repl_offset:5218
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:5217
    127.0.0.1:6379>
  • 配置sentinel.conf
    sentinel.conf的配置參數(shù)上面已經(jīng)描述。
  • 在前臺(tái)啟動(dòng)sentinel
#啟動(dòng)sentinel 
./bin/redis-sentinel /data/service/redis/sentinel.conf  
18844:X 23 Mar 18:34:58.053 * Increased maximum number of open files to 10032 (it was originally set to 1024). 
...
...
18844:X 23 Mar 18:34:58.054 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 

18844:X 23 Mar 18:34:58.056 # Sentinel ID is 524c94beed78f379e4a0b3b641992449b0cdcf7f 

18844:X 23 Mar 18:34:58.056 # +monitor master mymaster 10.3.1.15 6379 quorum 2 

18844:X 23 Mar 18:34:58.057 * +slave slave 10.3.1.15:6378 10.3.1.15 6378 @ mymaster 10.3.1.15 6379 

18844:X 23 Mar 18:34:58.059 * +slave slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 
#啟動(dòng)完成,從控制臺(tái)上面可以看到sentinel已經(jīng)找到master和slave。
  • 下面是連入sentinel 查看master信息:

    root@ubuntu17:$ redis-cli -h 10.3.1.17 -p 26379 
    10.3.1.17:26379> info 
    DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside. 

    如上,輸入info后報(bào)錯(cuò)說(shuō)是redis工作在保護(hù)模式下,通過(guò)'CONFIG SET protected-mode no 來(lái)關(guān)閉,因?yàn)槟J(rèn)protected-mode 為yes。
    所以在所有的redis,即一主兩從上都加上這句話,然后再進(jìn)入sentinel輸入info,仍然報(bào)此錯(cuò),于是嘗試在sentinel本身的sentinel.conf文件中加入了這句,保存并重啟sentinel,然后執(zhí)行info就不報(bào)錯(cuò)了。

  • 部署成功性驗(yàn)證:
    #顯示正常
    10.3.1.17:26379> INFO 
    # 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=10.3.1.15:6379,slaves=2,sentinels=1 
    10.3.1.17:26379>  
#獲取sentinel 所監(jiān)控的redis master服務(wù)器信息 
10.3.1.17:26379> sentinel masters 
1)  1) "name" 
     2) "mymaster" 
     3) "ip" 
     4) "10.3.1.15" 
     5) "port" 
     6) "6379" 
     7) "runid" 
     8) "3520e56cadc7a3cd591da0094199d46a83771318" 
     9) "flags" 
   10) "master"
   11) "link-pending-commands" 
   12) "0" 
   13) "link-refcount" 
   14) "1" 
   15) "last-ping-sent" 
   16) "0" 
   17) "last-ok-ping-reply" 
   18) "697" 
   19) "last-ping-reply" 
   20) "697" 
   21) "down-after-milliseconds" 
   22) "30000" 
  • 高可用驗(yàn)證:
    當(dāng)把主master 停掉,在sentinel控制臺(tái)中可以看到詳細(xì)的故障轉(zhuǎn)移過(guò)程:
62360:X 24 Mar 13:05:53.197 # +sdown master mymaster 10.3.1.15 6379  #主觀認(rèn)為master已失效 

62360:X 24 Mar 13:05:53.197 # +odown master mymaster 10.3.1.15 6379 #quorum 1/1  #客觀認(rèn)為master已失效 

62360:X 24 Mar 13:06:07.965 # +new-epoch 13  #準(zhǔn)備進(jìn)master新一紀(jì)元,第13次選舉。 

62360:X 24 Mar 13:06:07.965 # +try-failover master mymaster 10.3.1.15 6379  #嘗試轉(zhuǎn)移master 

62360:X 24 Mar 13:06:07.967 # +vote-for-leader 9cf767f451de09136054ccc6afc6dcc5f939b5a0 13  #投票選舉leader 

62360:X 24 Mar 13:06:07.967 # +elected-leader master mymaster 10.3.1.15 6379  #之前被選舉出來(lái)的 master 

62360:X 24 Mar 13:06:07.967 # +failover-state-select-slave master mymaster 10.3.1.15 6379 #Leader開(kāi)始select合適的master 

62360:X 24 Mar 13:06:08.034 # +selected-slave slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 #已找到了合適的從10.3.1.15:6376為主 

62360:X 24 Mar 13:06:08.034 * +failover-state-send-slaveof-noone slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 #Leader 向 slave 發(fā)送“slaveof no one”指令,此時(shí) slave 已經(jīng)完成角色轉(zhuǎn)換,此 slave 即為 master 

62360:X 24 Mar 13:06:08.093 * +failover-state-wait-promotion slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 #等待其他 sentinel 確認(rèn) slave 

62360:X 24 Mar 13:06:09.116 # +promoted-slave slave 10.3.1.15:6376 10.3.1.15 6376 @ mymaster 10.3.1.15 6379 #確認(rèn)成功 

62360:X 24 Mar 13:06:09.116 # +failover-state-reconf-slaves master mymaster 10.3.1.15 6379 #開(kāi)始對(duì)slaves進(jìn)行reconfig 操作 

62360:X 24 Mar 13:06:09.176 * +slave-reconf-sent slave 10.3.1.15:6378 10.3.1.15 6378 @ mymaster 10.3.1.15 6379 #向指定的slave 發(fā)送“slaveof”指令,告知此 slave 跟隨新的 master 

62360:X 24 Mar 13:06:10.132 * +slave-reconf-inprog slave 10.3.1.15:6378 10.3.1.15 6378 @ mymaster 10.3.1.15 6379 開(kāi)始對(duì)slaves進(jìn)行reconfig 操作 

然后進(jìn)入sentinel中查看新的master:

10.3.1.17:26379> sentinel masters 
 #可以看到master已經(jīng)發(fā)生了改變
1)  1) "name" 
     2) "mymaster" 
     3) "ip"  
     4) "10.3.1.15"   
     5) "port" 
     6) "6376" 
     7) "runid"  

回到某個(gè)slave節(jié)點(diǎn)查看:

10.3.1.15:6378> config get slaveof 
1) "slaveof" 
2) "10.3.1.15 6376" 
10.3.1.15:6378>  

現(xiàn)在把原來(lái)的master 6379啟動(dòng)起來(lái),再看下它是主還是從:

10.3.1.15:6379> config get slaveof 
1) "slaveof" 
2) "10.3.1.15 6376" 
#原來(lái)的master,此時(shí)已是從節(jié)點(diǎn)了

現(xiàn)在進(jìn)入新選舉出來(lái)的master查看:

10.3.1.15:6376> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.3.1.15,port=6379,state=online,offset=707098,lag=1
slave1:ip=10.3.1.15,port=6379,state=online,offset=707013,lag=1
master_repl_offset:707098
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:707097
10.3.1.15:6376> 

以上就是Redis sentinel就是高可用功能,應(yīng)用程序應(yīng)該向sentinel發(fā)請(qǐng)求,去尋求新Master的地址,這時(shí)要用redis專(zhuān)用程序,根據(jù)sentinel反饋來(lái)聯(lián)絡(luò)新服務(wù)器。

名稱(chēng)欄目:Redis高可用部署
文章鏈接:http://bm7419.com/article10/jjssdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃營(yíng)銷(xiāo)型網(wǎng)站建設(shè)App開(kāi)發(fā)用戶(hù)體驗(yàn)網(wǎng)站排名標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司