前言
在分布式系統(tǒng)中,為了解決單點(diǎn)問題,通常會把數(shù)據(jù)復(fù)制多個副本部署在其他機(jī)器,滿足故障恢復(fù)和負(fù)載均衡等需求。Redis 也是如此,他為我們提供了復(fù)制功能,實(shí)現(xiàn)類相同數(shù)據(jù)的多個 Redis 副本。復(fù)制功能是 Redis 高可用的基礎(chǔ),Redis 的哨兵和集群都是在此基礎(chǔ)上實(shí)現(xiàn)的。
1 復(fù)制的配置
1. 如何建立復(fù)制?
- 配置文件中加入 slaveof {masterIp} {masterport}
- redis-server 命令后加入 --slaveof {masterIp} {masterport}
- 直接在從節(jié)點(diǎn) redis-cli 中執(zhí)行 slaveof {masterIp} {masterport}
建立復(fù)制后,主節(jié)點(diǎn)的每次修改命令都會用異步的方式發(fā)送到從節(jié)點(diǎn)。
2. 如何斷開復(fù)制鏈接?
- 在從節(jié)點(diǎn)執(zhí)行
slaveof no one
。
注意:當(dāng)從節(jié)點(diǎn)從舊的主節(jié)點(diǎn)斷開后,然后接入到新的節(jié)點(diǎn),從節(jié)點(diǎn)會刪除所有舊的數(shù)據(jù)。
3. 連接的安全
對于數(shù)據(jù)比較重要的節(jié)點(diǎn),主節(jié)點(diǎn)會通過 requirepass
參數(shù)進(jìn)行密碼驗(yàn)證,這時所有的客戶端訪問必須使用 auth
命令進(jìn)行校驗(yàn),因此需要在從節(jié)點(diǎn)胚子 masterauth 參數(shù)與主節(jié)點(diǎn)密碼保持一致,這樣從節(jié)點(diǎn)才可以正確的連接到主節(jié)點(diǎn)并發(fā)起復(fù)制流程。
4. 只讀
默認(rèn)情況下,從節(jié)點(diǎn)使用 alave-read-only=yes 配置為只讀模式。由于復(fù)制只能從主節(jié)點(diǎn)到從節(jié)點(diǎn),對于從節(jié)點(diǎn)的任何修改,主節(jié)點(diǎn)都是無法感知的,修改從節(jié)點(diǎn)會造成數(shù)據(jù)不一致。因此,建議不要修改這個配置。
2 拓?fù)?/h2>
1. 一主一從
一主一從是最簡單的復(fù)制拓?fù)浣Y(jié)構(gòu),用于主節(jié)點(diǎn)出現(xiàn)宕機(jī)時,從節(jié)點(diǎn)提供故障轉(zhuǎn)移支持。
注意:如果主節(jié)點(diǎn)因?yàn)樘岣咝阅荜P(guān)閉了 AOF 持久化功能,同時,主節(jié)點(diǎn)自動重啟了,如果從節(jié)點(diǎn)繼續(xù)復(fù)制主節(jié)點(diǎn)的話,從節(jié)點(diǎn)的數(shù)據(jù)也會被清空!
所以,如果想保留數(shù)據(jù),正確的做法是先斷開從節(jié)點(diǎn)和主節(jié)點(diǎn)的連接,然后再重啟主節(jié)點(diǎn)。類似于一種故障轉(zhuǎn)移機(jī)制。
2. 一主多從
一主多從,又稱星形拓?fù)浣Y(jié)構(gòu),使得應(yīng)用端可以利用多個從節(jié)點(diǎn)實(shí)現(xiàn)讀寫分離,對于讀占比較大的場景,可以通過多個讀節(jié)點(diǎn)分擔(dān)主節(jié)點(diǎn)壓力。
同時,在日常開發(fā)中,一些耗時命令(keys,sort),可以在其中一臺上執(zhí)行,防止干擾其他請求。
但是:如果寫并發(fā)量很高,多個從節(jié)點(diǎn)會導(dǎo)致主節(jié)點(diǎn)寫命令的多次發(fā)送從而過度消耗網(wǎng)絡(luò)帶寬,同時也加重了主節(jié)點(diǎn)負(fù)載影響服務(wù)穩(wěn)定性。
3. 樹形結(jié)構(gòu)
又稱(樹狀拓?fù)浣Y(jié)構(gòu)),使得從節(jié)點(diǎn)不但可以復(fù)制主節(jié)點(diǎn)數(shù)據(jù),同時可以作為其他從節(jié)點(diǎn)的主節(jié)點(diǎn)繼續(xù)向下復(fù)制。通過引入復(fù)制中間層,一主多從的缺點(diǎn)(多個從節(jié)點(diǎn)導(dǎo)致的消耗過多網(wǎng)絡(luò)帶寬)就解決了。
但是,也帶來了新的問題,如下圖:
如果圖中節(jié)點(diǎn)故障,那么后面的節(jié)點(diǎn)也將無法收到主節(jié)點(diǎn)的信息,因此對于運(yùn)維來講,增添了許多復(fù)雜度,需要手動將節(jié)點(diǎn)啟動。
總結(jié)
本文只是簡單介紹了一下 redis 復(fù)制相關(guān)的內(nèi)容,包括如何建立復(fù)制,斷開復(fù)制,復(fù)制連接的安全,復(fù)制的只讀狀態(tài),還有 Redis 拓?fù)湎嚓P(guān),例如一主一從,一主多從,樹形結(jié)構(gòu)。
下一篇文章將重點(diǎn)介紹 Redis 復(fù)制的原理。
引用
《Redis 開發(fā)與運(yùn)維》