溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

pika集群水平擴(kuò)展之怎么讓性能容量不再受限

發(fā)布時間:2021-10-23 13:48:54 來源:億速云 閱讀:191 作者:iii 欄目:編程語言

這篇文章主要講解了“pika集群水平擴(kuò)展之怎么讓性能容量不再受限”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“pika集群水平擴(kuò)展之怎么讓性能容量不再受限”吧!

背景

Pika是一個可持久化的大容量redis存儲服務(wù),兼容string、hash、list、zset、set的絕大部分接口(兼容詳情),解決redis由于存儲數(shù)據(jù)量巨大而導(dǎo)致內(nèi)存不夠用的容量瓶頸。用戶可以不修改任何代碼從redis遷移到pika服務(wù)。具有良好的兼容性和穩(wěn)定性,被360公司內(nèi)部使用超過3000實(shí)例,github社區(qū)超過3.8K star。由于單機(jī)pika容量受限于單塊硬盤容量的大小,360公司業(yè)務(wù)和社區(qū)對分布式pika集群的需求越來越強(qiáng)烈,因此我們推出了原生分布式pika集群,發(fā)布pika版本v3.4。與pika+codis集群方案相比,codis對pika創(chuàng)建和管理slot操作的支持并不友好,需要運(yùn)維人員大量介入。而pika原生集群則不需要額外部署codis-proxy模塊。

集群部署結(jié)構(gòu)

pika集群水平擴(kuò)展之怎么讓性能容量不再受限

以3個pika節(jié)點(diǎn)的集群為例,集群部署結(jié)構(gòu)如上圖所示:

  1. 部署Etcd集群作為pika manager的元信息存儲。

  2. 3臺物理機(jī)上分別部署pika manager,并配置好Etcd的服務(wù)端口。Pika manager會向etcd注冊,并爭搶成為leader。集群中有且只有一個pika manager能夠成為leader并向etcd中寫入集群數(shù)據(jù)。

  3. 3臺物理機(jī)上分別部署pika節(jié)點(diǎn),然后把pika節(jié)點(diǎn)的信息添加到pika manager中。

  4. 為了負(fù)載均衡,把pika的服務(wù)端口注冊到LVS中。

數(shù)據(jù)分布

pika集群水平擴(kuò)展之怎么讓性能容量不再受限

為了對數(shù)據(jù)按照業(yè)務(wù)進(jìn)行隔離,Pika集群引入table的概念,不同的業(yè)務(wù)數(shù)據(jù)存儲在不同的table中。業(yè)務(wù)數(shù)據(jù)按照key的hash值存儲到對應(yīng)的slot上面。每一個slot會有多個副本,從而形成一個replication group。replication group中的所有slot副本具有相同的slot ID,其中一個slot副本是leader,其他副本為follower。為了保證數(shù)據(jù)的一致性,只有l(wèi)eader提供讀寫服務(wù)。可以使用pika manager對slot進(jìn)行調(diào)度遷移,使數(shù)據(jù)和讀寫壓力均勻的分散到整個pika集群中,從而保證了整個集群資源的充分利用并且可以根據(jù)業(yè)務(wù)壓力和存儲容量的需要進(jìn)行水平擴(kuò)容和縮容。

pika使用rocksdb作為存儲引擎,每個slot會創(chuàng)建對應(yīng)的rocksdb。pika中的每個slot都支持讀寫redis 5種數(shù)據(jù)結(jié)構(gòu)。因此數(shù)據(jù)遷移的時候會特別方便,只需遷移pika中的slot即可。但同時也存在資源占用過多的問題。目前的pika在創(chuàng)建slot的時候會默認(rèn)創(chuàng)建5個rocksdb,分別來存儲5種數(shù)據(jù)結(jié)構(gòu)。在table中含有大量slot或者創(chuàng)建大量table的時候會使單個pika節(jié)點(diǎn)含有多個slot,進(jìn)而創(chuàng)建過多的rocksdb實(shí)例,占用了過多系統(tǒng)資源。在后續(xù)版本中一方面會支持創(chuàng)建slot的時候根據(jù)業(yè)務(wù)需要創(chuàng)建一種或多種數(shù)據(jù)結(jié)構(gòu),另一方面會持續(xù)對pika中的blackwidow接口層進(jìn)行優(yōu)化,減少對rocksdb的使用。

數(shù)據(jù)處理

