redis集群進行故障檢測的方法:首先修改python腳本,每隔1s寫入一條數據;然后循環往Redis集群中寫入數據,并強制殺掉一個主節點觀察應用程序連接情況;最后重啟宕機的8001節點即可。
Redis集群進行故障檢測的方法:自動故障轉移測試
修改Python腳本,每隔1s寫入一條數據,目的是便于觀察在主節點宕機,集群自動故障轉移這個時間段之之內(1s鐘左右),對于應用程序的影響,或者說應用程序在自動故障轉移前后的表現。
如下腳本循環往Redis集群中寫入數據,執行期間,強制殺掉一個主節點,觀察應用程序連接情況。
同時,如果發生異常,暫停應用程序2s,因為上面一開始配置的集群故障轉移時間是1s,如果應用程序暫停2s,完全可以跳過故障轉移的過程,當故障轉移完成之后,應用程序又恢復成正常狀態,雖然8001節點宕機,應用程序繼續連接8001節點,但是應用程序完全無感知。
相關學習推薦:redis視頻教程
import?timefrom?time?import?ctime,sleepfrom?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)
發現在殺掉主節點之后,僅發生了一次連接錯誤,隨后因為Redis集群的自動故障轉移成功,對應于程序來說是透明的,因此應用程序隨后正常工作,不受其中一個主節點宕機的影響。
集群此時的狀態,8001節點宕機,明顯,8001對應的從節點8004接管主節點,升級為master,對外提供服務
觀察升級為主節點的8004實例日志,會發現在強制殺掉原8001主節點之后,1秒鐘之內,成功替代8001升級為master節點
如果在故障轉移的過程中,沒有應用程序訪問Redis,應用程序甚至完全不知道Redis集群發生了故障轉移,只要不發生集群中某一個節點的主從節點同時宕機,整個集群就沒有問題,且對應用程序完全透明。
隨后重啟宕機的8001節點,會發現8001節點自動變為其原從節點(8004)的從節點