本篇文章給大家?guī)?lái)了關(guān)于Redis的相關(guān)知識(shí),其中主要介紹了集群的相關(guān)問(wèn)題,Redis集群是一種分布式數(shù)據(jù)庫(kù)方案,集群通過(guò)分片來(lái)進(jìn)行數(shù)據(jù)共享,并提供復(fù)制和故障轉(zhuǎn)移功能,希望對(duì)大家有幫助。
推薦學(xué)習(xí):Redis學(xué)習(xí)教程
幾種 Redis 高可用性的解決方案。包括:「主從模式」、「哨兵機(jī)制」以及「哨兵集群」。
- 「主從模式」具有讀寫(xiě)分離,分擔(dān)讀壓力、數(shù)據(jù)備份,提供多個(gè)副本等優(yōu)點(diǎn)。
- 「哨兵機(jī)制」在主節(jié)點(diǎn)故障后能自動(dòng)將從節(jié)點(diǎn)提升成主節(jié)點(diǎn),不需要人工干預(yù)操作就能恢復(fù)服務(wù)可用。
- 「哨兵集群」解決單點(diǎn)故障以及單機(jī)哨兵產(chǎn)生「誤判」問(wèn)題。
Redis 從最簡(jiǎn)單的單機(jī)版,經(jīng)過(guò)數(shù)據(jù)持久化、主從多副本、哨兵集群,通過(guò)這么一番的優(yōu)化,不管是性能還是穩(wěn)定性,都越來(lái)越高。
但是隨著時(shí)間的發(fā)展,公司業(yè)務(wù)體量迎來(lái)了爆炸性增長(zhǎng),此時(shí)的架構(gòu)模型,還能夠承擔(dān)這么大的流量嗎?
比如有這么一個(gè)需求:要用 Redis 保存 5000 萬(wàn)
個(gè)鍵值對(duì),每個(gè)鍵值對(duì)大約是 512B
,為了能快速部署并對(duì)外提供服務(wù),我們采用云主機(jī)來(lái)運(yùn)行 Redis 實(shí)例,那么,該如何選擇云主機(jī)的內(nèi)存容量呢?
通過(guò)計(jì)算,這些鍵值對(duì)所占的內(nèi)存空間大約是 25GB(5000 萬(wàn) *512B)。
想到的第一個(gè)方案就是:選擇一臺(tái) 32GB 內(nèi)存的云主機(jī)來(lái)部署 Redis。因?yàn)?32GB 的內(nèi)存能保存所有數(shù)據(jù),而且還留有 7GB,可以保證系統(tǒng)的正常運(yùn)行。
同時(shí),還采用 RDB 對(duì)數(shù)據(jù)做持久化,以確保 Redis 實(shí)例故障后,還能從 RDB 恢復(fù)數(shù)據(jù)。
但是,在使用的過(guò)程中會(huì)發(fā)現(xiàn),Redis 的響應(yīng)有時(shí)會(huì)非常慢。通過(guò) INFO命令
查看 Redis 的latest_fork_usec
指標(biāo)值(表示最近一次 fork 的耗時(shí)),結(jié)果發(fā)現(xiàn)這個(gè)指標(biāo)值特別高。
這跟 Redis 的持久化機(jī)制有關(guān)系。
在使用 RDB 進(jìn)行持久化時(shí),Redis 會(huì) fork
子進(jìn)程來(lái)完成,fork
操作的用時(shí)和 Redis 的數(shù)據(jù)量是正相關(guān)的,而 fork
在執(zhí)行時(shí)會(huì)阻塞主線(xiàn)程。數(shù)據(jù)量越大,fork 操作造成的主線(xiàn)程阻塞的時(shí)間越長(zhǎng)。
所以,在使用 RDB
對(duì) 25GB 的數(shù)據(jù)進(jìn)行持久化時(shí),數(shù)據(jù)量較大,后臺(tái)運(yùn)行的子進(jìn)程在 fork
創(chuàng)建時(shí)阻塞了主線(xiàn)程,于是就導(dǎo)致 Redis 響應(yīng)變慢了。
顯然這個(gè)方案是不可行的,我們必須要尋找其他的方案。