阿克蘇網(wǎng)站建設(shè)服務(wù)網(wǎng)站建設(shè)網(wǎng)絡(luò)公司
目錄
單點(diǎn)問題
主從模式
解析主從模式
配置redis主從模式
info replication命令查看復(fù)制相關(guān)的狀態(tài)
斷開復(fù)制關(guān)系
安全性
只讀
傳輸延遲
拓?fù)浣Y(jié)構(gòu)
數(shù)據(jù)同步psync
replicationid
offset
psync運(yùn)行流程
全量復(fù)制流程
無硬盤模式
部分復(fù)制流程
積壓緩沖區(qū)
實(shí)時(shí)復(fù)制
主從復(fù)制的弊端
主節(jié)點(diǎn)無法正常啟動的原因
單點(diǎn)問題
如果某個(gè)服務(wù)器程序,只有一個(gè)節(jié)點(diǎn)(只有一個(gè)物理服務(wù)器來部署這個(gè)服務(wù)器程序),那么會引發(fā)兩個(gè)嚴(yán)重的問題:可用性問題:如果這個(gè)服務(wù)器宕機(jī),意味著整個(gè)服務(wù)就終端了;性能問題:一臺服務(wù)器往往支持的并發(fā)量和性能是非常有限的.
引入分布式系統(tǒng),主要就是為了解決上述的單點(diǎn)問題.
在分布式系統(tǒng)中,往往希望有多個(gè)服務(wù)器來部署redis服務(wù),從而構(gòu)成一個(gè)redis集群,此時(shí)就可以讓這個(gè)集群給整個(gè)分布式系統(tǒng)中的其他服務(wù),提供更加穩(wěn)定和高效的數(shù)據(jù)存儲功能.
在分布式系統(tǒng)中,redis的部署方式主要有:主從模式,主從+哨兵模式和集群模式.
主從模式
解析主從模式
在若干個(gè)redis節(jié)點(diǎn)中,有的是主節(jié)點(diǎn)有的是從節(jié)點(diǎn).
假設(shè)現(xiàn)在有三個(gè)物理服務(wù)器(稱為是三個(gè)節(jié)點(diǎn))分別部署了一個(gè)redis-server進(jìn)程,此時(shí)就可以把其中的一個(gè)節(jié)點(diǎn)作為主節(jié)點(diǎn),另外的兩個(gè)節(jié)點(diǎn)作為從節(jié)點(diǎn).
從節(jié)點(diǎn)就要聽取主節(jié)點(diǎn)的(從節(jié)點(diǎn)上的數(shù)據(jù)跟隨主節(jié)點(diǎn)變化,從節(jié)點(diǎn)的數(shù)據(jù)要和主節(jié)點(diǎn)上的數(shù)據(jù)保持一致).
本來,在主節(jié)點(diǎn)上保存了一堆數(shù)據(jù),引入從節(jié)點(diǎn)之后,就要把主節(jié)點(diǎn)上的數(shù)據(jù),復(fù)制出來,放到從節(jié)點(diǎn)上,后續(xù)主節(jié)點(diǎn)上對于數(shù)據(jù)有任何的修改,都會把這樣的修改給同步到從節(jié)點(diǎn)上.
所以,從節(jié)點(diǎn)就相當(dāng)于是主節(jié)點(diǎn)的副本.
需要注意的是,在redis的主從模式中,從節(jié)點(diǎn)上的數(shù)據(jù),是不允許修改的,從節(jié)點(diǎn)只能進(jìn)行讀取數(shù)據(jù)的操作!!!
之前只是單個(gè)redis服務(wù)節(jié)點(diǎn),此時(shí)這個(gè)機(jī)器掛了,整個(gè)redis就掛了,但當(dāng)我們引入主從模式之后,整個(gè)系統(tǒng)的可用性就大大提高了.因?yàn)樯鲜龅闹鲝慕Y(jié)構(gòu),不太可能出現(xiàn)這些redis機(jī)器同時(shí)宕機(jī)的情況.考慮到更高的可用性,我們也可以把這些機(jī)器放到不同的機(jī)房中.(異地多活)
由于從節(jié)點(diǎn)的數(shù)據(jù)都是和主節(jié)點(diǎn)保持一致的,因此客戶從主節(jié)點(diǎn)讀取數(shù)據(jù)和從從節(jié)點(diǎn)讀取數(shù)據(jù)時(shí)沒有區(qū)別的.所以后續(xù)如果有客戶來讀取數(shù)據(jù),就可以從上述節(jié)點(diǎn)中隨機(jī)挑選一個(gè)節(jié)點(diǎn)給這個(gè)客戶端來提供讀取數(shù)據(jù)的服務(wù).這樣,就能大大提高支持的并發(fā)量.
準(zhǔn)確來說,主從模式,主要是針對讀操作進(jìn)行并發(fā)量和可用性的提高,對于寫操作,無論是可用性還是并發(fā)性,都是非常依賴主節(jié)點(diǎn)的,但是主節(jié)點(diǎn)就只有一個(gè).(如果主節(jié)點(diǎn)搞多個(gè),那么數(shù)據(jù)的同步會非常麻煩)
在實(shí)際的業(yè)務(wù)場景中,讀操作是比寫操作要頻繁的多的.
配置redis主從模式
配置redis主從模式,首先要啟動多個(gè)redis服務(wù)器,正常來說,每個(gè)redis服務(wù)器是應(yīng)該在一個(gè)單獨(dú)的主機(jī)上(這才是真正的分布式),但是由于當(dāng)前學(xué)習(xí)資源有限,就在同一個(gè)云服務(wù)器上來運(yùn)行多個(gè)redis-server進(jìn)程.
在一臺機(jī)器上運(yùn)行多個(gè)redis-server進(jìn)程時(shí),要保證這些進(jìn)程的端口是不可以沖突的.
指定redis-server的端口有兩種方式,一種是在啟動程序的時(shí)候,通過命令行來指定端口號,--port選項(xiàng);一種是在配置文件中來設(shè)定端口.
我們在這里將創(chuàng)建一個(gè)主節(jié)點(diǎn)和兩個(gè)從節(jié)點(diǎn).主節(jié)點(diǎn)的配置文件不用改變,只需要修改從節(jié)點(diǎn)的配置文件即可.
創(chuàng)建一個(gè)新目錄,將redis的配置文件復(fù)制兩份到此目錄下.
將這兩個(gè)配置文件中的port改為6380和6381,并且設(shè)定damenize為yes(按照后臺進(jìn)程的方式來執(zhí)行).
配置完成之后,通過命令行的形式來啟動這兩個(gè)redis.
到這里,當(dāng)前這幾個(gè)節(jié)點(diǎn)并沒有構(gòu)成主從結(jié)構(gòu),而是各自為政,要想真正成為主從結(jié)構(gòu),還需要進(jìn)一步的進(jìn)行配置.
要想配置成為主從結(jié)構(gòu),就需要使用slaveof.
1.在配置?件中加??slaveof?{masterHost}?{masterPort}?隨?Redis?啟動?效。
2.?在?redis-server?啟動命令時(shí)加??--slaveof?{masterHost}?{masterPort}??效。
3.?直接使??redis?命令:slaveof?{masterHost}?{masterPort}??效
這里推薦使用修改配置文件的方式,會一直持久生效.
我們配置以6379為主節(jié)點(diǎn),6380和6381為從節(jié)點(diǎn).
在從節(jié)點(diǎn)的配置文件中加入slaveof配置項(xiàng).
修改完配置文件之后,需要重新啟動才能生效.
我們要使用kill -9的方式來停止這兩個(gè)redis-server,這個(gè)停止方式是和我們直接運(yùn)行redis的時(shí)候的命令是搭配的.
而如果是使用service redis-server start的方式啟動,則必須使用service redis-server stop來進(jìn)行停止.此時(shí)如果使用kill -9的方式停止,這個(gè)redis-server進(jìn)程會自動啟動.
當(dāng)重新啟動后,從節(jié)點(diǎn)和主節(jié)點(diǎn)之間就建立了tcp連接.
主節(jié)點(diǎn)這邊數(shù)據(jù)產(chǎn)生的修改,從節(jié)點(diǎn)就能立即感知到,就是上述這些tcp連接起到的效果.
此時(shí)在從節(jié)點(diǎn)中寫入數(shù)據(jù)就會報(bào)錯(cuò)!!!
info replication命令查看復(fù)制相關(guān)的狀態(tài)
主節(jié)點(diǎn)的復(fù)制狀態(tài)信息
從節(jié)點(diǎn)的復(fù)制狀態(tài)信息(6380)
offset就表示從節(jié)點(diǎn)和主節(jié)點(diǎn)之間同步數(shù)據(jù)的進(jìn)度.(從節(jié)點(diǎn)和主節(jié)點(diǎn)之間的數(shù)據(jù)同步不是瞬間完成的,靠網(wǎng)絡(luò)傳輸,所以有延遲)
replid可以認(rèn)為是主節(jié)點(diǎn)的身份標(biāo)識.
斷開復(fù)制關(guān)系
slaveof命令不僅可以建立復(fù)制,還可以在從節(jié)點(diǎn)上執(zhí)行slaveof no one命令來斷開與主節(jié)點(diǎn)之間的復(fù)制關(guān)系.
斷開復(fù)制關(guān)系流程包括兩步:
1.斷開與主節(jié)點(diǎn)之間的復(fù)制關(guān)系.
2.從節(jié)點(diǎn)晉升為主節(jié)點(diǎn).
從節(jié)點(diǎn)斷開復(fù)制后并不會拋棄原有的數(shù)據(jù),只是無法在獲取主節(jié)點(diǎn)上的數(shù)據(jù)變化.
通過slaveof命令還可以實(shí)現(xiàn)切換主節(jié)點(diǎn)的操作,,將當(dāng)前從節(jié)點(diǎn)的數(shù)據(jù)源切換到另?個(gè)主節(jié)點(diǎn)。執(zhí)?
slaveof?{newMasterIp}?{newMasterPort}?命令即可。
切主操作的主要流程:
- 斷開與舊主節(jié)點(diǎn)的復(fù)制關(guān)系.
- 與新主節(jié)點(diǎn)建立復(fù)制關(guān)系
- 刪除從節(jié)點(diǎn)上當(dāng)前的所有數(shù)據(jù)
- 與新主節(jié)點(diǎn)進(jìn)行復(fù)制操作
安全性
對于數(shù)據(jù)?較重要的節(jié)點(diǎn),主節(jié)點(diǎn)會通過設(shè)置?requirepass?參數(shù)進(jìn)?密碼驗(yàn)證,這時(shí)所有的客?
端訪問必須使??auth?命令實(shí)?校驗(yàn)。從節(jié)點(diǎn)與主節(jié)點(diǎn)的復(fù)制連接是通過?個(gè)特殊標(biāo)識的客?端來完成,因此需要配置從節(jié)點(diǎn)的masterauth?參數(shù)與主節(jié)點(diǎn)密碼保持?致,這樣從節(jié)點(diǎn)才可以正確地連接到主節(jié)點(diǎn)并發(fā)起復(fù)制流程。
只讀
默認(rèn)情況下,從節(jié)點(diǎn)使??slave-read-only=yes?配置為只讀模式。由于復(fù)制只能從主節(jié)點(diǎn)到從節(jié)
點(diǎn),對于從節(jié)點(diǎn)的任何修改主節(jié)點(diǎn)都?法感知,修改從節(jié)點(diǎn)會造成主從數(shù)據(jù)不?致。所以建議線上不要修改從節(jié)點(diǎn)的只讀模式。
傳輸延遲
主從節(jié)點(diǎn)?般部署在不同機(jī)器上,復(fù)制時(shí)的?絡(luò)延遲就成為需要考慮的問題,Redis?為我們提供
了?repl-disable-tcp-nodelay?參數(shù)?于控制是否關(guān)閉?TCP_NODELAY,默認(rèn)為?no,即開啟?tcp_nodelay?功能,說明如下:
??當(dāng)關(guān)閉時(shí),主節(jié)點(diǎn)產(chǎn)?的命令數(shù)據(jù)?論??都會及時(shí)地發(fā)送給從節(jié)點(diǎn),這樣主從之間延遲會變?,但增加了?絡(luò)帶寬的消耗。適?于主從之間的?絡(luò)環(huán)境良好的場景,如同機(jī)房部署。
??當(dāng)開啟時(shí),主節(jié)點(diǎn)會合并較?的?TCP?數(shù)據(jù)包從?節(jié)省帶寬。默認(rèn)發(fā)送時(shí)間間隔取決于?Linux?的內(nèi)
核,?般默認(rèn)為?40?毫秒。這種配置節(jié)省了帶寬但增?主從之間的延遲。適?于主從?絡(luò)環(huán)境復(fù)雜
的場景,如跨機(jī)房部署.
拓?fù)浣Y(jié)構(gòu)
主從模式的拓?fù)浣Y(jié)構(gòu)描述了若干個(gè)節(jié)點(diǎn)之間,是按照什么樣的方式來進(jìn)行組織連接的.
常見的拓?fù)浣Y(jié)構(gòu)有:一主一從拓?fù)?一主多從拓?fù)浜蜆湫瓮負(fù)?
一主一從
如果寫數(shù)據(jù)的請求太多,此時(shí)也會給主節(jié)點(diǎn)造成很大壓力,可以通過關(guān)閉主節(jié)點(diǎn)的AOF來緩解主節(jié)點(diǎn)的壓力,只在從節(jié)點(diǎn)這里開啟aof.
但是這種設(shè)定方式,有一個(gè)嚴(yán)重缺陷:主節(jié)點(diǎn)一旦宕機(jī),不能讓它自動重啟,如果自動重啟,此時(shí)沒有aof文件,就會丟失數(shù)據(jù),進(jìn)一步的主從同步會把從節(jié)點(diǎn)的數(shù)據(jù)也給刪除.
所以,當(dāng)主節(jié)點(diǎn)掛了之后,就需要讓主節(jié)點(diǎn)從從節(jié)點(diǎn)這里獲取到aof的文件,在啟動.
一主多從
扁平化結(jié)構(gòu),此結(jié)構(gòu)一旦從節(jié)點(diǎn)個(gè)數(shù)增加很多,那么主節(jié)點(diǎn)同步一條數(shù)據(jù)就需要傳輸多次,可能會消耗大量的網(wǎng)絡(luò)帶寬.
樹形結(jié)構(gòu)
主節(jié)點(diǎn)同步數(shù)據(jù)不會消耗那么多的網(wǎng)絡(luò)帶寬了,但是一旦數(shù)據(jù)進(jìn)行同步,同步的延遲是比較長的,因?yàn)橐M(jìn)行多次網(wǎng)絡(luò)傳輸.
復(fù)制過程
注意的是其中同步數(shù)據(jù)集這步操作,對于首次建立復(fù)制的場景,主節(jié)點(diǎn)會把當(dāng)前所持有的所有數(shù)據(jù)全部發(fā)送給從節(jié)點(diǎn),這步的操作耗時(shí)最長,所以又劃分為兩種情況:全量復(fù)制和部分復(fù)制.
數(shù)據(jù)同步psync
redis使用psync命令完成主從數(shù)據(jù)同步,同步過程分為:全量復(fù)制和部分復(fù)制.
psync不需要我們手動執(zhí)行,redis服務(wù)器會在建立好主從復(fù)制關(guān)系之后,自動執(zhí)行psync.
從節(jié)點(diǎn)負(fù)責(zé)執(zhí)行psync,從節(jié)點(diǎn)從主節(jié)點(diǎn)這邊拉取數(shù)據(jù).
psync的命令格式:PSYNC?replicationid?offset.
如果replicationid設(shè)為?,offset設(shè)為-1,此時(shí)就是在嘗試進(jìn)行全量復(fù)制.
如果replicationid和offset設(shè)置了具體的值,則是嘗試進(jìn)行部分復(fù)制.
replicationid
replication是復(fù)制的意思,這個(gè)就表示是一個(gè)復(fù)制id.
replicationid是由主節(jié)點(diǎn)生成的,主節(jié)點(diǎn)啟動的時(shí)候就會生成,從節(jié)點(diǎn)晉升為主節(jié)點(diǎn)的時(shí)候,也會生成.
(即使是同一個(gè)主節(jié)點(diǎn),每次重啟的時(shí)候,生成的replicationid都是不同的).
從節(jié)點(diǎn)和主節(jié)點(diǎn)建立了復(fù)制關(guān)系,從節(jié)點(diǎn)就會從主節(jié)點(diǎn)這里獲取到replicationid.
一般replid2用不上.假設(shè)此時(shí)有一個(gè)主節(jié)點(diǎn)A和一個(gè)從節(jié)點(diǎn)B.A負(fù)責(zé)生成replid,B負(fù)責(zé)獲取A的replid.
如果A和B在通信過程中出現(xiàn)了網(wǎng)絡(luò)抖動,B可能會認(rèn)為A掛了,此時(shí)B就會自己成為主節(jié)點(diǎn),(給自己也生成一個(gè)replid),但是B也會保存之前舊的replid,這個(gè)舊的replid就會保存在replid2中,方便后續(xù)網(wǎng)絡(luò)穩(wěn)定之后,B重新與A建立復(fù)制關(guān)系.在主從模式下,上述過程需要手動干預(yù),而哨兵模式下可以自動完成.
offset
表示偏移量.主節(jié)點(diǎn)和從節(jié)點(diǎn)上都會維護(hù)偏移量(整數(shù)).
主節(jié)點(diǎn)的偏移量會根據(jù)收到的修改命令占據(jù)的字節(jié)數(shù)來將offset進(jìn)行累加.
從節(jié)點(diǎn)的偏移量就描述了,當(dāng)前從節(jié)點(diǎn)數(shù)據(jù)同步的進(jìn)度.
如果主節(jié)點(diǎn)的offset和從節(jié)點(diǎn)的offset一樣,就說明從節(jié)點(diǎn)的數(shù)據(jù)和主節(jié)點(diǎn)的數(shù)據(jù)一致了.
從節(jié)點(diǎn)每秒鐘會上報(bào)自身的復(fù)制偏移量給主節(jié)點(diǎn).
綜上,replicationid和offset就描述出一個(gè)數(shù)據(jù)集,就可以表示從節(jié)點(diǎn)從哪里復(fù)制的數(shù)據(jù),復(fù)制到哪里了!!!!
psync運(yùn)行流程
- 從節(jié)點(diǎn)發(fā)送psync命令給主節(jié)點(diǎn),replid和offset的默認(rèn)值分別是?和-1.
- 主節(jié)點(diǎn)根據(jù)psync的參數(shù)和自身的情況決定響應(yīng)結(jié)果.
- 如果回復(fù)+FULLRESYNC replid offset,則從節(jié)點(diǎn)需要進(jìn)行全量復(fù)制流程
- 如果回復(fù)+CONTINUE,從節(jié)點(diǎn)進(jìn)行部分復(fù)制流程
- 如果回復(fù)-ERR,說明redis主節(jié)點(diǎn)版本過低,不支持psync命令.此時(shí)從節(jié)點(diǎn)可以使用sync命令進(jìn)行全量復(fù)制.
注意:psync一般不需要進(jìn)行手動執(zhí)行,redis會在主從模式下自動調(diào)用執(zhí)行.
sync命令(1.0.0版本就有),會阻塞redis-server處理其他的請求,而psync命令則不會.
全量復(fù)制流程
何時(shí)進(jìn)行全量復(fù)制:首次和主節(jié)點(diǎn)進(jìn)行數(shù)據(jù)同步或者主節(jié)點(diǎn)不方便進(jìn)行部分復(fù)制的時(shí)候.
無硬盤模式
部分復(fù)制流程
全量復(fù)制雖然穩(wěn)妥,但是比較低效,開銷比較大.
有些時(shí)候,從節(jié)點(diǎn)本身已經(jīng)持有了主節(jié)點(diǎn)的絕大部分?jǐn)?shù)據(jù),就不需要再進(jìn)行全量復(fù)制了.
比如出現(xiàn)網(wǎng)絡(luò)抖動,主節(jié)點(diǎn)最近修改的數(shù)據(jù)無法同步給從節(jié)點(diǎn),進(jìn)一步可能從節(jié)點(diǎn)已經(jīng)感知不到主節(jié)點(diǎn)了.但是網(wǎng)絡(luò)抖動一般是暫時(shí)的,網(wǎng)絡(luò)恢復(fù)之后,此時(shí)就可以讓從節(jié)點(diǎn)和主節(jié)點(diǎn)重新建立連接.重建連接之后,再進(jìn)行數(shù)據(jù)的同步,具體是全量復(fù)制還是部分部分復(fù)制還是要看具體的交互流程.
psync帶有具體的參數(shù)值,主節(jié)點(diǎn)就要根據(jù)參數(shù)和當(dāng)前自身情況進(jìn)行判定,當(dāng)前這次是按照全量復(fù)制合適還是部分復(fù)制合適.
積壓緩沖區(qū)
積壓緩沖區(qū)是保存在主節(jié)點(diǎn)上的?個(gè)固定?度的隊(duì)列,默認(rèn)??為 1MB,當(dāng)主節(jié)點(diǎn)有連接的從節(jié) 點(diǎn)(slave)時(shí)被創(chuàng)建,這時(shí)主節(jié)點(diǎn)(master)響應(yīng)寫命令時(shí),不但會把命令發(fā)送給從節(jié)點(diǎn),還會寫?復(fù)制積壓緩沖區(qū).由于緩沖區(qū)本質(zhì)上是先進(jìn)先出的定?隊(duì)列,所以能實(shí)現(xiàn)保存最近已復(fù)制數(shù)據(jù)的功能,?于部分復(fù)制和復(fù)制命令丟失的數(shù)據(jù)補(bǔ)救.
積壓緩沖區(qū)的信息可以在主節(jié)點(diǎn)的info replication中查看.
圖中四項(xiàng)分別表示:開啟復(fù)制緩沖區(qū),緩沖區(qū)最大長度,起始偏移量(可用于計(jì)算當(dāng)前緩沖區(qū)可用范圍),已保存數(shù)據(jù)的有效長度.
實(shí)時(shí)復(fù)制
當(dāng)從節(jié)點(diǎn)和主節(jié)點(diǎn)執(zhí)行完全量復(fù)制或者部分復(fù)制之后,這一時(shí)刻從節(jié)點(diǎn)和主節(jié)點(diǎn)的數(shù)據(jù)就一致了.但是之后,主節(jié)點(diǎn)還會收到源源不斷的新的修改數(shù)據(jù)的請求,主節(jié)點(diǎn)上的數(shù)據(jù)也會隨之改變,此時(shí)就需要能將這些數(shù)據(jù)也同步給主節(jié)點(diǎn).
所以從節(jié)點(diǎn)和主節(jié)點(diǎn)之間會建立tcp長連接,然后主節(jié)點(diǎn)會把自己收到的修改數(shù)據(jù)的請求,通過tcp連接發(fā)給從節(jié)點(diǎn),從節(jié)點(diǎn)會根據(jù)收到這些修改請求來修改內(nèi)存中的數(shù)據(jù),來保持和主節(jié)點(diǎn)的數(shù)據(jù)一致.
在進(jìn)行實(shí)時(shí)復(fù)制的時(shí)候,需要保證連接處于可用狀態(tài),在此處使用心跳包機(jī)制來實(shí)現(xiàn).
主節(jié)點(diǎn):默認(rèn)每隔10s給從節(jié)點(diǎn)發(fā)送一個(gè)ping命令,從節(jié)點(diǎn)收到返回pong.
從節(jié)點(diǎn):默認(rèn)每隔1s就給主節(jié)點(diǎn)發(fā)起一個(gè)特定的請求,就會上報(bào)當(dāng)前從節(jié)點(diǎn)復(fù)制的進(jìn)度(offset).
這里的數(shù)值都可以可以配置.
主從復(fù)制的弊端
從節(jié)點(diǎn)和主節(jié)點(diǎn)之間斷開連接,有兩種情況:
1.從節(jié)點(diǎn)主動和主節(jié)點(diǎn)之間斷開連接.從節(jié)點(diǎn)執(zhí)行slaveof no one.此時(shí)從節(jié)點(diǎn)能夠自動晉升為主節(jié)點(diǎn).
2.主節(jié)點(diǎn)崩潰.這個(gè)時(shí)候,從節(jié)點(diǎn)不會自動晉升為主節(jié)點(diǎn),必須通過人工干預(yù)的方式,恢復(fù)主節(jié)點(diǎn).
當(dāng)主節(jié)點(diǎn)掛了之后,從節(jié)點(diǎn)無法感知到主節(jié)點(diǎn),就迷茫了.雖然能夠提供讀操作,但是此時(shí)從節(jié)點(diǎn)不能自動升級成為主節(jié)點(diǎn),此時(shí)就只能程序員/運(yùn)維來手工恢復(fù)主節(jié)點(diǎn).這一過程是非常繁瑣的!!!
Redis哨兵就實(shí)現(xiàn)了對掛了的主節(jié)點(diǎn)自動進(jìn)行替換的功能,省去了人工手動恢復(fù)的過程.
主節(jié)點(diǎn)無法正常啟動的原因
在現(xiàn)在三個(gè)節(jié)點(diǎn)在同一主機(jī)上的場景下,如果嘗試重新啟動主節(jié)點(diǎn),會重啟失敗!!!
原因就在于這個(gè)aof文件是屬于root用戶的,其他用戶對這個(gè)文件就只有可讀權(quán)限.
從節(jié)點(diǎn)是通過手動啟動的方式,此時(shí)root用戶下啟動redis服務(wù)器,于是生成的aof文件也是root用戶的文件.
而通過service redis-server start的方式啟動redis服務(wù)器,是通過一個(gè)redis用戶來啟動,那么生成的文件所屬就是redis用戶.
redis server需要按照可讀可寫的方式來打開這個(gè)aof文件,而此時(shí)這個(gè)文件對于root之外的用戶就只是可讀權(quán)限,因此主節(jié)點(diǎn)重啟時(shí)就無法打開這個(gè)文件,就啟動失敗了.
本質(zhì)的原因就是我們把三個(gè)節(jié)點(diǎn)的工作目錄都放在了一起.
解決方案:可以將三個(gè)節(jié)點(diǎn)的工作目錄區(qū)分開,修改配置文件中的dir選項(xiàng).
步驟
1.停止之前的redis服務(wù)器.
2.刪除之前工作目錄下的aof文件或者可以通過chown命令修改aof文件的所屬用戶.
chown redis:redis??appendonly.aof
將用戶修改為redis,組別也修改為redis.
3.給從節(jié)點(diǎn)創(chuàng)建新的目錄來作為其工作目錄,并且修改從節(jié)點(diǎn)的配置文件,設(shè)定新的目錄為其工作目錄.
4.啟動redis服務(wù)器.