redis sentinel 高可用(HA)方案部署,及python應用示例
阿新 • • 發佈:2018-12-25
簡介
介紹 redis sentinel(哨兵)叢集的部署,配置一主兩從的redis叢集,並通過 python 程式例項講解通過 redis sentinel 訪問叢集
什麼是哨兵(Sentinel)模式
Redis sentinel 為 Redis 叢集提供了高可用解決方案,在叢集出現故障的時候自動故障轉移,保證叢集的可用性
功能
- 監控:檢查主從例項否是正常工作
- 通知:當 redis 例項出現錯誤的時候,可以使用程式(用 api 介面)通知管理員
- 自動故障轉移:在主伺服器發生故障時,哨兵開啟故障轉移處理,提升一臺從伺服器成為主伺服器,其他的從伺服器被重新配置使用新的主伺服器,當應用程式連線時使用新的地址配置
- 配置資訊:哨兵提供了認證和服務發現,客戶端連線到哨兵去獲取當前redis 主伺服器地址,如果發生故障轉移,哨兵將會彙報新的伺服器地址
分散式系統
哨兵是一套分散式系統,它被設計成多個哨兵程序合作執行
- 當多個哨兵認為 master 故障的時候,叢集就會認定主伺服器故障
- 即使只有一個哨兵,它也能工作,系統具有較高的健壯性
哨兵,redis 例項,客戶端在一起構成了一個大的分散式系統
配置方法
安裝 3 臺 redis 伺服器,一主兩從
- 第1臺修改 port: 10001
- 第2臺修改 port: 10002
- 第3臺修改 port: 10003
執行 redis 服務
# 首先設定第一個伺服器為 master redis-server /path/to/server1.conf # 第二個為 slaveredis-server /path/to/server2.conf # 第三個為 slave redis-server /path/to/server3.conf
建立三份配置檔案
建立三份哨兵的配置檔案
# 第1個哨兵配置,埠為 10011 port 10011 sentinel monitor mymaster 127.0.0.1 10001 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1
# 第2個哨兵配置,埠為 10012port 10012 sentinel monitor mymaster 127.0.0.1 10001 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1
# 第3個哨兵配置,埠為 10013 port 10013 sentinel monitor mymaster 127.0.0.1 10001 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1
哨兵配置說明
- 需要制定要監控的主伺服器,給每一個要監控的主伺服器一個不同的名字
- 從伺服器可以自動發現,不需要指定
- 哨兵可以自動更新從伺服器的配置
- 發生故障轉移,從伺服器被提升為主伺服器的時候,或者新的哨兵被發現的時候,配置會被自動重寫
哨兵配置格式與引數含義
配置格式:sentinel <選項的名字> <主伺服器的名字> <選項的值>
- down-after-milliseconds: sentinel 任務伺服器已經下線的毫秒數,redis 伺服器沒有在給定的毫秒數之內返回sentinel的Ping命令回覆, 哨兵主觀認為伺服器已經下線(SDOWN),此時並不會進行故障轉移,當足夠數量的哨兵將伺服器標誌為主觀下線時, 伺服器被標記為客觀下線(ODOWN),執行故障轉移
- parallel-syncs: 在執行故障轉移時,最多可以有多少個從伺服器同時從新的主伺服器進行同步,數字越小,完成故障轉移需要的時間越長
執行哨兵
redis-server /path/to/sentinel1.conf --sentinel redis-server /path/to/sentinel2.conf --sentinel redis-server /path/to/sentinel2.conf --sentinel
python 訪問通過哨兵訪問 redis 叢集
安裝 python redis 客戶端
pip install redis
示例程式
#!/usr/bin/env python from redis.sentinel import Sentinel # 連線哨兵伺服器 sentinel = Sentinel([('127.0.0.1', 10011), ('127.0.0.1', 10012), ('127.0.0.1', 10013)], socket_timeout=0.1) # 獲取主伺服器地址 sentinel.discover_master('mymaster') # 輸出:('127.0.0.1', 10001) # 獲取從伺服器地址 sentinel.discover_slaves('mymaster') # 輸出:[('127.0.0.1', 10001), ('127.0.0.1', 10002), ('127.0.0.1', 10003)] # 獲取主伺服器進行寫入 master = sentinel.master_for('mymaster', socket_timeout=0.1) master.set('foo', 'bar') # 獲取從伺服器進行讀取(預設是round-roubin) slave = sentinel.slave_for('mymaster', socket_timeout=0.1) slave.get('foo') # 輸出:bar