資深架構(gòu)師談Redis高可用架構(gòu)的應(yīng)用及改進(jìn)

前言

隨著很多公司使用Redis作為緩存和高性能存儲方案,Redis的可用性也變得越來越重要。目前

比較主流的HA方案是Sentinel+Redis主從復(fù)制。Sentinel是Redis官方自帶的高可用中間件,運(yùn)維簡單、穩(wěn)定,建議使用Redis

3.0及以上穩(wěn)定版本。

本文重點(diǎn)介紹如何使用該架構(gòu),以及需要注意的問題和解決方案。

HA架構(gòu)圖

首先部署Redis主從復(fù)制集群,比如1主3從;然后部署3個Sentinel節(jié)點(diǎn)。

為了安全起見,Sentinel節(jié)點(diǎn)分別部署在不同的服務(wù)器上,Redis主從節(jié)點(diǎn)分別部署在不同服務(wù)器上。 具體部署步驟,這里不再贅述。

最佳實(shí)踐

針對這個HA架構(gòu),應(yīng)用程序該如何使用呢?這里介紹一個比較簡單可靠的使用方法。

在應(yīng)用程序(APP)配置里設(shè)置如下信息:

3個Sentinel的連接方式(不是Redis主庫連接方式)

Redis密碼

masterName

說明: 如果Sentinel上層使用了LVS,那么配置里改為VIP。

應(yīng)用程序通過和Sentinel交互,獲取到Redis主庫信息,然后再處理讀寫請求。 其中,由于Sentinel帶來的性能開銷很小,可以忽略。

需要注意的地方:

多個Sentinel連接方式,驅(qū)動如何選擇

推薦的處理方式:采用輪訓(xùn)或者隨機(jī)選擇,支持負(fù)載均衡。

如果某個Sentinel宕機(jī),驅(qū)動如何處理

推薦的處理方式:采用重試和黑名單機(jī)制,及時上線和下線故障節(jié)點(diǎn),支持高可用。

驅(qū)動是否具有連接池功能

一般情況下,主流的語言,比如Java,PHP等等,驅(qū)動具有連接管理器的,支持連接復(fù)用。

可以從Redis的info信息里查看,如下:

10.11.11.13:6379> info clients

# Clients

connected_clients:150

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

如果連接無法復(fù)用,connected_clients會飆升到上千,甚至導(dǎo)致Redis服務(wù)異常,停止處理請求。 如果驅(qū)動不支持連接池,需要選擇新驅(qū)動,或者二次開發(fā)驅(qū)動。

問題分析

使用以上HA架構(gòu),細(xì)心的朋友會發(fā)現(xiàn)這樣一個問題。 如果Redis主庫宕機(jī),Redis配置會發(fā)生改變,如下:

某些參數(shù)的值會自動被加上"",比如密碼參數(shù)。 一般禁止使用類似""作為密碼的一部分。Redis密碼 參數(shù)一旦被加上"",在運(yùn)維和使用過程中,就會存在比較大的風(fēng)險(xiǎn)和麻煩。

分析Redis源碼,以下情況會觸發(fā)配置修改:

1)Master故障切換

2)新加入Sentinel

3)執(zhí)行 config rewrite

4)執(zhí)行 sentinel flushconfig

5)執(zhí)行 sentinel remove

6)Sentinel新加入Redis master節(jié)點(diǎn)

解決方案

針對該問題,常用解決方法:

1?人工處理

為Redis密碼加上監(jiān)控,一旦變更,報(bào)警后人工處理。 這是最簡單也是不可靠的方法。

2?腳本控制

開發(fā)一個腳本,周期性監(jiān)控Redis密碼,一旦發(fā)現(xiàn)變更后,自動改回。 這種方法,增加了運(yùn)維成本和風(fēng)險(xiǎn),也無法100%保證解決問題。

3?修改源碼邏輯

修改源碼,從根本上解決這個問題,方法如下:

src/config.c

修改函數(shù)int rewriteConfig(char *path)

注釋如下兩行:

rewriteConfigStringOption(state,"masterauth",server.masterauth,NULL);

rewriteConfigStringOption(state,"requirepass",server.requirepass,NULL);

修改后重新編譯Redis源碼。 可以通過執(zhí)行config rewrite命令驗(yàn)證,Redis密碼參數(shù)不會備自動修改了。

由于代碼改動很小,沒有風(fēng)險(xiǎn)點(diǎn),筆者在線上已經(jīng)使用一年多時間,Redis服務(wù)很穩(wěn)定,沒有問題。

在此我向大家推薦一個架構(gòu)學(xué)習(xí)交流群。交流學(xué)習(xí)群號: 744642380, 里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源,目前受益良

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容