redis-sentinel 高可用方案實踐

近期公司的一塊核心業務使用redis做爲配置轉發中心,存在單點問題,考慮服務的可靠性。針對業務需求,咱們肯定了咱們的需求:php

  1. 異地跨機房容災
  2. 故障自動切換
  3. 儘量高的保證數據不丟失

針對以上需求,咱們分別對redis主從復之,redis-cluster,redis-sentinel方案進行了調研,對比結果以下:mysql

方案git

數據可靠性github

服務可靠性redis

風險sql

主從備份api

網絡

composer

出問題須要手動切換,中間推送的數據會丟失運維

redis-cluster

異地機房熱備,機房間網絡出問題的狀況下會出現腦裂的問題;同時咱們對redis-cluster無運維和使用經驗

redis-sentinel

在master宕機後,客戶端會經過api查詢當前master歸屬,重連redis

使用內網同步,主從之間的數據丟失同步基本能夠忽略,業務能夠忍受

基於以上調研,咱們放棄了主從備份方案,對redis-cluster及redis-sentinel方案進行了深刻分析。redis-cluster採用主從備份、master選舉的方式實現高可用,但在異地機房部署時,如配置不當,很容易引起腦裂問題;同時因爲redis-cluster咱們並無成熟的運維經驗,最終放棄了該方案,轉向redis-sentinel。 redis-sentinel就像他的名字同樣,他是一個哨兵,監控master狀態,若是超過規定時間沒有響應,則自動進行主從切換,期間會有一段時間(決定於具體的配置參數)redis集羣沒法提供服務 。原理相似mysql的MHA。redis-sentinel-server同時提供了一套接口,用於查詢當前集羣的狀態,Java的客戶端有完整的封裝,php的擴展並無提供相應功能,在github上有幾個package,但因爲太過複雜,不適合遷移到現有業務(沒有使用命名空間和composer),因此基於phpredis-2.2.8封裝了一個簡易的redis-sentinel客戶端,目前已在覈心業務生產環境上穩定運行。Java客戶端與php客戶端經過查詢redis-sentinel集羣得到當前redis-master地址,進行鏈接,當集羣發生主從切換時,客戶端會進行重連。 php-redis-sentinel的demo代碼以下:

1
2
3
4
5
6
7
8
9
10
$sentinel_pool new \Jenner\RedisSentinel\SentinelPool();
$sentinel_pool ->addSentinel( '127.0.0.1' , 26379);
$sentinel_pool ->addSentinel( '127.0.0.1' , 26380);
 
$address $sentinel_pool ->master( 'mymaster' );
print_r( $address );
 
$redis $sentinel_pool ->getRedis( 'mymaster' );
$info $redis ->info();
print_r( $info );

參考資料: redis-sentinel: https://redis.io/topics/sentinel cluster-tutorial: https://redis.io/topics/cluster-tutorial cluster-spec: https://redis.io/topics/cluster-spec  

原創文章,轉載請註明: 轉載自始終不夠

相關文章
相關標籤/搜索