亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

 

一、什么是redis主從復(fù)制?

主從復(fù)制就是現(xiàn)在有兩臺(tái)redis服務(wù)器,把一臺(tái)redis的數(shù)據(jù)同步到另一臺(tái)redis數(shù)據(jù)庫(kù)上。前者稱之為主節(jié)點(diǎn)(master),后者為從節(jié)點(diǎn)(slave)。數(shù)據(jù)是只能master往slave同步單向。

但是在實(shí)際過(guò)程中是不可能只有倆臺(tái)redis服務(wù)器來(lái)做主從復(fù)制的,這也就意味著每臺(tái)redis服務(wù)器都有可能會(huì)成為主節(jié)點(diǎn)(master)

下圖案例中,我們的slave3既是master的從節(jié)點(diǎn),也是slave的主節(jié)點(diǎn)。

先知道這么個(gè)概念,更多詳解繼續(xù)查看下文。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

二、為什么需要Redis主從復(fù)制?

假設(shè)我們現(xiàn)在就一臺(tái)redis服務(wù)器,也就是單機(jī)狀態(tài)。

在這種情況下會(huì)出現(xiàn)的第一個(gè)問(wèn)題就是服務(wù)器宕機(jī),直接導(dǎo)致數(shù)據(jù)丟失。如果項(xiàng)目是跟¥占關(guān)系的,那造成的后果就可想而知。

第二個(gè)情況就是內(nèi)存問(wèn)題了,當(dāng)只有一臺(tái)服務(wù)器時(shí)內(nèi)存肯定會(huì)到達(dá)峰值的,不可能對(duì)一臺(tái)服務(wù)器進(jìn)行無(wú)限升級(jí)的。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

所以針對(duì)以上倆個(gè)問(wèn)題,我們就多準(zhǔn)備幾臺(tái)服務(wù)器,配置主從復(fù)制。將數(shù)據(jù)保存在多個(gè)服務(wù)器上。并且保證每個(gè)服務(wù)器的數(shù)據(jù)是同步的。即使有一個(gè)服務(wù)器宕機(jī)了,也不會(huì)影響用戶的使用。redis可以繼續(xù)實(shí)現(xiàn)高可用、同時(shí)實(shí)現(xiàn)數(shù)據(jù)的冗余備份。

這會(huì)應(yīng)該會(huì)有很多疑問(wèn),master跟slave怎么連接呢? 如何同步數(shù)據(jù)呢? 假如master服務(wù)器宕機(jī)了呢?別著急,一點(diǎn)一點(diǎn)解決你的問(wèn)題。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

三、Redis主從復(fù)制的作用

在上邊我們說(shuō)了為什么使用redis的主從復(fù)制,那么主從復(fù)制的作用就是針對(duì)為什么使用它來(lái)講了。

  1. 我們繼續(xù)使用這個(gè)圖來(lái)談?wù)?/li>
  2. 第一點(diǎn)是數(shù)據(jù)冗余了,實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的另一種方式。
  3. 第二點(diǎn)是針對(duì)單機(jī)故障問(wèn)題。當(dāng)主節(jié)點(diǎn)也就是master出現(xiàn)問(wèn)題時(shí),可以由從節(jié)點(diǎn)來(lái)提供服務(wù)也就是slave,實(shí)現(xiàn)了快速恢復(fù)故障,也就是服務(wù)冗余。
  4. 第三點(diǎn)是讀寫(xiě)分離,master服務(wù)器主要是寫(xiě),slave主要用來(lái)讀數(shù)據(jù),可以提高服務(wù)器的負(fù)載能力。同時(shí)可以根據(jù)需求的變化,添加從節(jié)點(diǎn)的數(shù)量。
  5. 第四點(diǎn)是負(fù)載均衡,配合讀寫(xiě)分離,有主節(jié)點(diǎn)提供寫(xiě)服務(wù),從節(jié)點(diǎn)提供讀服務(wù),分擔(dān)服務(wù)器負(fù)載,尤其在寫(xiě)少讀多的情況下,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高redis服務(wù)器的并發(fā)量和負(fù)載。
  6. 第五點(diǎn)是高可用的基石,主從復(fù)制是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此我們可以說(shuō)主從復(fù)制是高可用的基石。
寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

四、配置Redis主從復(fù)制

說(shuō)了這么多,我們先簡(jiǎn)單的配置一個(gè)主從復(fù)制案例,然后在談實(shí)現(xiàn)的原理。

redis存儲(chǔ)路徑為:usr/local/redis

日志跟配置文件存儲(chǔ)在:usr/local/redis/data

首先我們先配置倆個(gè)配置文件,分別為redis6379.conf 和 redis6380.conf

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

修改配置文件,主要就是修改端口。為了查看方便在把日志文件和持久化文件的名字都用各自的端口來(lái)做標(biāo)識(shí)。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

然后分別開(kāi)啟倆個(gè)redis服務(wù),一個(gè)端口為6379,一個(gè)端口為6380。執(zhí)行命令redis-server redis6380.conf,然后使用redis-cli -p 6380連接,因?yàn)閞edis的默認(rèn)端口就是6379所以我們啟動(dòng)另外一臺(tái)redis服務(wù)器直接使用redis-server redis6379.conf 然后直接使用redis-cli直接連接就可以。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

這個(gè)時(shí)候我們就成功的配置了倆個(gè)redis服務(wù),一臺(tái)為6380,一臺(tái)為6379,這里只是為了演示。實(shí)際工作中是需要配置在兩臺(tái)不同的服務(wù)器的。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

1. 使用客戶端命令行啟動(dòng)

我們先得有一個(gè)概念,就是在配置主從復(fù)制時(shí),所有的操作都是在從節(jié)點(diǎn)來(lái)操作,也就是slave。

那么我們?cè)趶墓?jié)點(diǎn)執(zhí)行一個(gè)命令為 slaveof 127.0.0.1 6379,執(zhí)行完就代表我們連接上了。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

我們先測(cè)試一下看是否實(shí)現(xiàn)主從復(fù)制。在master這臺(tái)服務(wù)器上執(zhí)行倆個(gè)set kaka 123 和 set master 127.0.0.1,然后在slave6380端口是可以成功獲取到的,也就說(shuō)明我們的主從復(fù)制就已經(jīng)配置完成了。但是在實(shí)現(xiàn)生產(chǎn)環(huán)境可不是就這樣完事了,后邊會(huì)在進(jìn)一步對(duì)主從復(fù)制進(jìn)行優(yōu)化,直到實(shí)現(xiàn)高可用。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

2. 使用配置文件啟用

在使用配置文件啟動(dòng)主從復(fù)制之前呢!先需要把之前使用客戶端命令行連接的斷開(kāi),再?gòu)闹鳈C(jī)執(zhí)行slaveof no one即可斷開(kāi)主從復(fù)制。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

在哪可以查看從節(jié)點(diǎn)已經(jīng)斷開(kāi)了主節(jié)點(diǎn)呢!在主節(jié)點(diǎn)的客戶端輸入命令行info查看

這張圖是使用從節(jié)點(diǎn)使用客戶端命令行連接主節(jié)點(diǎn)后,在主節(jié)點(diǎn)的客戶端輸入info打印的信息,可以看到有一個(gè)slave0的一個(gè)信息。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

這個(gè)圖是在從節(jié)點(diǎn)執(zhí)行完slaveof no one 后,在主節(jié)點(diǎn)打印的info,說(shuō)明從節(jié)點(diǎn)已經(jīng)跟主節(jié)點(diǎn)斷開(kāi)連接了。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

在根據(jù)配置文件啟動(dòng)redis服務(wù),redis-server redis6380.conf

當(dāng)在從節(jié)點(diǎn)重新啟動(dòng)后就可以在主節(jié)點(diǎn)直接查看到從節(jié)點(diǎn)的連接信息。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

測(cè)試數(shù)據(jù),主節(jié)點(diǎn)寫(xiě)的東西,從節(jié)點(diǎn)還是會(huì)自動(dòng)同步的。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

