近期公司的一塊核心業務使用redis做爲配置轉發中心,存在單點問題,考慮服務的可靠性。針對業務需求,咱們肯定了咱們的需求:php
針對以上需求,咱們分別對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
原創文章,轉載請註明: 轉載自始終不夠