《三七互娛DBA溫國(guó)兵:Redis高可用架構(gòu)最佳實(shí)踐》要點(diǎn):
本文介紹了三七互娛DBA溫國(guó)兵:Redis高可用架構(gòu)最佳實(shí)踐,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
作者:溫國(guó)兵,曾任職于酷狗音樂,現(xiàn)為三七互娛 DBA.目前主要關(guān)注領(lǐng)域:數(shù)據(jù)庫(kù)自動(dòng)化運(yùn)維、高可用架構(gòu)設(shè)計(jì)、數(shù)據(jù)庫(kù)安全、海量數(shù)據(jù)解決方案、以及開源技術(shù)在互聯(lián)網(wǎng)中的應(yīng)用.
Redis 是一個(gè)開源的使用 ANSI C 語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value 數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的 API.如今,互聯(lián)網(wǎng)業(yè)務(wù)的數(shù)據(jù)正以更快的速度在增長(zhǎng),數(shù)據(jù)類型越來(lái)越豐富,這對(duì)數(shù)據(jù)處理的速度和能力提出了更高要求.Redis 是一種開源的內(nèi)存非關(guān)系型數(shù)據(jù)庫(kù),給開發(fā)人員帶來(lái)的體驗(yàn)是顛覆性的.在自始至終的設(shè)計(jì)過程中,都充分考慮高性能,這使得 Redis 成為當(dāng)今速度最快的 NoSQL 數(shù)據(jù)庫(kù).考慮高性能的同時(shí),高可用也是很重要的考慮因素.互聯(lián)網(wǎng) 7×24 無(wú)間斷服務(wù),在故障期間以最快的速度 Failover,能給企業(yè)帶來(lái)最小的損失.那么,在實(shí)際應(yīng)用中,都有哪些高可用架構(gòu)呢?架構(gòu)之間有何優(yōu)劣?我們應(yīng)該怎么取舍?有哪些最佳實(shí)踐?
在講解 Redis 高可用方案之前,我們先來(lái)看看 Redis Sentinel 原理是怎么樣的.
1、Sentinel 集群通過給定的配置文件發(fā)現(xiàn) master,啟動(dòng)時(shí)會(huì)監(jiān)控 master.通過向 master 發(fā)送 info 信息獲得該服務(wù)器下面的所有從服務(wù)器.
2、Sentinel 集群通過命令連接向被監(jiān)視的主從服務(wù)器發(fā)送 hello 信息 (每秒一次),該信息包括 Sentinel 本身的 IP、端口、id 等內(nèi)容,以此來(lái)向其他 Sentinel 宣告自己的存在.
3、Sentinel 集群通過訂閱連接接收其他 Sentinel 發(fā)送的 hello 信息,以此來(lái)發(fā)現(xiàn)監(jiān)視同一個(gè)主服務(wù)器的其他 Sentinel;集群之間會(huì)互相創(chuàng)建命令連接用于通信,因?yàn)橐呀?jīng)有主從服務(wù)器作為發(fā)送和接收 hello 信息的中介,Sentinel 之間不會(huì)創(chuàng)建訂閱連接.
4、Sentinel 集群使用 ping 命令來(lái)檢測(cè)實(shí)例的狀態(tài),如果在指定的時(shí)間內(nèi)(down-after-milliseconds)沒有回復(fù)或則返回錯(cuò)誤的回復(fù),那么該實(shí)例被判為下線.
5、當(dāng) failover 主備切換被觸發(fā)后,failover 并不會(huì)馬上進(jìn)行,還需要 Sentinel 中的大多數(shù)?Sentinel 授權(quán)后才可以進(jìn)行 failover,即進(jìn)行 failover 的 Sentinel 會(huì)去獲得指定?quorum 個(gè)的 Sentinel 的授權(quán),成功后進(jìn)入 ODOWN 狀態(tài).如在 5 個(gè) Sentinel 中配置了 2 個(gè) quorum,等到 2 個(gè) Sentinel 認(rèn)為 master 死了就執(zhí)行 failover.
6、Sentinel 向選為 master 的 slave 發(fā)送SLAVEOF NO ONE命令,選擇 slave 的條件是 Sentinel 首先會(huì)根據(jù) slaves 的優(yōu)先級(jí)來(lái)進(jìn)行排序,優(yōu)先級(jí)越小排名越靠前.如果優(yōu)先級(jí)相同,則查看復(fù)制的下標(biāo),哪個(gè)從 master 接收的復(fù)制數(shù)據(jù)多,哪個(gè)就靠前.如果優(yōu)先級(jí)和下標(biāo)都相同,就選擇進(jìn)程 ID 較小的.
7、Sentinel 被授權(quán)后,它將會(huì)獲得宕掉的 master 的一份最新配置版本號(hào) (config-epoch),當(dāng) failover 執(zhí)行結(jié)束以后,這個(gè)版本號(hào)將會(huì)被用于最新的配置,通過廣播形式通知其它 Sentinel,其它的 Sentinel 則更新對(duì)應(yīng) master 的配置.
1 到 3 是自動(dòng)發(fā)現(xiàn)機(jī)制:
4 是檢測(cè)機(jī)制,5 和 6 是 failover 機(jī)制,7 是更新配置機(jī)制.
講解完 Redis Sentinel 原理之后,接下來(lái)講解常用的 Redis 高可用架構(gòu).
JedisSentinelPool,適合 Java
PHP 基于 phpredis 自行封裝
接下來(lái)配合圖文逐個(gè)講解.
2.1 Redis Sentinel 集群 + 內(nèi)網(wǎng) DNS + 自定義腳本
上圖是已經(jīng)在線上環(huán)境應(yīng)用的方案.底層是 Redis Sentinel 集群,代理著 Redis 主從,Web 端連接內(nèi)網(wǎng) DNS 提供服務(wù).內(nèi)網(wǎng) DNS 按照一定的規(guī)則分配,比如?xxxx.redis.cache/queue.port.xxx.xxx,第一個(gè)段表示業(yè)務(wù)簡(jiǎn)寫,第二個(gè)段表示這是 Redis 內(nèi)網(wǎng)域名,第三個(gè)段表示 Redis 類型,cache 表示緩存,queue 表示隊(duì)列,第四個(gè)段表示 Redis 端口,第五、第六個(gè)段表示內(nèi)網(wǎng)主域名.當(dāng)主節(jié)點(diǎn)發(fā)生故障,比如機(jī)器故障、Redis 節(jié)點(diǎn)故障或者網(wǎng)絡(luò)不可達(dá),Sentinel 集群會(huì)調(diào)用?client-reconfig-script?配置的腳本,修改對(duì)應(yīng)端口的內(nèi)網(wǎng)域名.對(duì)應(yīng)端口的內(nèi)網(wǎng)域名指向新的 Redis 主節(jié)點(diǎn).優(yōu)點(diǎn):
缺點(diǎn):
2.2 Redis Sentinel 集群 + VIP + 自定義腳本
此方案和上一個(gè)方案相比,略有不同.第一個(gè)方案使用了內(nèi)網(wǎng) DNS,第二個(gè)方案把內(nèi)網(wǎng) DNS 換成了虛擬 IP.底層是 Redis Sentinel 集群,代理著 Redis 主從,Web 端通過 VIP 提供服務(wù).在部署 Redis 主從的時(shí)候,需要將虛擬 IP 綁定到當(dāng)前的 Redis 主節(jié)點(diǎn).當(dāng)主節(jié)點(diǎn)發(fā)生故障,比如機(jī)器故障、Redis 節(jié)點(diǎn)故障或者網(wǎng)絡(luò)不可達(dá),Sentinel 集群會(huì)調(diào)用 client-reconfig-script 配置的腳本,將 VIP 漂移到新的主節(jié)點(diǎn)上.
優(yōu)點(diǎn):
缺點(diǎn):
2.3 封裝客戶端直連 Redis Sentinel 端口
部分業(yè)務(wù)只能通過外網(wǎng)訪問 Redis,上述兩種方案均不可用,于是衍生出了這種方案.Web 使用客戶端連接其中一臺(tái) Redis Sentinel 集群中的一臺(tái)機(jī)器的某個(gè)端口,然后通過這個(gè)端口獲取到當(dāng)前的主節(jié)點(diǎn),然后再連接到真實(shí)的 Redis 主節(jié)點(diǎn)進(jìn)行相應(yīng)的業(yè)務(wù)員操作.需要注意的是,Redis Sentinel 端口和 Redis 主節(jié)點(diǎn)均需要開放訪問權(quán)限.如果前端業(yè)務(wù)使用 Java,有 JedisSentinelPool 可以復(fù)用;如果前端業(yè)務(wù)使用 PHP,可以在 phpredis 的基礎(chǔ)上做二次封裝.
優(yōu)點(diǎn):
缺點(diǎn):
2.4 Redis Sentinel 集群 + Keepalived/Haproxy
底層是 Redis Sentinel 集群,代理著 Redis 主從,Web 端通過 VIP 提供服務(wù).當(dāng)主節(jié)點(diǎn)發(fā)生故障,比如機(jī)器故障、Redis 節(jié)點(diǎn)故障或者網(wǎng)絡(luò)不可達(dá),Redis 之間的切換通過 Redis Sentinel 內(nèi)部機(jī)制保障,VIP 切換通過 Keepalived 保障.
優(yōu)點(diǎn):
缺點(diǎn):
2.5 Redis M/S + Keepalived
此方案沒有使用到 Redis Sentinel.此方案使用了原生的主從和 Keepalived,VIP 切換通過 Keepalived 保障,Redis 主從之間的切換需要自定義腳本實(shí)現(xiàn).
優(yōu)點(diǎn):
缺點(diǎn):
2.6 Redis Cluster
From: http://intro2libsys.com/focused-redis-topics/day-one/intro-redis-cluster
Redis 3.0.0 在 2015 年 4 月 2 日正式發(fā)布,距今已有兩年多的時(shí)間.Redis 集群采用 P2P 模式,無(wú)中心化.把 key 分成 16384 個(gè) slot,每個(gè)實(shí)例負(fù)責(zé)一部分 slot.客戶端請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),若該實(shí)例 slot 沒有對(duì)應(yīng)的數(shù)據(jù),該實(shí)例會(huì)轉(zhuǎn)發(fā)給對(duì)應(yīng)的實(shí)例.另外,Redis 集群通過 Gossip 協(xié)議同步節(jié)點(diǎn)信息.
優(yōu)點(diǎn):
缺點(diǎn):
2.7 Twemproxy
From: http://engineering.bloomreach.com/the-evolution-of-fault-tolerant-redis-cluster
多個(gè)同構(gòu) Twemproxy(配置相同)同時(shí)工作,接受客戶端的請(qǐng)求,根據(jù) hash 算法,轉(zhuǎn)發(fā)給對(duì)應(yīng)的 Redis.
Twemproxy 方案比較成熟了,之前我們團(tuán)隊(duì)長(zhǎng)期使用此方案,但是效果并不是很理想.一方面是定位問題比較困難,另一方面是它對(duì)自動(dòng)剔除節(jié)點(diǎn)的支持不是很友好.
優(yōu)點(diǎn):
缺點(diǎn):
2.8 Codis
From:?https://github.com/CodisLabs/codis
Codis 是由豌豆莢開源的產(chǎn)品,涉及組件眾多,其中 ZooKeeper 存放路由表和代理節(jié)點(diǎn)元數(shù)據(jù)、分發(fā) Codis-Config 的命令;Codis-Config 是集成管理工具,有 Web 界面供使用;Codis-Proxy 是一個(gè)兼容 Redis 協(xié)議的無(wú)狀態(tài)代理;Codis-Redis 基于 Redis 2.8 版本二次開發(fā),加入 slot 支持,方便遷移數(shù)據(jù).
優(yōu)點(diǎn):
缺點(diǎn):
所謂的最佳實(shí)踐,都是最適合具體場(chǎng)景的實(shí)踐.主推以下方案:
以下是實(shí)戰(zhàn)過程中總結(jié)出的最佳實(shí)踐:
UseDNS no
GSSAPIAuthentication no
- 來(lái)源:溫國(guó)兵的隨想錄
- 原文:http://t.cn/RSAmhUN
- 題圖:來(lái)自谷歌圖片搜索
- 版權(quán):本文版權(quán)歸原作者所有
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/3759.html