不可否認(rèn),單個(gè)Redis實(shí)例已經(jīng)不能滿足實(shí)際生產(chǎn)中的需求了旦委。為了解決由此帶來(lái)的問(wèn)題奇徒,何不試試用專用實(shí)例代替邏輯數(shù)據(jù)庫(kù)呢?
一缨硝、邏輯數(shù)據(jù)庫(kù)可能已經(jīng)無(wú)法滿足需求的4個(gè)跡象
1.您有個(gè)“吵鬧的鄰居”
PS:“吵鬧的鄰居”指同一個(gè)Redis OSS實(shí)例中其它繁忙的邏輯數(shù)據(jù)庫(kù)摩钙。
場(chǎng)景:假設(shè)你是一家游戲公司的開(kāi)發(fā)人員,使用三個(gè)Redis邏輯數(shù)據(jù)庫(kù):一個(gè)用于緩存和排行榜查辩,一個(gè)用于匹配胖笛,一個(gè)作為消息代理。你的公司最近發(fā)布了一款非常成功的新游戲宜岛,每晚都有匹配請(qǐng)求的訪問(wèn)高峰期长踊。但是在這個(gè)時(shí)間段,你的排行榜顯示的數(shù)據(jù)可能不是實(shí)時(shí)的萍倡,并且消息代理的延遲正在增加身弊。
問(wèn)題的起源:
(1)這很可能是因?yàn)椋?b>單個(gè)Redis實(shí)例,從命令執(zhí)行的角度來(lái)看是單線程的列敲,并且按順序?yàn)槊總€(gè)請(qǐng)求提供服務(wù)阱佛。由于邏輯數(shù)據(jù)庫(kù)都共享同一實(shí)例,所以針對(duì)特定邏輯數(shù)據(jù)庫(kù)執(zhí)行的操作可能導(dǎo)致此該線程變慢甚至被阻塞戴而,從而影響其他數(shù)據(jù)庫(kù)凑术。如果您有吞吐密集型用例或者您的應(yīng)用程序使用O(n) 復(fù)雜度的 Redis 命令,這可能會(huì)導(dǎo)致性能問(wèn)題所意。
(2)在另一種情況下淮逊,您可能會(huì)遇到錯(cuò)誤。例如扁眯,在微服務(wù)環(huán)境中壮莹,每個(gè)服務(wù)都會(huì)讀寫(xiě)專用的邏輯數(shù)據(jù)庫(kù),所有服務(wù)的數(shù)據(jù)庫(kù)可能會(huì)由于某個(gè)微服務(wù)中的錯(cuò)誤而同時(shí)失效姻檀。將多個(gè)用例集中在一個(gè)Redis 實(shí)例中是不具備容錯(cuò)能力的命满。
如果您使用專用實(shí)例而不是邏輯數(shù)據(jù)庫(kù)會(huì)怎樣呢?
使用專用數(shù)據(jù)庫(kù)處理每個(gè)微服務(wù)的請(qǐng)求將為每個(gè)服務(wù)提供更好的性能绣版,并使您的應(yīng)用程序更具彈性胶台。
2.您想要擴(kuò)展規(guī)模
避免“吵鬧鄰居”問(wèn)題的一種方法是擴(kuò)展您的數(shù)據(jù)庫(kù)歼疮。為此,您可以使用Redis OSS Cluster诈唬,它允許您在多個(gè)節(jié)點(diǎn)上進(jìn)行數(shù)據(jù)庫(kù)集群化韩脏。
存在的問(wèn)題:然而,這種方式僅支持位于索引0的邏輯數(shù)據(jù)庫(kù)铸磅,這意味著您只能擴(kuò)展一個(gè)邏輯數(shù)據(jù)庫(kù)赡矢,這可能會(huì)導(dǎo)致您將與更重要的用例相關(guān)的數(shù)據(jù)存儲(chǔ)在同一邏輯空間中,從而否定了保留單獨(dú)名稱空間的初衷阅仔。
如果您使用專用實(shí)例而不是邏輯數(shù)據(jù)庫(kù)會(huì)怎樣呢吹散?
您可以根據(jù)需要擴(kuò)展每個(gè)數(shù)據(jù)庫(kù),沒(méi)有限制八酒。
3.您的用例多樣空民,需要量身定制的配置
場(chǎng)景:想象一下您是一家電子商務(wù)公司的軟件開(kāi)發(fā)人員,您使用一個(gè)邏輯數(shù)據(jù)庫(kù)進(jìn)行緩存羞迷,使用另一個(gè)邏輯數(shù)據(jù)庫(kù)進(jìn)行會(huì)話管理界轩。您有以下要求:
· 當(dāng)會(huì)話處于活動(dòng)狀態(tài)時(shí),會(huì)話存儲(chǔ)數(shù)據(jù)是唯一的事務(wù)數(shù)據(jù)源衔瓮。因此浊猾,需要具備高可用和數(shù)據(jù)持久性以確保事務(wù)數(shù)據(jù)不會(huì)丟失。
· 如果您的緩存丟失报辱,永久存儲(chǔ)中始終有一份副本与殃。
盡管有這些要求单山,您的兩個(gè)邏輯數(shù)據(jù)庫(kù)必須共享相同的高可用性和持久性配置碍现,因?yàn)樗鼈兌脊蚕硐嗤膔edis.conf文件。
對(duì)于緩存用例而言米奸,相同的情況也適用于驅(qū)逐策略和內(nèi)存限制昼接,以及TLS證書(shū)、密碼悴晰,或是Redis OSS的redis.conf文件中的所有配置選項(xiàng)慢睡。
如果您使用專用實(shí)例而不是邏輯數(shù)據(jù)庫(kù)會(huì)怎樣呢?
不再需要妥協(xié)铡溪,您可以根據(jù)業(yè)務(wù)需求配置每個(gè)數(shù)據(jù)庫(kù)漂辐。
4.監(jiān)控和故障排除很痛苦
場(chǎng)景:因?yàn)檫壿嫈?shù)據(jù)庫(kù)共享相同的Redis進(jìn)程,您可能會(huì)發(fā)現(xiàn)監(jiān)控和故障排除變得很繁瑣棕硫。
案例1:monitor命令髓涯。它會(huì)將Redis服務(wù)器處理的每個(gè)命令都返回,無(wú)論您從哪個(gè)邏輯數(shù)據(jù)庫(kù)運(yùn)行它哈扮,它都會(huì)返回在服務(wù)器上運(yùn)行的所有邏輯數(shù)據(jù)庫(kù)的命令纬纪,盡管它會(huì)顯示每個(gè)命令的數(shù)據(jù)庫(kù)索引蚓再。
案例2:slowlog命令。在這里包各,沒(méi)有區(qū)分記錄的命令是在哪些邏輯數(shù)據(jù)庫(kù)中運(yùn)行的摘仅。例如,為了人為地創(chuàng)建一些執(zhí)行緩慢的命令:
· 我在索引0上運(yùn)行了兩次debug命令问畅,并在索引1上運(yùn)行了一次
· 然后我在索引1上運(yùn)行了slowlog get命令
其他場(chǎng)景:這同樣適用于日志娃属、延遲子命令,或是您想要grep 或從 Redisinfo命令獲取的任何值:連接的客戶端數(shù)量护姆、已用內(nèi)存膳犹、當(dāng)前IOPS、逐出鍵的數(shù)量等签则。
其他解決方案:
使用第三方工具來(lái)監(jiān)視Redis须床,比如Grafana,您可以在定義Redis數(shù)據(jù)源時(shí)指定數(shù)據(jù)庫(kù)編號(hào)渐裂。然而豺旬,儀表板中顯示的數(shù)據(jù)不一定是您定義的數(shù)據(jù)庫(kù)索引所獨(dú)有的。
獲取keyspace中正確的鍵數(shù)柒凉,但命令統(tǒng)計(jì)族阅、客戶端連接和IOPS并不基于所選的索引,這些值是整個(gè)Redis實(shí)例共享的。
設(shè)想一下膝捞,盡管閱讀儀表板和日志很復(fù)雜坦刀,但您發(fā)現(xiàn)緩存邏輯數(shù)據(jù)庫(kù)上的延遲來(lái)自于您在每次寫(xiě)入時(shí)啟用AOF,因?yàn)槟臅?huì)話存儲(chǔ)數(shù)據(jù)庫(kù)需要它蔬咬。
除了放寬會(huì)話數(shù)據(jù)庫(kù)的持久性要求之外鲤遥,你還能做什么呢?這又回到了邏輯數(shù)據(jù)庫(kù)已經(jīng)無(wú)法滿足需求的早期跡象:“吵鬧的鄰居”和獨(dú)特的配置要求林艘。
如果您使用專用實(shí)例而不是邏輯數(shù)據(jù)庫(kù)會(huì)怎樣呢盖奈?
您將更輕松、更快速地監(jiān)控每個(gè)數(shù)據(jù)庫(kù)的性能并識(shí)別問(wèn)題狐援,從而節(jié)省運(yùn)維時(shí)間和精力钢坦。
二、解決方案:邏輯數(shù)據(jù)庫(kù)的遷移
l?使用單獨(dú)的Redis OSS實(shí)例來(lái)滿足不同的需求啥酱。
l?利用Redis Enterprise 的集群級(jí)多租戶能力爹凹,解決“吵鬧的鄰居”、容錯(cuò)和通用配置方面的問(wèn)題镶殷。
無(wú)論您選擇哪種選項(xiàng)禾酱,都需要將邏輯索引遷移到不同的專用數(shù)據(jù)庫(kù)實(shí)例中。
?
您需要怎么做?
由于所有邏輯數(shù)據(jù)庫(kù)都保存在同一個(gè)RDB文件中宇植,這種遷移的第一步是手動(dòng)將每個(gè)邏輯數(shù)據(jù)庫(kù)的數(shù)據(jù)提取到單獨(dú)的文件中得封。這是一個(gè)需要重復(fù)加載、刷新和重新啟動(dòng)Redis 服務(wù)器的繁瑣過(guò)程指郁。為了省去您的麻煩忙上,使用腳本會(huì)自動(dòng)執(zhí)行該過(guò)程。它將數(shù)據(jù)加載到作為子進(jìn)程啟動(dòng)的輔助Redis 服務(wù)器中闲坎,并使用該服務(wù)器為每個(gè)邏輯數(shù)據(jù)庫(kù)創(chuàng)建一個(gè) RDB 文件:0.rdb疫粥、1.rdb 等。
聯(lián)系我們腰懂,進(jìn)一步了解邏輯數(shù)據(jù)庫(kù)的遷移梗逮。