3. 啟動(dòng)redis服務(wù)器時(shí)啟動(dòng)

這種方式配置也是很簡(jiǎn)單,在啟動(dòng)redis服務(wù)器時(shí)直接就啟動(dòng)主從復(fù)制,執(zhí)行命令:redis-server --slaveof host port 即可。

4. 主從復(fù)制啟動(dòng)后的日志信息查看

這個(gè)是主節(jié)點(diǎn)的日志信息

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

這個(gè)是從節(jié)點(diǎn)的信息,其中有連接主節(jié)點(diǎn)信息,還有RDB快照保存。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

五、主從復(fù)制工作原理

1. 主從復(fù)制的三個(gè)階段

主從復(fù)制完整的工作流程分為以下三個(gè)階段。每一段都有自己的內(nèi)部工作流程,那么我們會(huì)對(duì)這三個(gè)過(guò)程進(jìn)行談?wù)摗?/p>

  • 建立連接過(guò)程:這個(gè)過(guò)程就是slave跟master連接的過(guò)程
  • 數(shù)據(jù)同步過(guò)程:是master給slave同步數(shù)據(jù)的過(guò)程
  • 命令傳播過(guò)程:是反復(fù)同步數(shù)據(jù)

2. 第一階段:建立連接過(guò)程

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

上圖是一個(gè)完整主從復(fù)制建立連接工作流程。然后使用簡(jiǎn)短的話語(yǔ)來(lái)描述上邊的工作流程。

  1. 設(shè)置master的地址和端口,保存master的信息
  2. 建立socket連接(這個(gè)連接做的事情下文會(huì)說(shuō))
  3. 持續(xù)發(fā)送ping命令
  4. 身份驗(yàn)證
  5. 發(fā)送slave端口信息

在建立連接的過(guò)程中,從節(jié)點(diǎn)會(huì)保存master的地址和端口、主節(jié)點(diǎn)master保存從節(jié)點(diǎn)slave的端口。

3. 第二階段:數(shù)據(jù)同步階段過(guò)程

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

這張圖是詳細(xì)描述第一次從節(jié)點(diǎn)連接主節(jié)點(diǎn)時(shí)的數(shù)據(jù)同步過(guò)程。

當(dāng)從節(jié)點(diǎn)第一次連接主節(jié)點(diǎn)時(shí),先會(huì)執(zhí)行一次全量復(fù)制這次的全量復(fù)制是無(wú)法避免的。

全量復(fù)制執(zhí)行完成后,主節(jié)點(diǎn)就會(huì)發(fā)送復(fù)制積壓緩沖區(qū)的數(shù)據(jù),然后從節(jié)點(diǎn)就會(huì)執(zhí)行bgrewriteaof恢復(fù)數(shù)據(jù),這也就是部分復(fù)制。

在這個(gè)階段提到了三個(gè)新點(diǎn),全量復(fù)制、部分復(fù)制、復(fù)制緩沖積壓區(qū)。會(huì)在下文的常見(jiàn)問(wèn)題里詳細(xì)說(shuō)明這幾個(gè)點(diǎn)。

4. 第三階段:命令傳播階段

當(dāng)master數(shù)據(jù)庫(kù)被修改后,主從服務(wù)器的數(shù)據(jù)不一致后,此時(shí)就會(huì)讓主從數(shù)據(jù)同步到一致,這個(gè)過(guò)程稱之為命令傳播。

master會(huì)將接收到的數(shù)據(jù)變更命令發(fā)送給slave,slave接收命令后執(zhí)行命令,讓主從數(shù)據(jù)達(dá)到一致。

