1. 程式人生 > >redis sentinel 高可用(HA)方案部署,及python應用示例

redis sentinel 高可用(HA)方案部署,及python應用示例

簡介

介紹 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

# 第二個為 slave
redis-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個哨兵配置,埠為 10012
port 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

哨兵配置說明

  1. 需要制定要監控的主伺服器,給每一個要監控的主伺服器一個不同的名字
  2. 從伺服器可以自動發現,不需要指定
  3. 哨兵可以自動更新從伺服器的配置
  4. 發生故障轉移,從伺服器被提升為主伺服器的時候,或者新的哨兵被發現的時候,配置會被自動重寫

哨兵配置格式與引數含義

配置格式:sentinel <選項的名字> <主伺服器的名字> <選項的值>

  1. down-after-milliseconds: sentinel 任務伺服器已經下線的毫秒數,redis 伺服器沒有在給定的毫秒數之內返回sentinel的Ping命令回覆, 哨兵主觀認為伺服器已經下線(SDOWN),此時並不會進行故障轉移,當足夠數量的哨兵將伺服器標誌為主觀下線時, 伺服器被標記為客觀下線(ODOWN),執行故障轉移
  2. 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