pika集群水平擴(kuò)展之怎么讓性能容量不再受限

  1. 當(dāng)pika節(jié)點(diǎn)接收到用戶請求時,解析層處理解析redis協(xié)議,并把解析好的結(jié)果交給router層進(jìn)行判斷。

  2. router根據(jù)key的hash結(jié)果找到key對應(yīng)的slot,并判斷slot是否在本地節(jié)點(diǎn)上。

  3. 如果key所在的slot在其他節(jié)點(diǎn),則根據(jù)請求創(chuàng)建一個task放入隊列中,并把請求轉(zhuǎn)發(fā)給peer節(jié)點(diǎn)來處理。當(dāng)task接收到請求的處理結(jié)果后把請求返回給客戶端。

  4. 如果key所在的slot屬于本地節(jié)點(diǎn),就直接本地處理請求并返回給客戶端。

  5. 對于需要本地處理的寫請求,先通過replication manager模塊寫binlog,異步復(fù)制到其他slot副本。process layer根據(jù)一致性的要求,寫入leader slot。其中blackwidow是對rocksdb的接口封裝。

我們把proxy內(nèi)嵌的pika中,不需要單獨(dú)部署。與redis cluster相比,客戶端不需要感知proxy的存在,只需像使用單機(jī)一樣使用集群??梢园裵ika節(jié)點(diǎn)的服務(wù)端口掛載到LVS中,實(shí)現(xiàn)壓力在整個集群的負(fù)載均衡。

日志復(fù)制

pika中replication manager模塊負(fù)責(zé)日志的主從同步。為了兼容redis,pika支持非一致日志復(fù)制,leader slot直接在db中寫入數(shù)據(jù)而無需等待從follower slot的ack應(yīng)答。同時也支持raft一致性協(xié)議方式的日志復(fù)制,需要滿足收到大多數(shù)副本的ack才寫入db。

非一致日志復(fù)制

pika集群水平擴(kuò)展之怎么讓性能容量不再受限

在非一致場景下處理流程如下:

  1. 處理線程接收到客戶端的請求,直接加鎖后寫入binlog和并操作db。

  2. 處理線程返回客戶端response。

  3. 輔助線程發(fā)送BinlogSync同步請求給follower slot,同步日志。

  4. follower slot返回BinlogSyncAck報告同步情況。

一致性日志復(fù)制

pika集群水平擴(kuò)展之怎么讓性能容量不再受限

在一致性日志復(fù)制場景下:

  1. 處理線程把客戶端請求寫入binlog文件

  2. 通過發(fā)送BinlogSync請求向從庫同步

  3. 從庫返回BinlogSyncAck報告同步狀況

  4. 檢查從庫應(yīng)答滿足大多數(shù)后將相應(yīng)的請求寫入db

  5. 將response返回客戶端

集群元數(shù)據(jù)處理

我們在codis-dashboard的基礎(chǔ)上二次開發(fā)了pika manager(簡稱PM),作為整個集群的全局控制節(jié)點(diǎn),用來部署和調(diào)度管理集群。PM里保存了整個集群的元數(shù)據(jù)及路由信息。

  • 增加了集群創(chuàng)建多表的功能,方便業(yè)務(wù)根據(jù)表的不同來實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)隔離。

  • 支持創(chuàng)建表時指定slot數(shù)目和副本數(shù)目,方便運(yùn)維根據(jù)業(yè)務(wù)的規(guī)模和故障容忍度創(chuàng)建table。

  • 從邏輯上把group的概念改為replication group,使得原來的進(jìn)程級別的數(shù)據(jù)和日志復(fù)制轉(zhuǎn)變?yōu)閟lot級別的復(fù)制。

  • 支持創(chuàng)建table時創(chuàng)建密碼來隔離業(yè)務(wù)的使用??蛻舳酥恍枰獔?zhí)行auth和select語句就可以認(rèn)證并對指定的table進(jìn)行操作。

  • 支持slot遷移,方便根據(jù)業(yè)務(wù)需求進(jìn)行擴(kuò)容和縮容。

  • 集成哨兵模塊,PM會不斷的向集群中的pika節(jié)點(diǎn)發(fā)送心跳,監(jiān)測存活狀態(tài)。當(dāng)PM發(fā)現(xiàn)leader slot down時,會自動提升binlog偏移最大的slave slot為leader。

  • 存儲后端支持元數(shù)據(jù)寫入etcd,保證元數(shù)據(jù)的高可用。

  • pika manager通過不斷向etcd爭搶鎖來成為leader,來實(shí)現(xiàn)pika manager的高可用。

感謝各位的閱讀,以上就是“pika集群水平擴(kuò)展之怎么讓性能容量不再受限”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對pika集群水平擴(kuò)展之怎么讓性能容量不再受限這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI