自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:Redis 主從復(fù)制時網(wǎng)絡(luò)開小差了怎么整?

存儲 存儲軟件 Redis
這期我們繼續(xù)回到之前的 Redis 話題。今天主要講的是主從復(fù)制數(shù)據(jù)一致性相關(guān)以及面對網(wǎng)絡(luò)中斷如何進(jìn)行數(shù)據(jù)同步的問題。

[[352345]]

本文轉(zhuǎn)載自微信公眾號「IT界農(nóng)民工」,作者萊烏。轉(zhuǎn)載本文請聯(lián)系IT界農(nóng)民工公眾號。  

上周因為實(shí)在太忙就認(rèn)認(rèn)真真寫了一篇水文,吹了一下自己過去的經(jīng)歷,反響竟然超出了我的預(yù)期,并且后臺還有讀者留言表示想看續(xù)集的。哈哈,果然大家還是對水文更有熱情。

這期我們繼續(xù)回到之前的 Redis 話題。今天主要講的是主從復(fù)制數(shù)據(jù)一致性相關(guān)以及面對網(wǎng)絡(luò)中斷如何進(jìn)行數(shù)據(jù)同步的問題。

不 BB 了,直接上鐘吧!

 

- 思維導(dǎo)圖 -

主從模式配置

對于 Redis 主從大家可能并不陌生,但是配置的話日常工作中并不會經(jīng)常操作。在這里簡單介紹下主從的相關(guān)配置。

1、主從模式

 

Redis 中設(shè)置主從的方式很簡單,通常有兩種:

  • 通過在配置文件 redis.conf 中設(shè)置 slaveof 方式(永久);
  • 直接在客戶端執(zhí)行 slaveof ip port 的方式(臨時);

2、主-從-從模式

 

對于主-從-從的模式來說,配置也與上邊的操作類似,在這里就不多贅述了。

主從一致性原理

了解了主從配置后,下面就要進(jìn)入正題了。

在主從中,通常的操作是主庫用來寫入數(shù)據(jù),從庫用來讀取數(shù)據(jù)。這樣的好處是避免了所有的請求壓力都打在了主庫上,同時系統(tǒng)的伸縮性也得到了很大的提升。

 

但是問題就來了,讀從庫時的數(shù)據(jù)要與主庫保持一致,那就需要主庫的數(shù)據(jù)在寫入后同步到從庫中。如何保持主庫與從庫的數(shù)據(jù)一致性,當(dāng)有多個從庫時,又如何做到呢?

1、全量復(fù)制

這是第一次同步時所發(fā)生的傳遞關(guān)系。看名字就知道,主庫第一次就毫無保留的把所有數(shù)據(jù)都傳遞給了從庫。

我們先來看下它們是如何發(fā)生第一次關(guān)系的(就知道你會想歪)。

 

圖中的同步流程已經(jīng)很清晰了,總共分為三部分:

(1)主從節(jié)點(diǎn)建立聯(lián)系

當(dāng)從節(jié)點(diǎn)與主節(jié)點(diǎn)第一次建立聯(lián)系時,從節(jié)點(diǎn)會向主節(jié)點(diǎn)發(fā)送 psync 命令,表示要進(jìn)行數(shù)據(jù)同步。

正如你看到的 psync 命令后會帶有兩個參數(shù):一個是 runID,一個是偏移量 offset。

  • runID:每個Redis實(shí)例生成的隨機(jī)且唯一的ID,在這里表示的是主節(jié)點(diǎn)的ID。
  • offset:復(fù)制偏移量。

在圖中第一次復(fù)制時因為不知道主庫ID和偏移量,因此用“?”和“-1”分別來表示runID 和 offset。

當(dāng)主節(jié)點(diǎn)接收到 psync 命令后,會使用 FULLSYNC命令向從節(jié)點(diǎn)發(fā)送 runID 及offset 兩個參數(shù)。從節(jié)點(diǎn)將其信息保存下來。

到這里關(guān)系算是建立了下來。

(2)主節(jié)點(diǎn)同步RDB文件

RDB文件,這是一個老面孔了,持久化時會用到的二進(jìn)制文件。在這里起著主從數(shù)據(jù)同步的作用,也就是說主從同步是依賴 RDB 文件來實(shí)現(xiàn)的。

從節(jié)點(diǎn)接收到 RDB 文件后,在本地完成數(shù)據(jù)加載,算是完成了主從同步。

到這里你有沒有發(fā)現(xiàn)什么問題?

我們回想下 RDB 文件是如何生成的。在持久化那篇文章里,我們介紹過,父進(jìn)程 fork 了一個子進(jìn)程來進(jìn)行生成 RDB 文件。父進(jìn)程并不阻塞接收處理客戶端的命令。

 

那么問題就產(chǎn)生了,當(dāng)主節(jié)點(diǎn)把 RDB 文件發(fā)送給從節(jié)點(diǎn)時,主節(jié)點(diǎn)同時接收的命令又該如何來處理?

(3)主節(jié)點(diǎn)同步緩沖區(qū)命令

這一步就是來解決 RDB 文件生成后,父進(jìn)程又接收到寫命令同步的問題的。

為了保證主從節(jié)點(diǎn)數(shù)據(jù)的一致性,主節(jié)點(diǎn)中會使用緩沖區(qū)來記錄 RDB 文件生成后接收到的寫操作命令。在 RDB 文件發(fā)送完成后會把緩沖區(qū)的命令發(fā)送給從節(jié)點(diǎn)來執(zhí)行。

