故障转移集群无法连接到节点_Redis集群以及自动故障转移测试
在Redis中,與Sentinel(哨兵)實現(xiàn)的高可用相比,集群(cluster)更多的是強調(diào)數(shù)據(jù)的分片或者是節(jié)點的伸縮性,如果在集群的主節(jié)點上加入對應(yīng)的從節(jié)點,集群還可以自動故障轉(zhuǎn)移,因此相比Sentinel(哨兵)還是有不少優(yōu)勢的。
以下簡單測試Redis的集群(單機(jī)多實例的模式),來體驗一下集群的自動故障轉(zhuǎn)移功能,同時結(jié)合Python,來觀察自動故障轉(zhuǎn)移過程中應(yīng)用程序端的表現(xiàn)。
redis集群實例安裝
啟動6個redis集群實例,集群模式,除了正常的配置項目之外,需要在每個主節(jié)點中增加集群配置
cluster-enabled yes? ? ? # 開啟集群模
cluster-node-timeout 1000? # 節(jié)點超時時間,單位毫秒,設(shè)置一個較小的超時時間,目的是為了后面測試自動故障轉(zhuǎn)移的效果
分配slot & 主節(jié)點握手
主節(jié)點分配slot給主節(jié)點,三個主節(jié)點分配16383個slot
8001主----->8004從
8002主----->8005從
8003主----->8006從
#!/bin/bash
for ((i=0;i<=16383;i++))
do
if [ $i -le 5461 ]; then
/usr/local/redis5_1/bin/redis-cli -h 127.0.0.1 -p 8001 -a root CLUSTER ADDSLOTS $i
elif [ $i -gt 5461 ]&&[ $i -le 10922 ]; then
/usr/local/redis5_1/bin/redis-cli -h 127.0.0.1 -p 8002 -a root CLUSTER ADDSLOTS $i
elif [ $i -gt 10922 ]; then
/usr/local/redis5_1/bin/redis-cli -h 127.0.0.1 -p 8003 -a root CLUSTER ADDSLOTS $i
fi
done
分配完slot之后,在第一個主節(jié)點上執(zhí)行cluster meet 127.0.0.1 8002,cluster meet 127.0.0.1 8003
無須在其他兩個主節(jié)點上meet另外兩個主節(jié)點,隨后三個主節(jié)點之間關(guān)系確定會自動確定,目前集群中是三個主節(jié)點
添加主節(jié)點對應(yīng)的從節(jié)點,需要登錄到每個主節(jié)點的實例上,執(zhí)行
三個從節(jié)點分別加入到主節(jié)點之后,此時6個節(jié)點全部加入到集群中
Python連接至集群測試
? ?這里需要安裝redis-py-cluster依賴包
#!/usr/bin/env python3
import time
from time import ctime,sleep
from rediscluster import StrictRedisCluster
startup_nodes = [
{"host":"111.231.253.***", "port":8001},
{"host":"111.231.253.***", "port":8002},
{"host":"111.231.253.***", "port":8003},
{"host":"111.231.253.***", "port":8004},
{"host":"111.231.253.***", "port":8005},
{"host":"111.231.253.***", "port":8006}
]
redis_conn= StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True,password="root")
for i in range(0, 100000):
try:
redis_conn.set('name' + str(i), str(i))
print('setting name' + str(i) +"--->" + time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
except:
print("connect to redis cluster error")
time.sleep(2)
? ?執(zhí)行上述寫入測試腳本之后,數(shù)據(jù)基本上均勻地落在三個節(jié)點上
自動故障轉(zhuǎn)移測試
修改Python腳本,每隔1s寫入一條數(shù)據(jù),目的是便于觀察在主節(jié)點宕機(jī),集群自動故障轉(zhuǎn)移這個時間段之之內(nèi)(1s鐘左右),對于應(yīng)用程序的影響,或者說應(yīng)用程序在自動故障轉(zhuǎn)移前后的表現(xiàn)。
如下腳本循環(huán)往Redis集群中寫入數(shù)據(jù),執(zhí)行期間,強制殺掉一個主節(jié)點,觀察應(yīng)用程序連接情況。
同時,如果發(fā)生異常,暫停應(yīng)用程序2s,因為上面一開始配置的集群故障轉(zhuǎn)移時間是1s,如果應(yīng)用程序暫停2s,完全可以跳過故障轉(zhuǎn)移的過程,
當(dāng)故障轉(zhuǎn)移完成之后,應(yīng)用程序又恢復(fù)成正常狀態(tài),雖然8001節(jié)點宕機(jī),應(yīng)用程序繼續(xù)連接8001節(jié)點,但是應(yīng)用程序完全無感知。
import time
from time import ctime,sleep
from rediscluster import StrictRedisCluster
startup_nodes = [
{"host":"111.231.253.***", "port":8001},
{"host":"111.231.253.***", "port":8002},
{"host":"111.231.253.***", "port":8003},
{"host":"111.231.253.***", "port":8004},
{"host":"111.231.253.***", "port":8005},
{"host":"111.231.253.***", "port":8006}
]
redis_conn= StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True,password="root")
for i in range(0, 100000):
try:
redis_conn.set('name' + str(i), str(i))
print('setting name' + str(i) +"--->" + time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
time.sleep(1)
except:
print("connect to redis cluster error")
time.sleep(2)
? ? 發(fā)現(xiàn)在殺掉主節(jié)點之后,僅發(fā)生了一次連接錯誤,隨后因為Redis集群的自動故障轉(zhuǎn)移成功,對應(yīng)于程序來說是透明的,因此應(yīng)用程序隨后正常工作,不受其中一個主節(jié)點宕機(jī)的影響。
集群此時的狀態(tài),8001節(jié)點宕機(jī),明顯,8001對應(yīng)的從節(jié)點8004接管主節(jié)點,升級為master,對外提供服務(wù)
觀察升級為主節(jié)點的8004實例日志,會發(fā)現(xiàn)在強制殺掉原8001主節(jié)點之后,1秒鐘之內(nèi),成功替代8001升級為master節(jié)點
如果在故障轉(zhuǎn)移的過程中,沒有應(yīng)用程序訪問Redis,應(yīng)用程序甚至完全不知道Redis集群發(fā)生了故障轉(zhuǎn)移,只要不發(fā)生集群中某一個節(jié)點的主從節(jié)點同時宕機(jī),整個集群就沒有問題,且對應(yīng)用程序完全透明。
隨后重啟宕機(jī)的8001節(jié)點,會發(fā)現(xiàn)8001節(jié)點自動變?yōu)槠湓瓘墓?jié)點(8004)的從節(jié)點
整體上來看,Redis集群的配置和使用以及自動故障轉(zhuǎn)移還是比較簡單易容的,這里沒有用redis-trib.rb 而是采用手動分配slot和創(chuàng)建集群的方式,目的是了解完整的配置流程。
需要注意的是:
1、如果開啟了密碼驗證模式,所有的主從節(jié)點必須配置masterauth,因為某一個節(jié)點宕機(jī)重啟之后,會自動變?yōu)閺墓?jié)點,此時如果想要從master復(fù)制數(shù)據(jù),就必須需要主節(jié)點的密碼
2、StrictRedisCluster決定了所有主從節(jié)點的密碼必須要是一樣的。
表面上看Redis集群簡單易用,自動故障轉(zhuǎn)移是沒有問題的,保證了高可用,看似沒有問題。
如果細(xì)想,這個過程還是有問題的,有沒有發(fā)現(xiàn),雖然故障轉(zhuǎn)移保證了高可用,但是當(dāng)從節(jié)點升級為主節(jié)點之后,如果保證升級為主節(jié)點的從節(jié)點(8004)一定能夠完全復(fù)制原主節(jié)點(8001)上的數(shù)據(jù)?
補充:剛寫完就發(fā)現(xiàn),redis在主從復(fù)制上,有一個wait 命令,如下
wait命令可以讓默認(rèn)的異步復(fù)制變?yōu)橥綇?fù)制,
wait numsslave timeout,含義是等待復(fù)制到的slave節(jié)點的個數(shù)和超時時間,如果超時間為0,表示會一直等待(同步到從節(jié)點)
如果從節(jié)點不可達(dá),則wait會一直阻塞主節(jié)點,此時主節(jié)點是無法對外提供服務(wù)的。
這個就類似于MySQL的半同步復(fù)制,主節(jié)點上的數(shù)據(jù),一定要同步(雖然是relaylog)到從節(jié)點,主節(jié)點才會提交。
不過回頭想想,取決于如何去對待Redis或者怎么使用Redis,Redis更多的時候是作為一個緩存使用,而不是落地的數(shù)據(jù)庫,既然是緩存,就應(yīng)該更多地去考慮性能。
推薦閱讀點擊閱讀?機(jī)會難得|大牛移動APP安全測試經(jīng)驗分享
點擊閱讀?音頻測試怎么做?快拿小本本記下來
點擊閱讀?2019軟件測試工程師技能樹知識全面梳理
點擊閱讀?什么是手機(jī)工廠測試?測試流程是怎樣的?
點擊閱讀?全棧增長工程師實戰(zhàn)之功能測試與持續(xù)集成
上文內(nèi)容不用于商業(yè)目的,如涉及知識產(chǎn)權(quán)問題,請聯(lián)系小編(021-64471599-8017)。
戳好看你就點點我總結(jié)
以上是生活随笔為你收集整理的故障转移集群无法连接到节点_Redis集群以及自动故障转移测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机投屏软件_苹果手机怎样投屏到电脑
- 下一篇: dqs server sql_SQL-S