命令傳播階段的部分復(fù)制

  • 在命令傳播階段出現(xiàn)斷網(wǎng)的情況,或者網(wǎng)絡(luò)抖動(dòng)時(shí)會(huì)導(dǎo)致連接斷開(kāi)(connection lost)
  • 這個(gè)時(shí)候主節(jié)點(diǎn)master還是會(huì)繼續(xù)往replbackbuffer(復(fù)制緩沖積壓區(qū))寫(xiě)數(shù)據(jù)
  • 從節(jié)點(diǎn)會(huì)繼續(xù)嘗試連接主機(jī)(connect to master)
  • 當(dāng)從節(jié)點(diǎn)把自己的runid和復(fù)制偏移量發(fā)送給主節(jié)點(diǎn),并且執(zhí)行pysnc命令同步
  • 如果master判斷偏移量是在復(fù)制緩沖區(qū)范圍內(nèi),就會(huì)返回continue命令。并且發(fā)送復(fù)制緩沖區(qū)的數(shù)據(jù)給從節(jié)點(diǎn)。
  • 從節(jié)點(diǎn)接收數(shù)據(jù)執(zhí)行bgrewriteaof,恢復(fù)數(shù)據(jù)

六. 詳細(xì)介紹主從復(fù)制原理(全量復(fù)制+部分復(fù)制)

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

這個(gè)過(guò)程就是主從復(fù)制最齊全的流程講解。那么下來(lái)我們對(duì)每一步進(jìn)程簡(jiǎn)單的介紹

  1. 從節(jié)點(diǎn)發(fā)送指令psync ? 1 psync runid offset 找對(duì)應(yīng)的runid索取數(shù)據(jù)。但是這里可以考慮一下,當(dāng)從節(jié)點(diǎn)第一次連接的時(shí)候根本就不知道主節(jié)點(diǎn)的runid 和 offset 。所以第一次發(fā)送的指令是psync ? 1意思就是主節(jié)點(diǎn)的數(shù)據(jù)我全要。
  2. 主節(jié)點(diǎn)開(kāi)始執(zhí)行bgsave生成RDB文件,記錄當(dāng)前的復(fù)制偏移量offset
  3. 主節(jié)點(diǎn)這個(gè)時(shí)候會(huì)把自己的runid 和 offset 通過(guò) +FULLRESYNC runid offset 指令 通過(guò)socket發(fā)送RDB文件給從節(jié)點(diǎn)。
  4. 從節(jié)點(diǎn)接收到+FULLRESYNC 保存主節(jié)點(diǎn)的runid和offset 然后清空當(dāng)前所有數(shù)據(jù),通過(guò)socket接收RDB文件,開(kāi)始恢復(fù)RDB數(shù)據(jù)。
  5. 在全量復(fù)制后,從節(jié)點(diǎn)已經(jīng)獲取到了主節(jié)點(diǎn)的runid和offset,開(kāi)始發(fā)送指令 psync runid offset
  6. 主節(jié)點(diǎn)接收指令,判斷runid是否匹配,判斷offset是否在復(fù)制緩沖區(qū)中。
  7. 主節(jié)點(diǎn)判斷runid和offset有一個(gè)不滿足,就會(huì)在返回到步驟2繼續(xù)執(zhí)行全量復(fù)制。這里的runid不匹配只有的可能是從節(jié)點(diǎn)重啟了這個(gè)問(wèn)題后邊會(huì)解決,offset(偏移量)不匹配就是復(fù)制積壓緩沖區(qū)溢出了。 如果runid或offset校驗(yàn)通過(guò),從節(jié)點(diǎn)的offset和主節(jié)點(diǎn)的offset相同時(shí)則忽略。 如果runid或offset檢驗(yàn)通過(guò),從節(jié)點(diǎn)的offset與offset不相同,則會(huì)發(fā)送 +CONTINUE offset(這個(gè)offset為主節(jié)點(diǎn)的),通過(guò)socket發(fā)送復(fù)制緩沖區(qū)中從節(jié)點(diǎn)offset到主節(jié)點(diǎn)offset的數(shù)據(jù)。
  8. 從節(jié)點(diǎn)收到+CONTINUE 保存master的offset 通過(guò)socket接收到信息后,執(zhí)行bgrewriteaof,恢復(fù)數(shù)據(jù)。

1-4是全量復(fù)制 5-8是部分復(fù)制

在主節(jié)點(diǎn)的第3步下面 主節(jié)點(diǎn)在主從復(fù)制的期間是一直在接收客戶端的數(shù)據(jù),主節(jié)點(diǎn)的offset是一直變化的。只有有變化就會(huì)給每個(gè)slave進(jìn)行發(fā)送,這個(gè)發(fā)送的過(guò)程稱之為心跳機(jī)制

