天天看點

redis 深度曆險 pdf_Redis高可用,高性能,架構演進史

來自公衆号:Java識堂

介紹

上個禮拜,我搭建了一個mongo分片叢集,發現分布式系統保證高可用和高性能的套路都差不多。高性能就是做分片(可以類比為分庫分表,将資料分到不同伺服器上),在Kafka中叫分區,在mongodb中叫shard,在HDFS上叫DataNode。而保證高可用的方式就是做交叉備份。然後我很好奇Redis是怎麼部署的。

上測試環境檢視叢集的狀态

輸出如下,好吧,沒有做高可用,一個master節點開跑。

一個Redis執行個體其實有很多問題,最起碼Redis崩了就沒法提供服務了,而且單機能夠承載的QPS在上萬到幾萬不等

replication(複制)

如果業務要承載的QPS在幾十萬,單機是不可能做到的,此時就可以用到複制。做一個主從架構,一主多從,master節點負責寫,slave節點負責讀,假如說一個節點可以承載的5w讀QPS,那麼兩個節點就可以承載10w的讀QPS,水準擴容非常友善。

redis 深度曆險 pdf_Redis高可用,高性能,架構演進史

master節點挂太多slave節點會有性能問題,此時就可以在slave節點上挂slave節點

redis 深度曆險 pdf_Redis高可用,高性能,架構演進史

redis replication的核心機制有如下幾點

1、redis采用異步方式複制資料到slave node,不會block master node的正常工作2一個master node可以配置多個slave node,slave node也可以連接配接其他的slave node3、slave node主要用來進行橫向擴容,做讀寫分離,擴容的slave node可以提高讀的吞吐量

主從複制的實作原理

1、slave連接配接master,發送SYNC指令;2、master接收到SYNC命名後,開始執行BGSAVE指令生成RDB檔案并使用緩沖區記錄此後執行的所有寫指令;3、master BGSAVE執行完後,向slave發送快照檔案,并在發送期間繼續記錄被執行的寫指令;4、slave收到快照檔案後丢棄所有舊資料,載入收到的快照;5、master快照發送完畢後開始向salve發送緩沖區中的寫指令;6、slave完成對快照的載入,開始接收指令請求,并執行來自主伺服器緩沖區的寫指令;

sentinel(哨兵)

主從架構有一個缺點就是如果master節點挂了,那麼寫服務是不可用的,因為slave節點預設是隻讀的,這時就重新開機master節點或者重新配置主從,有沒有更好的方案呢?類似zookeeper的元件,能自動完成主從切換。在Redis中還真有,就是sentinel節點,當master節點發生故障能自動完成主從切換。

redis 深度曆險 pdf_Redis高可用,高性能,架構演進史

當master節點挂掉時,sentinel将一個slave節點變成maste節點,當原先的master節點可用時,以slave的角色加入叢集。 一個高可用的系統是很忌諱有單點問題的。看到沒,sentinel就是一個單點,如果sentinel挂了,主從切換也就沒人做了。是以應該将sentinel也做成一個叢集

redis 深度曆險 pdf_Redis高可用,高性能,架構演進史

哨兵的作用有如下幾點

1、叢集監控,負責監控redis master和slave程序是否正常工作2、消息通知,如果某個redis執行個體有故障,那麼哨兵負責發送消息作為報警通知給管理者3、故障轉移,如果master node挂掉了,會自動轉移到slave node上4、配置中心,用戶端初始化時,通過哨兵獲得master位址,如果故障轉移發生了,通知用戶端新的master位址

redis cluster(叢集)

主從+哨兵,隻能保證Redis的高可用,并不能保證Redis的高性能,因為一個master節點并不能放海量資料,而且單個Redis的執行個體過大時,會導緻rdb檔案過大,當執行主從同步時時間過長。

如果想做到高性能該怎麼辦?分片啊,我一開始就提到了,都是一個套路。redis搞幾個節點,每個節點存儲一部分資料。可想而知,此時查詢和插入都得按照一定的分片政策,總不能查詢一個資料把所有的redis節點周遊一遍吧。而這種操作不應該放在用戶端,中間件興起了,常見的有codis,twemproxy

redis 深度曆險 pdf_Redis高可用,高性能,架構演進史

圖檔來自《Redis 深度曆險: 核心原理與應用實踐》

用戶端不連接配接具體的Redis,而是連接配接Codis,2個Codis節點保證高可用,和Mycat一個套路。

當然Redis作者也意識到這個問題了,redis cluster應用而生。

沒時間寫了,下一篇再補充sentinel 和 redis cluster的其他知識吧

參考部落格

老錢《Redis 深度曆險:核心原理與應用實踐》中華石杉《Java工程師面試突擊》

●編号608,輸入編号直達本文

●輸入m擷取文章目錄

推薦↓↓↓

redis 深度曆險 pdf_Redis高可用,高性能,架構演進史

Web開發