尤物网站在线-尤物网站永久在线观看-尤物网在线观看-尤物天堂-久久久久久久亚洲精品一区-久久久久久久亚洲精品

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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

-     單機版Redis Server    -

 

 

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

 

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

 

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

 

 

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

 

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

 

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

 

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

 

 

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

 

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

 

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

 

 

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

 

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

 

 

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

 

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

 

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

 

至此,我們就用3臺機器搭建了一個高可用的Redis服務。其實網上還有更加節省機器的辦法,就是把一個Sentinel進程放在Client機器上,而不是服務提供方的機器上。只不過在公司里面,一般服務的提供方和調用方并不來自同一個團隊。兩個團隊共同操作同一個機器,很容易因為溝通問題導致一些誤操作,所以出于這種人為因素的考慮,我們還是采用了方案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所在的服務器,在發生Redis主從切換的時候,會觸發一個回調腳本,回調腳本中將VIP切換至slave所在的服務器。這樣對于Client端來說,他仿佛在使用的依然是一個單機版的高可用Redis服務。

 

-     總結    -

 

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

 

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



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

推薦閱讀
免費體驗秦拓進銷存ERP管理系統后臺管理系統立即體驗
欧美综合在线激情专区| 人妻少妇无码中文幕久久| 米奇777四色精品人人爽| 免费A级毛片无码A∨蜜芽试看| 男人J进入女人P呻吟视频免费| 欧美性猛交XXXX黑人猛交| 色综合久久88色综合天天| 香港三日本8A三级少妇三级99 | 久久国产精品日本波多野结衣 | 欧美黑人乱猛交xX 乂500| 日本丰满人妻XXXXXHD| 他将头埋进双腿间吮小核| 性色AⅤ无码久久久久久精品| 亚洲欧美乱日韩乱国产| 99久久国产综合精品五月天喷水 | 亚洲午夜福利AV一区二区无码 | 亚洲av中文无码| 中国极品少妇XXXXX| 八旬老太太BGMBGMBGM性| 国产精品18久久久久久不卡| 精品人妻少妇AV一区二区三区| 免费无遮挡禁18污污网站 | 久久婷婷色综合老司机| 欧洲码和亚洲码的尺码区别 | 高H纯肉放荡脏话H文合集| 国产一区二区三区在线视頻 | 奇米影视7777狠狠狠狠影视| 无码人妻精品一区二区三区66| 亚洲精品中文字幕乱码三区| CAOPORN视频在线观看| 国产精品麻花传媒二三区别| 久久伊人色AV天堂九九| 日韩毛片无码永久免费看| 亚洲AV无码成人片在线观看| 2022最新韩国理伦片在线观看| 国产AV无码专区亚洲AV手机麻| 精品久久久久久中文字幕大豆网| 欧美日韩亚洲中文字幕一区二区三| 铜铜铜铜铜铜铜铜好大好深黄| 亚洲一区蜜桃视频在线| 成人亚洲综合AV天堂| 久久国产精品99国产精| 色8久久人人97超碰香蕉987 | 特级做A爰片毛片免费69| 一区二区三区午夜无码视频| 丁香五月婷婷色人阁TP精品 | 亚洲欧美一区二区成人片| 博士用模型查出医院多收10万| 果冻传媒影视在线播放| 人妻插B视频一区二区三区| 亚洲国产精品久久久天堂不卡海量 | 国产一区二区三区小说| 青草伊人久久综在合线亚洲| 亚洲国产精品久久艾草| 成人无遮挡裸免费视频在线观看| 久久国产精品成人片免费| 色婷婷五月色综合AⅤ小说| 影视先锋AV资源噜噜| 国产精品乱码一区二区三| 欧美熟妇精品视频网免费观看| 亚洲A成人片在线播放| 成人精品一区二区www| 旧里番YY6080在线播放| 无码一区二区三区在线| JIZZJIZZ欧美69巨大| 久久AⅤ人妻少妇嫩草影院| 少妇无码AV无码专区在线观看| 最新的美国ZOOM动物| 韩国三级在线观看| 三级 丰满 人妻 少妇| 在线天堂中文最新版| 国精产品砖一区二区三区糖心| 日韩AV片无码一区二区不卡电影| 真人作爱视频免费网站| 国内精品久久人妻互换| 色欲AⅤ亚洲情无码AV蜜桃| 91老熟女老女人国产老太毛多| 精品国产一区二区三区麻豆| 四虎影视在线观看2413| HEYZO无码综合国产精品| 久久蜜桃86人妻arvi| 亚洲444KKKK在线观看无码| 成在人线AV无码免费高潮水老板 | 国产精品成人影院久久久| 人妻无码全彩里番ACG视频| 在厨房娇妻被朋友胯下挺进| 经典精品毛片免费观看| 无码一区二区三区在线| 豆国产93在线 | 亚洲| 欧美日韩精品一区二区在线视频 | 舌头伸进去里面吃小豆豆| 97人妻人人揉人人躁人人| 巨胸喷奶水WWW视频网站| 亚洲娇小与黑人巨大video| 国产人与ZOXXXX另类| 少妇被又大又粗又爽毛片| 办公室少妇愉情理伦片| 欧美VA久久久噜噜噜久久| 中国丰满人妻VIDEOSHD| 久久久久国色AⅤ免费看| 亚洲国产天堂久久综合网| 国产在线拍揄自揄拍无码| 无码人妻精品一区二区三| 国产AV鲁丝一区二区二区| 日韩人妻中文无码一区二区三区 | 人妻少妇中文字幕在线一区| 69精产国品一二三产区区别| 美女露100%双奶头无遮挡图片| 亚洲综合精品香蕉久久网| 教室停电了校草挺进我体内| 性色AV性色生活片| 国产精品亚洲精品日韩已满| 天堂中文资源库官网| 国产AV无码专区国产乱码| 色欲人妻AAAAAA无码| 大爷你的太大了我| 日韩AV无码精品一二三区| 差差差无掩盖30分钟79集| 人妻少妇久久精品电影| 啊轻点灬大JI巴太粗太长了网站 | 偷欢人妻激情系列| 国产激情З∠视频一区二区| 无码精品、日韩专区| 国产精品久久久久久久久电影网 | 国产成人久久综合一区| 玩弄粉嫩少妇高潮出白浆AⅤ| 国产成人精品高清在线观看99 | 国产成人欧美一区二区三区| 婷婷色香合缴缴情AV第三区| 国产精品成人99一区无码| 无套内射AV二区| 国产无遮挡无码视频免费软件| 亚洲AV成人无码一二三| 互换人妻ⅩXXBBBB| 亚洲无日韩码精品| 两人做人爱视频在线观看| 最新亚洲人成网站在线观看| 欧美黑人一级二级巨大久久天堂 | 亚洲一卡2卡3卡4卡精品分类| 久久亚洲AV无码AV男人的天堂| 真实差差差无掩盖视频30分钟| 女人扒开的小泬高潮喷水小说| Xx性欧美肥妇精品久久久久久久久 | 国产三级精品三级在线专区1| 亚洲AV无码国产永久播放蜜芽 | 亚洲精品国产成人99久久| 久久久久久久女国产乱让韩| …久久精品99久久香蕉国产| 欧美最猛黑人XXXX黑人猛交| 粗大的内捧猛烈进出小视频| 我的真實亂倫故事| 国内揄拍国内精品| 一女被两男吃奶玩乳尖| 欧美人与劲物XXXXZ0OZ| 饭桌上故意张开腿让公在线观看 | 欧洲女RAPPER潮水大豆| 粉嫩av一区二区夜夜嗨| 亚洲 A V无 码免 费 成| 久久国产欧美日韩精品| 2020亚洲无码| 色综合色欲色综合色综合色综合| 国产成人最新三级在线视频| 亚洲成AV人在线视| 免费无遮挡禁18污污网站| 成都私人家庭影院| 亚洲AV高潮黄色毛片| 久久亚洲色WWW成人男男| 白嫩光屁股BBBBBBBBB| 无码免费无线观看在线视频| 警察被两个混混脱裤玩J视频| 67194熟妇在线直接进入百度| 日韩人妻一区二区三区免费 | YOUJIZZ中国熟女| 无套内谢孕妇毛片免费看| 久久久久久亚洲AV无码蜜芽| YSL千人千色T9T9T90| 性欧美ⅩXXXX极品少妇小说| 两个领导在车里吃我奶| 纯肉无遮挡H肉动漫在线观看3D| 亚洲AV成人无码久久精品老人 | 一边做饭一边躁狂怎么办 | А√天堂8资源最新版| 无遮挡啪啪摇乳动态图GIF| 老男人把舌头伸进我下面| 成人无遮挡裸免费视频在线观看| 亚洲AV美国AV产亚洲AV图片| 男人把大JI巴放进女人有视频| 国产成人精品优优AV| 一级特黄无码毛片av一区二区| 日韩AV无码一区二区三区不卡| 狠狠躁夜夜躁AV网站中文字幕| 99精品电影一区二区免费看 | 强行入侵粗暴完整版| 国产亚洲一区二区手机在线观看| 中文字幕四区五区六区蜜桃| 天堂资源中文最新版在线一区| 久久熟女俱乐部五十路二区av| 丰满少妇奶水一区二区三区| 影音先锋亚洲AV少妇熟女| 天天躁日日躁AAAAXXXX|