到這里,主從節(jié)點(diǎn)的數(shù)據(jù)同步算是完成了。

2、級聯(lián)操作

我們再來回顧下整個同步流程,從建立關(guān)系,生成 RDB 文件,傳輸給從節(jié)點(diǎn)到最后緩沖區(qū)命令發(fā)送給從節(jié)點(diǎn)。這是一個從節(jié)點(diǎn)與主節(jié)點(diǎn)同步的完整流程。

那么我們再來思考:當(dāng)有多個從節(jié)點(diǎn),也就是一主多從時,第一次連接時都要進(jìn)行全量復(fù)制。但是在生成 RDB 文件時,父進(jìn)程 fork 子進(jìn)程時可能會出現(xiàn)阻塞,同時在傳輸 RDB 文件時也會占用帶寬,浪費(fèi)資源。

這種情況我們該如何來解決呢?

不知道你對文章開頭的 主-從-從模式是否還有印象。通過對從節(jié)點(diǎn)再建立從節(jié)點(diǎn)。同步數(shù)據(jù)時從級聯(lián)的從節(jié)點(diǎn)上進(jìn)行同步,從而就減輕了主節(jié)點(diǎn)的壓力。

網(wǎng)絡(luò)開小差了

上面的流程我們已經(jīng)知道了正常情況下主從節(jié)點(diǎn)的復(fù)制過程了,但是當(dāng)網(wǎng)絡(luò)中斷導(dǎo)致主從連接失敗等異常情況下,主從同步又是如何來進(jìn)行的?

在這里要提到一個增量復(fù)制的名詞,與全量復(fù)制不同的是,它是根據(jù)主從節(jié)點(diǎn)的偏移量來進(jìn)行數(shù)據(jù)同步的。

什么意思呢?

還記得在全量復(fù)制里我們所提到過的緩沖區(qū)嗎?就是用來存儲生成 RDB 文件后的寫命令的,這里我們稱為緩沖區(qū)A。主從節(jié)點(diǎn)斷開連接后,除了會將后續(xù)接收到的寫命令寫入緩沖區(qū)A的同時,還會寫入到另一個緩沖區(qū)B里。

在緩沖區(qū)B里,主從節(jié)點(diǎn)分別會維護(hù)一個偏移量 offset。剛開始時,主節(jié)點(diǎn)的寫位置與從節(jié)點(diǎn)的讀位置在同一起點(diǎn),隨著主節(jié)點(diǎn)的不斷寫入,偏移量也會逐漸增大。同樣地,從節(jié)點(diǎn)復(fù)制完后偏移量也在不斷增加。


 

 

當(dāng)網(wǎng)絡(luò)斷開連接時,從節(jié)點(diǎn)不再進(jìn)行同步,此時主節(jié)點(diǎn)由于不斷接收新的寫操作的偏移量會大于從節(jié)點(diǎn)的偏移量。當(dāng)連接恢復(fù)時,從節(jié)點(diǎn)向主節(jié)點(diǎn)發(fā)送帶有偏移量的psync 命令,主節(jié)點(diǎn)根據(jù)偏移量來進(jìn)行比較,只需將未同步寫命令同步給從節(jié)點(diǎn)即可。

總結(jié)

主從一致性原理

  • 從節(jié)點(diǎn)第一次進(jìn)行連接時,主節(jié)點(diǎn)會生成 RDB 文件進(jìn)行全量復(fù)制,同時將新寫入的命令存儲進(jìn)緩沖區(qū),發(fā)送給從節(jié)點(diǎn),從而保證數(shù)據(jù)一致性;
  • 為了減少數(shù)據(jù)同步給主節(jié)點(diǎn)帶來的壓力,可以通過從節(jié)點(diǎn)級聯(lián)的方式進(jìn)行同步。

網(wǎng)絡(luò)開小差了

 

  • 網(wǎng)絡(luò)斷連重新連接后,主從節(jié)點(diǎn)通過分別維護(hù)的偏移量來同步寫命令。

 

責(zé)任編輯:武曉燕 來源: IT界農(nóng)民工
相關(guān)推薦

2024-11-15 15:27:09

2025-02-28 00:00:00

2025-04-07 00:00:00

MySQL數(shù)據(jù)庫服務(wù)器

2024-10-12 16:25:12

2023-12-29 13:45:00

2024-02-21 16:42:00

2020-09-24 06:39:58

MySQL數(shù)據(jù)庫

2023-09-24 14:32:15

2018-08-14 05:21:43

路由器網(wǎng)絡(luò)運(yùn)維網(wǎng)絡(luò)

2023-05-11 08:08:18

MySQL主從復(fù)制

2014-01-23 18:48:13

聯(lián)想IBMX86服務(wù)器

2009-05-21 15:13:08

2023-03-15 08:30:37

2023-12-25 08:02:09

2023-03-19 22:38:12

邏輯復(fù)制PostgreSQL

2023-03-19 11:53:27

2024-07-04 17:22:23

2022-12-20 08:46:41

MySQL主從復(fù)制

2023-07-03 08:57:45

Master服務(wù)TCP

2021-03-18 10:35:04

MySQL數(shù)據(jù)庫架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號