文章目錄
一、 主從數(shù)據(jù)一致性
1. 主多從少
主從網(wǎng)絡(luò)延遲時(shí),主多從少情況下,進(jìn)行部分重同步。
場(chǎng)景簡述:主多從少就是在網(wǎng)絡(luò)延遲的情況下,從服務(wù)器尚未把主服務(wù)器的數(shù)據(jù)全部復(fù)制過來。
解決方案:
第一種:這時(shí),我們可以等延遲結(jié)束之后,讓從服務(wù)器進(jìn)行部分重同步,就是我們說增量復(fù)制。
第二種:如果比較著急,向讓他立刻執(zhí)行重同步,需要任務(wù)干預(yù)。在從節(jié)點(diǎn)輸入
就可以實(shí)現(xiàn)部分重同步
第三種:人為斷開讓從節(jié)點(diǎn)和主節(jié)點(diǎn)重新建立連接,也會(huì)觸發(fā)部分重同步。
2. 主少從多
主少從多情況下,進(jìn)行全量復(fù)制。
場(chǎng)景簡述(主少從多):這種情況是從服務(wù)器開啟了寫的操作導(dǎo)致的,也就是我們的從服務(wù)器是讀寫模式,當(dāng)從從服務(wù)器寫入,就會(huì)導(dǎo)致主從不一致。
解決方案:
把從服務(wù)器數(shù)據(jù)清空,讓從服務(wù)器和主服務(wù)器重新建立連接,進(jìn)行去哪量數(shù)據(jù)復(fù)制即可。
3. 知識(shí)點(diǎn)補(bǔ)充
在redis2.8版本之前,如果從節(jié)點(diǎn)和主節(jié)點(diǎn)斷開重新連接,從節(jié)點(diǎn)就會(huì)全量復(fù)制,這無疑是一個(gè)降低性能的問題。
為了解決這個(gè)問題,redis在2.8版本之后,添加了一個(gè)特性;我們主從斷開重連的時(shí)候,可以進(jìn)行一個(gè)邏輯判斷處理,來判斷從節(jié)點(diǎn)進(jìn)行全量復(fù)制還是增量復(fù)制?
其實(shí)就是我們的主服務(wù)器在內(nèi)存中為每一個(gè)從服務(wù)器都維護(hù)了一個(gè)同步日志和同步標(biāo)識(shí),這三個(gè)同步日志就是backlog ,這個(gè)同步標(biāo)識(shí)就是offset,每個(gè)從服務(wù)器在跟主服務(wù)器進(jìn)行同步的時(shí)候,會(huì)攜帶同步標(biāo)識(shí)和上次同步的位置,這樣就會(huì)判斷出這個(gè)復(fù)制,要做全量復(fù)制還是增量復(fù)制。
二、 數(shù)據(jù)延遲
2.1. 數(shù)據(jù)延遲因素
數(shù)據(jù)延遲,根據(jù)那些配置或者屬性決定的。在info replication返回的信息中有一個(gè)偏移量,其實(shí),就是根據(jù)這個(gè)偏移量來決定當(dāng)前數(shù)據(jù)的一個(gè)健康狀態(tài),數(shù)據(jù)是否有延遲,我們的主節(jié)點(diǎn)在寫入命令的時(shí)候,比如:我寫入3000字節(jié)的一個(gè)偏移量,此時(shí),我們的從節(jié)點(diǎn)只復(fù)制了1000,他們的差值比較大的時(shí)候,就說明數(shù)據(jù)延遲就很高了。
2.2. 解決方案
1.編寫外部程序監(jiān)聽主從節(jié)點(diǎn)的復(fù)制偏移量,延遲較大時(shí)發(fā)出報(bào)警或者通知客戶端,切換到主節(jié)點(diǎn)或者其他節(jié)點(diǎn)。
2設(shè)置從節(jié)點(diǎn)???slave-serve-stale-data?
?為no 除INFO SLAVEOF命令之外的任何請(qǐng)求都會(huì)返回一個(gè)錯(cuò)誤“SYNC with master in progress”
三、 臟數(shù)據(jù)
3.1. 臟數(shù)據(jù)產(chǎn)生的場(chǎng)景
- 惰性:現(xiàn)在有一個(gè)key已經(jīng)過期了,現(xiàn)在沒有人活著客戶端訪問,就不會(huì)刪除這個(gè)過期的key;在訪問的時(shí)候在判斷這個(gè)key是否過期,過期了就會(huì)刪除,導(dǎo)致一個(gè)過期的key如果不被訪問就會(huì)永遠(yuǎn)存在內(nèi)存中。
- 定時(shí):解決惰性缺點(diǎn),內(nèi)部有一個(gè)定時(shí)任務(wù),隔一段時(shí)間就會(huì)判斷一批key是否過期,過期了就刪除掉。
- 主動(dòng)刪除:當(dāng)前數(shù)據(jù)存儲(chǔ)超過了redia的存儲(chǔ)上限,然后,觸發(fā)主動(dòng)刪除,正是因?yàn)閞erdis刪除機(jī)智的原因?qū)е掠信K數(shù)據(jù)的產(chǎn)生。
從節(jié)點(diǎn)可寫導(dǎo)致的,從節(jié)點(diǎn)一般都是只讀模式,如果你開啟了讀寫模式,這個(gè)數(shù)據(jù)從從節(jié)點(diǎn)誤寫入,可能導(dǎo)致產(chǎn)生臟數(shù)據(jù)。
3.2. 解決方案
- 忽略:比如:12306查詢票,雙11查詢庫存,當(dāng)你去查詢這些信息的時(shí)候,我并沒有去做一個(gè)寫操作,這樣業(yè)務(wù)場(chǎng)景允許你出現(xiàn)一定的的錯(cuò)誤,有一定的容錯(cuò)。我么可以選擇忽略。
- 強(qiáng)制讀主:當(dāng)我們買一張車票,下單呢?秒殺搶購這個(gè)商品,這個(gè)時(shí)候數(shù)據(jù)一定要是準(zhǔn)確的,我們可以采用強(qiáng)制讀主的方式,從節(jié)點(diǎn)間接變?yōu)榱藗浞莘?wù)器(某個(gè)業(yè)務(wù))
- 從節(jié)點(diǎn)只讀:規(guī)避從節(jié)點(diǎn)寫入臟數(shù)據(jù)
目前redis6.x之后,讀取數(shù)據(jù)之前檢查鍵過期時(shí)間來決定是否返回?cái)?shù)據(jù)
四、 數(shù)據(jù)安全性
4.1. 場(chǎng)景
關(guān)閉主節(jié)點(diǎn)持久化會(huì)提升性能,同時(shí)會(huì)帶來復(fù)制的安全性問題。
4.2. 解決方案
主節(jié)點(diǎn)不自動(dòng)重啟,不是用shell腳本手段監(jiān)控主節(jié)點(diǎn)自動(dòng)觸發(fā)重啟
五、 規(guī)避全量復(fù)制
5.1. 低峰時(shí)段
第一次全量復(fù)制解決方案:低峰時(shí)段掛載slave節(jié)點(diǎn),比如:晚上12點(diǎn)
5.2. 主節(jié)點(diǎn)變更
選舉slave為主節(jié)點(diǎn)
待補(bǔ)充
5.3. 增大復(fù)制緩沖區(qū)
六、 規(guī)避復(fù)制風(fēng)暴
5.1. 單主節(jié)點(diǎn)
單主節(jié)點(diǎn)復(fù)制風(fēng)暴:主節(jié)點(diǎn)重啟,從節(jié)點(diǎn)全量復(fù)制
解決方案:
選舉slave為主節(jié)點(diǎn)、樹狀復(fù)制結(jié)構(gòu)
5.2. 單機(jī)多主
單機(jī)多主復(fù)制風(fēng)暴:一臺(tái)機(jī)器,多個(gè)主節(jié)點(diǎn)(樹狀復(fù)制架構(gòu))
解決方案:把主節(jié)點(diǎn)分散在多臺(tái)機(jī)器上
本文摘自 :https://blog.51cto.com/g