七. 心跳機(jī)制

在命令傳播階段是,主節(jié)點(diǎn)與從節(jié)點(diǎn)之間一直都需要進(jìn)行信息互換,使用心跳機(jī)制進(jìn)行維護(hù),實(shí)現(xiàn)主節(jié)點(diǎn)和從節(jié)點(diǎn)連接保持在線。

  • master心跳 指令:ping 默認(rèn)10秒進(jìn)行一次,是由參數(shù)repl-ping-slave-period決定的 主要做的事情就是判斷從節(jié)點(diǎn)是否在線 可以使用info replication 來(lái)查看從節(jié)點(diǎn)租后一次連接時(shí)間的間隔,lag為0或者為1就是正常狀態(tài)。
  • slave心跳任務(wù) 指令:replconf ack {offset} 每秒執(zhí)行一次 主要做的事情是給主節(jié)點(diǎn)發(fā)送自己的復(fù)制偏移量,從主節(jié)點(diǎn)獲取到最新的數(shù)據(jù)變更命令,還做一件事情就是判斷主節(jié)點(diǎn)是否在線。

心跳階段的注意事項(xiàng) 主節(jié)點(diǎn)為保障數(shù)據(jù)穩(wěn)定性,當(dāng)從節(jié)點(diǎn)掛掉的數(shù)量或者延遲過(guò)高時(shí)。將會(huì)拒絕所有信息同步。

這里有倆個(gè)參數(shù)可以進(jìn)行配置調(diào)整:

min-slaves-to-write 2

min-slaves-max-lag 8

這倆個(gè)參數(shù)表示從節(jié)點(diǎn)的數(shù)量就剩余2個(gè),或者從節(jié)點(diǎn)的延遲大于8秒時(shí),主節(jié)點(diǎn)就會(huì)強(qiáng)制關(guān)閉maste功能,停止數(shù)據(jù)同步。

那么主節(jié)點(diǎn)是如何知道從節(jié)點(diǎn)掛掉的數(shù)量和延遲時(shí)間呢! 在心跳機(jī)制里邊slave 會(huì)每隔一秒發(fā)送perlconf ack 這個(gè)指令,這個(gè)指令可攜帶偏移量,也可以攜帶從節(jié)點(diǎn)的延遲時(shí)間和從節(jié)點(diǎn)的數(shù)量。

八、部分復(fù)制的三個(gè)核心要素

1. 服務(wù)器的運(yùn)行id (run id)

我們先看一下這個(gè)run id是什么,執(zhí)行info命令即可看到。在上文中我們查看啟動(dòng)日志信息也可以看到。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

redis在啟動(dòng)時(shí)會(huì)自動(dòng)生成一個(gè)隨機(jī)的id(這里需要注意的是每次啟動(dòng)的id都會(huì)不一樣),是由40個(gè)隨機(jī)的十六進(jìn)制字符串組成,用來(lái)唯一識(shí)別一個(gè)redis節(jié)點(diǎn)。

在主從復(fù)制初次啟動(dòng)時(shí),master會(huì)把自己的runid發(fā)送給slave,slave會(huì)保存master的這個(gè)id,我們可以使用info命令查看

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

當(dāng)斷線重連時(shí),slave把這個(gè)id發(fā)送給master,如果slave保存的runid與master現(xiàn)在的runid相同,master會(huì)嘗試使用部分復(fù)制(這塊能否復(fù)制成功還有一個(gè)因素就是偏移量)。如果slave保存的runid與master現(xiàn)在的runid不同,則會(huì)直接進(jìn)行全量復(fù)制。

2. 復(fù)制積壓緩沖區(qū)

復(fù)制緩沖積壓區(qū)是一個(gè)先進(jìn)先出的隊(duì)列,用戶存儲(chǔ)master收集數(shù)據(jù)的命令記錄。復(fù)制緩沖區(qū)的默認(rèn)存儲(chǔ)空間是1M。

