国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

阿克蘇網(wǎng)站建設(shè)服務(wù)網(wǎng)站建設(shè)網(wǎng)絡(luò)公司

阿克蘇網(wǎng)站建設(shè)服務(wù),網(wǎng)站建設(shè)網(wǎng)絡(luò)公司,少兒編程老師需要具備什么條件,pc網(wǎng)站是什么目錄 單點(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ù)…

目錄

單點(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}?命令即可。

切主操作的主要流程:

  1. 斷開與舊主節(jié)點(diǎn)的復(fù)制關(guān)系.
  2. 與新主節(jié)點(diǎn)建立復(fù)制關(guān)系
  3. 刪除從節(jié)點(diǎn)上當(dāng)前的所有數(shù)據(jù)
  4. 與新主節(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í)候.

1)從節(jié)點(diǎn)發(fā)送 psync 命令給主節(jié)點(diǎn)進(jìn)?數(shù)據(jù)同步,由于是第?次進(jìn)?復(fù)制,從節(jié)點(diǎn)沒有主節(jié)點(diǎn)的運(yùn)? ID 和復(fù)制偏移量,所以發(fā)送 psync ? -1。
2)主節(jié)點(diǎn)根據(jù)命令,解析出要進(jìn)?全量復(fù)制,回復(fù) +FULLRESYNC 響應(yīng)。
3)從節(jié)點(diǎn)接收主節(jié)點(diǎn)的運(yùn)?信息進(jìn)?保存。
4)主節(jié)點(diǎn)執(zhí)? bgsave 進(jìn)? RDB ?件的持久化。
5)主節(jié)點(diǎn)發(fā)送 RDB ?件給從節(jié)點(diǎn),從節(jié)點(diǎn)保存 RDB 數(shù)據(jù)到本地硬盤。
6)主節(jié)點(diǎn)將從?成 RDB 到接收完成期間執(zhí)?的寫命令,寫?緩沖區(qū)中,等從節(jié)點(diǎn)保存完 RDB ?件 后,主節(jié)點(diǎn)再將緩沖區(qū)內(nèi)的數(shù)據(jù)補(bǔ)發(fā)給從節(jié)點(diǎn),補(bǔ)發(fā)的數(shù)據(jù)仍然按照 rdb 的?進(jìn)制格式追加寫?到收 到的 rdb ?件中. 保持主從?致性。
7)從節(jié)點(diǎn)清空??原有舊數(shù)據(jù)。
8)從節(jié)點(diǎn)加載 RDB ?件得到與主節(jié)點(diǎn)?致的數(shù)據(jù)。
9)如果從節(jié)點(diǎn)加載 RDB 完成之后,并且開啟了 AOF 持久化功能,它會進(jìn)? bgrewrite 操作,得到最近的 AOF ?件.
注意:在主節(jié)點(diǎn)生成rdb文件和傳輸rdb文件的過程中,還會繼續(xù)收到很多新的修改操作.新修改的數(shù)據(jù)也必須要同步給從節(jié)點(diǎn),所以當(dāng)從節(jié)點(diǎn)接收完從主節(jié)點(diǎn)發(fā)送來的rdb文件之后,主節(jié)點(diǎn)還要把新修改的操作也要發(fā)給從節(jié)點(diǎn).

無硬盤模式

Redis從2.8.18版本開始支持無硬盤模式的全量復(fù)制.
主節(jié)點(diǎn)生成的rdb二進(jìn)制數(shù)據(jù)不在直接保存在文件中了,而是直接進(jìn)行網(wǎng)絡(luò)傳輸給從節(jié)點(diǎn),這樣就省下了一系列的讀硬盤和寫硬盤的操作.
從節(jié)點(diǎn)之前也是先把收到的rdb數(shù)據(jù)寫入到硬盤中,然后再加載到內(nèi)存,在此模式下,也可以直接把收到的數(shù)據(jù)進(jìn)行加載.
需要注意的是雖然引入了無硬盤模式,但是整個(gè)全量復(fù)制的過程仍然是比較重量比較耗時(shí)的.網(wǎng)絡(luò)傳輸是大頭!!!

部分復(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ù)制合適.

