天天综合天天看夜夜添狠狠玩-天天综合天天干-天天综合天天操-天天综合天天-久久dj视频-久久bb

<< 點擊返回公司新聞列表
高可用 Redis 服務架構分析與搭建
瀏覽量 196時間 2021-12-04

基于內(nèi)存的Redis應該是目前各種web開發(fā)業(yè)務中最為常用的key-value數(shù)據(jù)庫了,我們經(jīng)常在業(yè)務中用其存儲用戶登陸態(tài)(Session存儲),加速一些熱數(shù)據(jù)的查詢(相比較mysql而言,速度有數(shù)量級的提升),做簡單的消息隊列(LPUSH和BRPOP)、訂閱發(fā)布(PUB/SUB)系統(tǒng)等等。規(guī)模比較大的互聯(lián)網(wǎng)公司,一般都會有專門的團隊,將Redis存儲以基礎服務的形式提供給各個業(yè)務調(diào)用。

 

不過任何一個基礎服務的提供方,都會被調(diào)用方問起的一個問題是:你的服務是否具有高可用性?最好不要因為你的服務經(jīng)常出問題,導致我這邊的業(yè)務跟著遭殃。最近我所在的項目中也自己搭了一套小型的“高可用”Redis服務,在此做一下自己的總結和思考。

 

首先我們要定義一下對于Redis服務來說怎樣才算是高可用,即在各種出現(xiàn)異常的情況下,依然可以正常提供服務。或者寬松一些,出現(xiàn)異常的情況下,只經(jīng)過很短暫的時間即可恢復正常服務。所謂異常,應該至少包含了以下幾種可能性:

 

【異常1】某個節(jié)點服務器的某個進程突然down掉(例如某開發(fā)手殘,把一臺服務器的redis-server進程kill了)

 

【異常2】某臺節(jié)點服務器down掉,相當于這個節(jié)點上所有進程都停了(例如某運維手殘,把一個服務器的電源拔了;例如一些老舊機器出現(xiàn)硬件故障)

 

【異常3】任意兩個節(jié)點服務器之間的通信中斷了(例如某臨時工手殘,把用于兩個機房通信的光纜挖斷了)

 

其實以上任意一種異常都是小概率事件,而做到高可用性的基本指導思想就是:多個小概率事件同時發(fā)生的概率可以忽略不計。只要我們設計的系統(tǒng)可以容忍短時間內(nèi)的單點故障,即可實現(xiàn)高可用性。

 

對于搭建高可用Redis服務,網(wǎng)上已有了很多方案,例如Keepalived、Codis、Twemproxy、Redis Sentinel。其中Codis和Twemproxy主要是用于大規(guī)模的Redis集群中,也是在Redis官方發(fā)布Redis Sentinel之前twitter和豌豆莢提供的開源解決方案。我的業(yè)務中數(shù)據(jù)量并不大,所以搞集群服務反而是浪費機器了。最終在Keepalived和Redis Sentinel之間做了個選擇,選擇了官方的解決方案Redis Sentinel。

 

Redis Sentinel可以理解為一個監(jiān)控Redis Server服務是否正常的進程,并且一旦檢測到不正常,可以自動地將備份(slave)Redis Server啟用,使得外部用戶對Redis服務內(nèi)部出現(xiàn)的異常無感知。我們按照由簡至繁的步驟,搭建一個最小型的高可用的Redis服務。

 

-     單機版Redis Server    -

 

 

一般情況下,我們搭的個人網(wǎng)站,或者平時做開發(fā)時,會起一個單實例的Redis Server。調(diào)用方直接連接Redis服務即可,甚至Client和Redis本身就處于同一臺服務器上。

 

這種搭配僅適合個人學習娛樂,畢竟這種配置總會有單點故障的問題無法解決。一旦Redis服務進程掛了,或者服務器1停機了,那么服務就不可用了。并且如果沒有配置Redis數(shù)據(jù)持久化的話,Redis內(nèi)部已經(jīng)存儲的數(shù)據(jù)也會丟失。

 

方案2:主從同步Redis Server,單實例Sentinel

 

 