可以在配置文件修改repl-backlog-size 1mb來(lái)控制緩沖區(qū)大小,這個(gè)比例可以根據(jù)自己的服務(wù)器內(nèi)存來(lái)修改,咔咔這邊是預(yù)留出了30%左右。

復(fù)制緩沖區(qū)到底存儲(chǔ)的是什么?

當(dāng)執(zhí)行一個(gè)命令為set name kaka時(shí),我們可以查看持久化文件查看

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

那么復(fù)制積壓緩沖區(qū)就是存儲(chǔ)的aof持久化的數(shù)據(jù),并且以字節(jié)分開(kāi),并且每個(gè)字節(jié)都有自己的偏移量。這個(gè)偏移量也就是復(fù)制偏移量(offset)

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

那為什么會(huì)說(shuō)復(fù)制緩沖積壓區(qū)有可能會(huì)導(dǎo)致全量復(fù)制呢

在命令傳播階段,主節(jié)點(diǎn)會(huì)把收集的數(shù)據(jù)存儲(chǔ)到復(fù)制緩沖區(qū)中,然后在發(fā)送給從節(jié)點(diǎn)。就是這里出現(xiàn)了問(wèn)題,當(dāng)主節(jié)點(diǎn)數(shù)據(jù)量在一瞬間特別大的時(shí)候,超出了復(fù)制緩沖區(qū)的內(nèi)存,就會(huì)有一部分?jǐn)?shù)據(jù)會(huì)被擠出去,從而導(dǎo)致主節(jié)點(diǎn)和從節(jié)點(diǎn)的數(shù)據(jù)不一致。從而進(jìn)行全量復(fù)制。如果這個(gè)緩沖區(qū)大小設(shè)置不合理那么很大可能會(huì)造成死循環(huán),從節(jié)點(diǎn)就會(huì)一直全量復(fù)制,清空數(shù)據(jù),全量復(fù)制。

3. 復(fù)制偏移量(offset)

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

主節(jié)點(diǎn)復(fù)制偏移量是給從節(jié)點(diǎn)發(fā)送一次記錄一次,從節(jié)點(diǎn)是接收一次記錄一次。

用于同步信息,對(duì)比主節(jié)點(diǎn)和從節(jié)點(diǎn)的差異,當(dāng)slave斷聯(lián)時(shí)恢復(fù)數(shù)據(jù)使用。

這個(gè)值也就是來(lái)自己于復(fù)制緩沖積壓區(qū)里邊的那個(gè)偏移量。

九. 主從復(fù)制常見(jiàn)的問(wèn)題

1. 主節(jié)點(diǎn)重啟問(wèn)題(內(nèi)部?jī)?yōu)化)

當(dāng)主節(jié)點(diǎn)重啟后,runid的值將發(fā)生變化,會(huì)導(dǎo)致所有的從節(jié)點(diǎn)進(jìn)行全量復(fù)制。

這個(gè)問(wèn)題我們無(wú)需考慮,知道系統(tǒng)是怎么優(yōu)化的即可。

在建立完主從復(fù)制后主節(jié)點(diǎn)會(huì)創(chuàng)建master-replid變量,這個(gè)生成的策略跟runid一樣,長(zhǎng)度是41位,runid長(zhǎng)度是40位,然后發(fā)送給從節(jié)點(diǎn)。

在主節(jié)點(diǎn)執(zhí)行shutdown save命令時(shí),進(jìn)行了一次RDB持久化會(huì)把runid 和 offset保存到RDB文件中。可以使用命令redis-check-rdb查看該信息。

寫(xiě)給大忙人的Redis主從復(fù)制,花費(fèi)五分鐘讓你面試不尷尬

 

主節(jié)點(diǎn)重啟后加載RDB文件,將文件中的repl-id 和repl-offset加載到內(nèi)存中。縱使讓所有從節(jié)點(diǎn)認(rèn)為還是之前的主節(jié)點(diǎn)。

2. 從節(jié)點(diǎn)網(wǎng)絡(luò)中斷偏移量越界導(dǎo)致全量復(fù)制