1)當(dāng)主從節(jié)點(diǎn)之間出現(xiàn)?絡(luò)中斷時(shí),如果超過 repl-timeout 時(shí)間,主節(jié)點(diǎn)會認(rèn)為從節(jié)點(diǎn)故障并中斷復(fù)制連接。
2)主從連接中斷期間主節(jié)點(diǎn)依然響應(yīng)命令,但這些復(fù)制命令都因?絡(luò)中斷?法及時(shí)發(fā)送給從節(jié)點(diǎn),所以暫時(shí)將這些命令滯留在復(fù)制積壓緩沖區(qū)中。
3)當(dāng)主從節(jié)點(diǎn)?絡(luò)恢復(fù)后,從節(jié)點(diǎn)再次連上主節(jié)點(diǎn)。
4)從節(jié)點(diǎn)將之前保存的 replicationId 和 復(fù)制偏移量作為 psync 的參數(shù)發(fā)送給主節(jié)點(diǎn),請求進(jìn)?部分復(fù)制。
5)主節(jié)點(diǎn)接到 psync 請求后,進(jìn)?必要的驗(yàn)證。隨后根據(jù) offset 去復(fù)制積壓緩沖區(qū)查找合適的數(shù)據(jù),并響應(yīng) +CONTINUE 給從節(jié)點(diǎn)。如果數(shù)據(jù)在積壓緩沖區(qū)內(nèi)能找到,說明從節(jié)點(diǎn)拉下的進(jìn)度不多,就進(jìn)行部分復(fù)制;如果確實(shí)當(dāng)前從節(jié)點(diǎn)拉下的進(jìn)度已經(jīng)超出積壓緩沖區(qū)的范圍了,就只能進(jìn)行全量復(fù)制了.
6)主節(jié)點(diǎn)將需要從節(jié)點(diǎn)同步的數(shù)據(jù)發(fā)送給從節(jié)點(diǎn),最終完成?致性.
所以部分復(fù)制可以理解為全量復(fù)制的特殊情況,是一種全量復(fù)制的優(yōu)化手段!!!!

積壓緩沖區(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ù)器.

http://m.aloenet.com.cn/news/44921.html

相關(guān)文章:

  • 網(wǎng)校網(wǎng)站建設(shè)方案優(yōu)化設(shè)計(jì)方法
  • 微網(wǎng)站自己怎么做seo排名優(yōu)化收費(fèi)
  • 慶陽網(wǎng)站建設(shè)百度推廣在哪里
  • 廣州市網(wǎng)站建設(shè)公司在哪里企業(yè)郵箱域名
  • 四川政府網(wǎng)站建設(shè)管理辦法什么是網(wǎng)絡(luò)營銷的核心
  • 團(tuán)購網(wǎng)站平臺建設(shè)什么公司適合做seo優(yōu)化
  • ??谧鼍W(wǎng)站的公司如何做好營銷
  • 新網(wǎng)站前期如何做seo怎么在百度免費(fèi)推廣
  • 諸暨網(wǎng)站制作哪些公司制作西安網(wǎng)站制作推廣
  • 荊州網(wǎng)站建設(shè)seo門戶 site
  • 泰和網(wǎng)站制作網(wǎng)站空間
  • 什么網(wǎng)站建設(shè)最簡單騰訊3大外包公司
  • wordpress購買服務(wù)器百度seo搜索營銷新視角
  • 專門做app的網(wǎng)站內(nèi)容營銷策略
  • 銅仁市網(wǎng)站建設(shè)情況上海百度推廣電話
  • 合肥網(wǎng)站推廣 公司哪家好最好看免費(fèi)觀看高清大全
  • 鄭州建網(wǎng)站多少河南整站百度快照優(yōu)化
  • 做網(wǎng)站除了廣告還有什么收入的種子搜索神器網(wǎng)頁版
  • 百度做網(wǎng)站一鍵優(yōu)化清理加速
  • 建網(wǎng)站個(gè)人主機(jī)做服務(wù)器天津seo選天津旗艦科技a
  • 重慶社區(qū)官網(wǎng)太原seo關(guān)鍵詞排名
  • 企業(yè)網(wǎng)站建設(shè)的一般要素包括6百度下載官網(wǎng)
  • 產(chǎn)品宣傳片制作公司seo網(wǎng)站關(guān)鍵詞排名優(yōu)化公司
  • 中國在菲律賓做網(wǎng)站百度知道首頁
  • 設(shè)計(jì)類專業(yè)網(wǎng)站西安核心關(guān)鍵詞排名
  • 哪個(gè)網(wǎng)站做非洲的生意站長素材
  • 做網(wǎng)站經(jīng)常加班還是appdz論壇seo
  • 購買域名后如何使用搜索網(wǎng)站排名優(yōu)化
  • 給網(wǎng)站首頁圖片做外網(wǎng)超鏈接_為什么會彈出一個(gè)服務(wù)器登錄窗口網(wǎng)頁制作成品
  • 那些網(wǎng)站可以接私活做比較好的免費(fèi)網(wǎng)站