為了實現(xiàn)高可用,解決方案1中所述的單點故障問題,我們必須增加一個備份服務,即在兩臺服務器上分別各啟動一個Redis Server進程,一般情況下由master提供服務,slave只負責同步和備份。與此同時,在額外啟動一個Sentinel進程,監(jiān)控兩個Redis Server實例的可用性,以便在master掛掉的時候,及時把slave提升到master的角色繼續(xù)提供服務,這樣就實現(xiàn)了Redis Server的高可用。這基于一個高可用服務設計的依據(jù),即單點故障本身就是個小概率事件,而多個單點同時故障(即master和slave同時掛掉),可以認為是(基本)不可能發(fā)生的事件。

 

對于Redis服務的調(diào)用方來說,現(xiàn)在要連接的是Redis Sentinel服務,而不是Redis Server了。常見的調(diào)用過程是,client先連接Redis Sentinel并詢問目前Redis Server中哪個服務是master,哪些是slave,然后再去連接相應的Redis Server進行操作。當然目前的第三方庫一般都已經(jīng)實現(xiàn)了這一調(diào)用過程,不再需要我們手動去實現(xiàn)(例如Nodejs的ioredis,PHP的predis,Golang的go-redis/redis,JAVA的jedis等)。

 

然而,我們實現(xiàn)了Redis Server服務的主從切換之后,又引入了一個新的問題,即Redis Sentinel本身也是個單點服務,一旦Sentinel進程掛了,那么客戶端就沒辦法鏈接Sentinel了。所以說,方案2的配置并無法實現(xiàn)高可用性。

 

方案3:主從同步Redis Server,雙實例Sentinel

 

 

為了解決方案2的問題,我們把Redis Sentinel進程也額外啟動一份,兩個Sentinel進程同時為客戶端提供服務發(fā)現(xiàn)的功能。對于客戶端來說,它可以連接任何一個Redis Sentinel服務,來獲取當前Redis Server實例的基本信息。通常情況下,我們會在Client端配置多個Redis Sentinel的鏈接地址,Client一旦發(fā)現(xiàn)某個地址連接不上,會去試圖連接其他的Sentinel實例,這當然也不需要我們手動實現(xiàn),各個開發(fā)語言中比較熱門的redis連接庫都幫我們實現(xiàn)了這個功能。我們預期是:即使其中一個Redis Sentinel掛掉了,還有另外一個Sentinel可以提供服務。

 

然而,愿景是美好的,現(xiàn)實卻是很殘酷的。如此架構下,依然無法實現(xiàn)Redis服務的高可用。方案3示意圖中,紅線部分是兩臺服務器之間的通信,而我們所設想的異常場景(【異常2】)是,某臺服務器整體down機,不妨假設服務器1停機,此時,只剩下服務器2上面的Redis Sentinel和slave Redis Server進程。這時,Sentinel其實是不會將僅剩的slave切換成master繼續(xù)服務的,也就導致Redis服務不可用,因為Redis的設定是只有當超過50%的Sentinel進程可以連通并投票選取新的master時,才會真正發(fā)生主從切換。本例中兩個Sentinel只有一個可以連通,等于50%并不在可以主從切換的場景中。

 

你可能會問,為什么Redis要有這個50%的設定?假設我們允許小于等于50%的Sentinel連通的場景下也可以進行主從切換。試想一下【異常3】,即服務器1和服務器2之間的網(wǎng)絡中斷,但是服務器本身是可以運行的。如下圖所示:

 

 

實際上對于服務器2來說,服務器1直接down掉和服務器1網(wǎng)絡連不通是一樣的效果,反正都是突然就無法進行任何通信了。假設網(wǎng)絡中斷時我們允許服務器2的Sentinel把slave切換為master,結果就是你現(xiàn)在擁有了兩個可以對外提供服務的Redis Server。Client做任何的增刪改操作,有可能落在服務器1的Redis上,也有可能落在服務器2的Redis上(取決于Client到底連通的是哪個Sentinel),造成數(shù)據(jù)混亂。即使后面服務器1和服務器2之間的網(wǎng)絡又恢復了,那我們也無法把數(shù)據(jù)統(tǒng)一了(兩份不一樣的數(shù)據(jù),到底該信任誰呢?),數(shù)據(jù)一致性完全被破壞。

 