由于網(wǎng)絡(luò)環(huán)境不佳,從節(jié)點(diǎn)網(wǎng)絡(luò)中斷。復(fù)制積壓緩沖區(qū)內(nèi)存過(guò)小導(dǎo)致數(shù)據(jù)溢出,伴隨著從節(jié)點(diǎn)偏移量越界,導(dǎo)致全量復(fù)制。有可能會(huì)導(dǎo)致反復(fù)的全量復(fù)制。

解決方案:修改復(fù)制積壓緩沖區(qū)的大小:repl-backlog-size

設(shè)置建議:測(cè)試主節(jié)點(diǎn)連接從節(jié)點(diǎn)的時(shí)間,獲取主節(jié)點(diǎn)每秒平均產(chǎn)生的命令總量write_size_per_second

復(fù)制緩沖區(qū)空間設(shè)置 = 2 * 主從連接時(shí)間 * 主節(jié)點(diǎn)每秒產(chǎn)生的數(shù)據(jù)總量

3. 頻繁的網(wǎng)絡(luò)中斷

由于主節(jié)點(diǎn)的cpu占用過(guò)高,或者從節(jié)點(diǎn)頻繁連接。出現(xiàn)這種情況造成的結(jié)果就是主節(jié)點(diǎn)各種資源被嚴(yán)重占用,其中包括但不限于緩沖區(qū),寬帶,連接等。

為什么會(huì)出現(xiàn)主節(jié)點(diǎn)資源被嚴(yán)重占用?

在心跳機(jī)制中,從節(jié)點(diǎn)每秒會(huì)發(fā)送一個(gè)指令replconf ack指令到主節(jié)點(diǎn)。 從節(jié)點(diǎn)執(zhí)行了慢查詢,占用大量的cpu 主節(jié)點(diǎn)每秒調(diào)用復(fù)制定時(shí)函數(shù)replicationCron,然后從節(jié)點(diǎn)長(zhǎng)時(shí)間沒(méi)有相應(yīng)。

解決方案:

設(shè)置從節(jié)點(diǎn)超時(shí)釋放

設(shè)置參數(shù):repl-timeout

這個(gè)參數(shù)默認(rèn)為60秒。超過(guò)60秒,釋放slave。

4. 數(shù)據(jù)不一致問(wèn)題

由于網(wǎng)絡(luò)因素,多個(gè)從節(jié)點(diǎn)的數(shù)據(jù)會(huì)不一致。這個(gè)因素是沒(méi)有辦法避免的。

關(guān)于這個(gè)問(wèn)題給出倆個(gè)解決方案:

第一個(gè)數(shù)據(jù)需要高度一致配置一臺(tái)redis服務(wù)器,讀寫(xiě)都用一臺(tái)服務(wù)器,這種方式僅限于少量數(shù)據(jù),并且數(shù)據(jù)需高度一致。

第二個(gè)監(jiān)控主從節(jié)點(diǎn)的偏移量,如果從節(jié)點(diǎn)的延遲過(guò)大,暫時(shí)屏蔽客戶端對(duì)該從節(jié)點(diǎn)的訪問(wèn)。設(shè)置參數(shù)為slave-serve-stale-data yes|no。 這個(gè)參數(shù)一但設(shè)置就只能響應(yīng)info slaveof等少數(shù)命令。

5. 從節(jié)點(diǎn)故障

這個(gè)問(wèn)題直接在客戶端維護(hù)一個(gè)可用節(jié)點(diǎn)列表,當(dāng)從節(jié)點(diǎn)故障時(shí),切換到其他節(jié)點(diǎn)進(jìn)行工作,這個(gè)問(wèn)題在后邊集群會(huì)說(shuō)到。

十. 總結(jié)

本文主要講解了什么是主從復(fù)制、主從復(fù)制工作的三大階段以及工作流程、部分復(fù)制的三大核心。命令傳播階段的心跳機(jī)制。最后說(shuō)明了主從復(fù)制常見(jiàn)問(wèn)題

 

分享到:
標(biāo)簽:Redis
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定