方案4:主從同步Redis Server,三實例Sentinel

 

 

鑒于方案3并沒有辦法做到高可用,我們最終的版本就是上圖所示的方案4了。實際上這就是我們最終搭建的架構。我們引入了服務器3,并且在3上面又搭建起一個Redis Sentinel進程,現(xiàn)在由三個Sentinel進程來管理兩個Redis Server實例。這種場景下,不管是單一進程故障、還是單個機器故障、還是某兩個機器網(wǎng)絡通信故障,都可以繼續(xù)對外提供Redis服務。

 

實際上,如果你的機器比較空閑,當然也可以把服務器3上面也開啟一個Redis Server,形成1 master + 2 slave的架構,每個數(shù)據(jù)都有兩個備份,可用性會提升一些。當然也并不是slave越多越好,畢竟主從同步也是需要時間成本的。

 

在方案4中,一旦服務器1和其他服務器的通信完全中斷,那么服務器2和3會將slave切換為master。對于客戶端來說,在這么一瞬間會有2個master提供服務,并且一旦網(wǎng)絡恢復了,那么所有在中斷期間落在服務器1上的新數(shù)據(jù)都會丟失。如果想要部分解決這個問題,可以配置Redis Server進程,讓其在檢測到自己網(wǎng)絡有問題的時候,立即停止服務,避免在網(wǎng)絡故障期間還有新數(shù)據(jù)進來(可以參考Redis的min-slaves-to-write和min-slaves-max-lag這兩個配置項)。

 

至此,我們就用3臺機器搭建了一個高可用的Redis服務。其實網(wǎng)上還有更加節(jié)省機器的辦法,就是把一個Sentinel進程放在Client機器上,而不是服務提供方的機器上。只不過在公司里面,一般服務的提供方和調(diào)用方并不來自同一個團隊。兩個團隊共同操作同一個機器,很容易因為溝通問題導致一些誤操作,所以出于這種人為因素的考慮,我們還是采用了方案4的架構。并且由于服務器3上面只跑了一個Sentinel進程,對服務器資源消耗并不多,還可以用服務器3來跑一些其他的服務。

 

-     Redis Sentinel    -

 

易用性:像使用單機版Redis一樣使用Redis Sentinel

 

作為服務的提供方,我們總是會講到用戶體驗問題。在上述方案當中始終有一個讓Client端用的不是那么舒服的地方。對于單機版Redis,Client端直接連接Redis Server,我們只需要給一個ip和port,Client就可以使用我們的服務了。而改造成Sentinel模式之后,Client不得不采用一些支持Sentinel模式的外部依賴包,并且還要修改自己的Redis連接配置,這對于“矯情”的用戶來講顯然是不能接收的。有沒有辦法還是像在使用單機版的Redis那樣,只給Client一個固定的ip和port就可以提供服務呢?

 

 

答案當然是肯定的。這可能就要引入虛擬IP(Virtual IP,VIP),如上圖所示。我們可以把虛擬IP指向Redis Server master所在的服務器,在發(fā)生Redis主從切換的時候,會觸發(fā)一個回調(diào)腳本,回調(diào)腳本中將VIP切換至slave所在的服務器。這樣對于Client端來說,他仿佛在使用的依然是一個單機版的高可用Redis服務。

 

-     總結    -

 

搭建任何一個服務,做到“能用”其實是非常簡單的,就像我們運行一個單機版的Redis。不過一旦要做到“高可用”,事情就會變得復雜起來。

 

業(yè)務中使用了額外的兩臺服務器,3個Sentinel進程+1個Slave進程,只是為了保證在那小概率的事故中依然做到服務可用。在實際業(yè)務中我們還啟用了supervisor做進程監(jiān)控,一旦進程意外退出,會自動嘗試重新啟動。



上一篇:MySQL 性能優(yōu)化的 9 種知識,面試再也不怕了!
下一篇:盤點市面上主流的時序數(shù)據(jù)庫

推薦閱讀
免費體驗秦拓進銷存ERP管理系統(tǒng)后臺管理系統(tǒng)立即體驗
欧美 丝袜 自拍 制服 另类| 老年镖客视频大全播放| 久久国产精品77777| 男女后进式猛烈XX00动态图| 日韩人妻不卡一区二区三区| 亚洲 小说区 图片区 都市| 亚洲中文字幕在线第六区| MATUREHDHQ成熟| 国产猛烈高潮尖叫视频免费| 久久久久女教师免费一区| 欧洲AV无码放荡人妇网站| 无码一区二区av| 欲求不满邻居的爆乳在线播放 | 亚洲国产成人爱AV在线播放| 50岁人妻丰满熟妇ΑV无码区| 丰满日韩放荡少妇无码视频| 精品国产三级A∨在线无码| 欧美熟老妇人B多毛OOXⅩ| 无码一区在线视频| 中国小帅男男GAYXNXX| 粉嫩少妇内射浓精VIDEOS| 精品久久人人做人人爽综合| 人妻人人做人碰人人添| 亚洲AV一宅男色影视| 999久久久免费精品国产| 亚洲人色婷婷成人网站在线观看| 午夜亚洲AⅤ无码高潮片| 在线精品国精品国产尤物| 丰满老师引诱我进她身体| 久久A级毛片免费观看| 人人婷婷色综合五月第四人色阁| 亚洲AV优女天堂熟女| JAPANESEHD春药2| 国产午夜手机精彩视频| 欧美大波少妇在厨房被| 小少妇BBBBBBBBBBBB| 7723影视大全在线观看| 国产又黄又大又粗的视频| 欧美日韩人妻一区二区| 亚洲AV无码专区春药在线观看| CHINA丰满人妻VIDEOS| 韩国午夜理伦三级理论三级| 人人妻熟妇中年乱子伦A| 亚洲日韩中文字幕日本| 国产AV一区二区三区最新精品| 久久亚洲精品AB无码播放| 无码人妻一区二区三区在线| 2021韩剧在线观看韩剧网| 果冻传媒AⅤ毛片无码| 强奷乱码中文字幕熟女导航| 亚洲日本VA一区二区三区| 饭桌上故意张开腿让公在线观看 | 亚洲AV无码国产在丝袜线观看| 99RE热这里只有精品视频| 豪妇荡乳1一5潘金莲2在线| 日本精品久久久久中文字幕| 一本大道久久A久久综合| 国产沙发午睡系列999| 日本丰满少妇无码AⅤ波多| 影视AV久久久噜噜噜噜噜三级| 国产经典一区二区三区蜜芽| 全彩漫画口工18禁无遮H| 一本大道香蕉大无线吗| 国产美女精品一区二区三区 | 菠萝视频高清观看免费6| 久久亚洲精品无码| 亚洲AV永久中文无码精品| 儿子比老公更大更硬朗| 欧美另类精品黑人巨大| 亚洲性色成人AV天堂| 国产无套中出学生姝| 日韩在线一区二区三区| 99国产欧美久久久精品| 久久天天躁夜夜躁狠狠躁2022| 亚洲AV网站在线| 国产成人AV大片在线播放| 青草伊人久久综在合线亚洲观看| 一本大道东京热无码| 狠狠躁夜夜躁人妻蜜臂AV| 无码少妇一区二区三区芒果| 成人午夜福利免费体验区| 欧美嫩FREEXXXHD| 中文字幕AV无码专区第一页| 精品人妻人人做人人爽| 亚洲AV日韩精品久久久久久A| 国产92成人精品视频免费| 人妖CHINESECDTS在线| 51精品人人搡人妻人人玩| 裸睡时一自慰不小心就滑进去啦| 亚洲国产精品一区二区久久 | 午夜三级A三级三点自慰| 大伊香蕉在线精品视频75| 强壮公的侵犯让我高潮不断| 97国产精华最好的产品在线| 浪货两个都满足不了你| 艳妇乳肉豪妇荡乳ⅩXXOO软件| 寂寞夜晚看的MV字幕高清网站| 小婷又软又嫩又紧水又多的视频| 国产成人亚洲精品| 熟女俱乐部五十路二区AV| 大屁股熟女白浆一区二区| 日本久久久久精品免费网播放 | 中文字幕,久热精品,视频在线| 久久成人亚洲香蕉草草| 亚洲欧美中文日韩在线V日本| 韩国全部三级伦在线播放 | 国产欧美日韩第一章午夜在线| 特级毛片在线大全免费播放| 国产69久久精品成人看| 天天躁夜夜踩很很踩2022| 国产AV精品白浆一区二| 天天影视性色香欲综合网| 国产99久久精品一区二区| 天堂资源在线官网| 国产精产国品一二三产区区别| 无码吃奶揉捏奶头高潮视频| 国产精品久久久久久久影院 | 制服丝袜长腿无码专区第一页| 烂货我捏烂你的奶| 中国孕妇变态孕交XXXX| 免费国产无人区码卡二卡3卡 | 亚洲精品V天堂中文字幕| 激情综合婷婷丁香五月尤物| 亚洲精品无码久久久久牙蜜区| 久久av蜜臀人妻一区二区三区| 亚洲熟妇无码AV在线少妇| 久久天天躁狠狠躁夜夜96流白浆 | 欧美黑人又大又粗XXXⅩ| SLEEP强弙VIDE○SHO| 日本乱码伦午夜福利在线| 国产96在线 | 国产| 无码人妻一区二区三区兔费| 海角精产国品一二三区别| 亚洲欧美日韩国产精品一区| 久久久久亚洲AV无码麻豆| 中文字幕无码久久一区| 欧洲熟妇色ⅩXXXX欧美老妇 | 揉着我的奶从后面进去| 国产风流老太婆大BBBHD视频| 性夜影院爽黄A爽在线看18禁| 精品国产AⅤ一区二区三区在线看| 亚洲另类在线视频| 美女扒开腿让男人桶爽免费 | 国产在线无码视频一区二区三区 | 蜜臀98精品国产免费观看| CHINESE东北嫖妓女HD| 肉感妇BBWBBWBBWBBW| 国产亚洲美女精品久久久2020| 亚洲午夜久久久久久久久电影网| 免费A级毛片无码A∨蜜芽| 啊灬啊灬高潮来了…视频APP| 深夜A级毛片催情精视频免费| 国产又爽又黄又舒服又刺激视频| 亚洲一区二区三区乱码AⅤ蜜桃女| 免费观看男女AV入口网站| 把腿张开老子cao烂你动态图| 玩弄放荡人妇系列AV在线网站| 激情 小说 亚洲 图片 伦| 中国人妻被两个老外三P| 日本老熟妇MATUREBBW| 国产精品久免费的黄网站| 亚洲色成人网站WWW永久小说| 女人与公拘交酡过程高清视频| 东北妓女激情普通话对白| 性生交大片免费看| 麻豆产精国品一二三产区区| 成 人 A V天堂| 亚洲AV无码AV在线播放| 秘书在办公室被躁到高潮 | 亚洲AV成人片无码网站网8X| 精东传媒VS天美传媒在线老牛| 呦系列视频一区二区三区| 任你躁久久精品6| 国产艳妇AV在线出轨| 又大又硬又粗再深一点视频| 日韩精品免费无码专区| 黑人巨鞭大战丰满少妇| 97精品国产一区二区三区| 无码人妻AⅤ一区二区三区夏目| 久久久久亚洲精品无码网址 | 人妻人人爽人人澡人人喊| 国产精品毛片一区二区| 在线观看草莓视频MV的免费网站| 日日狠狠久久8888偷偷色| 精品无人乱码一区二区三区| 暗交小拗女一区二| 亚洲丰满熟女一区二区V| 欧美日韩国产码高清综合人成| 国产乱人伦精品免费| 中文精品一卡2卡3卡4卡| 天堂中文最新版在线官网在线 | 日韩综合无码一区二区| 久久SE精品一区二区| 成·人免费午夜无码不卡| 亚洲欧美在线制服丝袜国产| 日韩精品一区二区三区中文无码| 久久国产乱子伦精品免费女人| 东北老熟女对白XXXⅩHD| 已婚丰满少妇潮喷21P| 我们还没在书房试过 |