常見面試題-Redis 主從復制原理以及痛點

Redis 主從復制如何同步數據呢?

參考文章:https://blog.csdn.net/Seky_fei/article/details/106877329

https://zhuanlan.zhihu.com/p/55532249

https://cloud.tencent.com/developer/article/2063597

https://xie.infoq.cn/article/4cffee02a2a12c2450412fa21

在 Redis2.8 之后,進行主從同步使用 psync 命令,在 2.8 之前使用 sync 命令,sync 在斷線情況下會進行全量復制,效率很低,因此使用 psync 命令進行改進,具備了 全量同步部分同步 的功能

psync 命令格式如下:

# runid 為 master 的身份 id
# offset 是從節點同步命令的偏移量
psync [runid] [offset]

那么在從節點第一次同步主節點數據時,會向主節點發送 psync ? -1 命令,那么 master 收到命令后,匹配 runid,如果匹配成功,會使用 bgsave 生成 RDB 文件快照,并將 RDB 文件發送給 slave,slave 在收到 RDB 快照后將數據載入

如果從節點是斷線之后重新連接上主節點,那么在同步數據時,會向主節點發送 psync runid offset ,那么 master 在收到命令之后,如果 runid 匹配成功,會判斷 offset 這個偏移量與 master 本機的數據緩存的偏移量相差是否超過了 復制積壓緩沖區 的大小,如果超過了,說明 slave 斷線時間太長了,master 的 復制積壓緩沖區 中的數據已經和 slave 的數據不連續了,因此進行全量復制;否則,就進行增量復制,將 slave 斷線期間沒有收到的數據給發送一下就可以了

主節點在接收到命令時,如何保存命令并將命令增量復制給從節點?

master 在接收命令時,將命令傳遞給 slave 的同時,也會將命令存放到 復制積壓緩沖區,并且記錄當前積壓隊列中存放命令的偏移量 offset,當 slave 重連時,master 會根據 slave 傳的 offset 和自己最新命令的 offset 進行比較,如果相差的大小超過 復制積壓緩沖區 的大小,就直接進行全量復制;否則,就增量復制

復制積壓緩沖區 其實就是一個環形的循環隊列,默認大小為 1MB,該緩沖區大小越大,允許 slave 斷線的時間就越長

#設置復制積壓緩沖區大小
repl-backlog-size 1mb

Redis 4.0 PSYNC2.0

在 Redis2.8 之后,使用 psync runid offset 來實現增量同步,但是如果發生了主從切換,那么新的 master 的 runid 和 offset 都會發生變化,因此還是需要全量復制

在 Redis4.0 的 PSYNC2.0 中優化了這個問題,即使發生了主從切換,如果條件允許,也可以進行增量同步

那么在 PSYNC2.0 中,舍棄了 runid 的概念,使用 replidreplid2 來代替,并且 replid2 和 second_replid_offset 是一對:

  • 對 master 來說,replid 就是自己的復制 id,沒有發生主從切換之前,replid2 為空,發生主從切換之后,新的 master 的 replid2 是舊 master 的 replid
  • 對 slave 來說,replid 保存的是自己當前正在同步的 master 的 replidreplid2 保存的舊 master 的 replid

second_replid_offset 記錄了上一次復制的主庫的 offset

psync2.0中如何判斷增量復制?

從節點向主節點發送同步請求,那么主節點需要判斷兩個東西:

  1. 從節點的 offset 是否在 復制積壓緩沖區

  2. 判斷復制歷史是否一樣

    判斷復制歷史首先 master 要判斷 replid 是否一致,也就是從節點的 replid 和 master 的 replid2 相同,如果一致(表明新的主節點和從節點之前都是復制的同一個主節點),再來判斷這個 offset 是否在上一次的 second_replid_offset,如果也在的話,就可以進行增量同步

下邊這個例子說明一下為什么 offset 要在上一次的 second_replid_offset 中:

在這里插入圖片描述

比如一主一從機器來說,master1 和 slave1,master1 中寫入兩條數據:

# master1  
lpush A B
lpush A C

我們假設一條數據偏移量為 10,那么在 master1 中插入兩條數據,master1 的 offset = 20,此時 master1 和 slave1 主從復制,slave1 在復制完第一條數據之后,也就是 lpush A B 之后,failover 后 slave1 變為新的 master,我們先稱原 slave1 為 master2,原 master1 為 slave2

那么 master2 又會接收新的請求,假如在 master2 中寫入如下數據:

# master2
lpush A D

那么此時 master2 中也有兩條數據了,如上圖,在發生主從切換之后,master2 和 slave2 的 offset 都是 20,是相同的,但是他們兩個能進行增量復制嗎?

肯定不可以,雖然他們的 offset 是相同的,但是他的復制上下文已經變了,原來的 slave 進行主從復制是基于

lpush A B
lpush A C

這個上下文來進行復制的,那么在主從切換之后,新的主庫寫入了新的數據,新主庫的上下文已經變為了:

lpush A B
lpush A D

和原來主庫的上下文都不同了,那么只單純比較 offset 是沒有意義的,所以需要拿 offset 和 second_replid_offset 進行比較

PSYNC-AOF【擴展內容】

詳細參考:Redis 主從復制演進歷程與百度智能云的實踐

百度智能云提出了 - PSYNC-AOF 方案

在 Redis 的主從復制中存在的問題,首先就是內存,Redis 的數據都存儲在內存中,Backlog(復制積壓緩沖區) 也在內存中,那么內存容量是有限的,當主從連接斷開重連后,從庫在主庫的 Backlog 中查找數據,因為 Backlog 容量是有限的,所以查找數據也有限,那么如果主從斷連時間過長的話,就在 Backlog 中找不到對應的數據,就需要進行全量復制了

那么 PSYNC-AOF 方案中,將 AOF 的內容和 Backlog 內容保持一致,主從斷連后,從庫去主庫的 Backlog 中查找數據,那么如果沒有找到的話,嘗試從 AOF 里找,那么通過 RDB 文件作為基準,AOF 作為增量,就可以實現一個更大的 復制積壓緩沖區 ,從而可以應對更長的網絡延遲以及網絡斷開。

總結:總之,主從復制的痛點在于如果主從連接斷開時間過長,或者發生主從切換,會導致全量復制,全量復制很傷,所以優化主從數據同步的目的就是盡可能地避免全量復制

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160310.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160310.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LongAccumulator

原子操作之LongAccumulator 和LongAdder的區別在于,LongAdder是在Cell里面只能做加減操作,不能乘除,而LongAccumulator就可以定義乘除操作。原理和LongAdder都是一樣的,一個Base和一個Cells數組。 原文跳轉地址

pyqt5的組合式部件制作(四)

對組合式部件的制作又改進了一版,組合式部件的子部件不再需要單獨“提升為”,如果在模板文件的提升部件窗口內選擇了“全局包含”,那么只需要在模板文件和應用文件中直接復制粘貼即可,部件的應用更為簡便。如下圖:按住…

2023秋招上岸必備軟件測試面試題

1、請結合你熟悉的項目,介紹一下你是怎么做測試的? -首先要自己熟悉項目,熟悉項目的需求、項目組織架構、項目研發接口等 -功能 接口 自動化 性能 是怎么處理的? -第一步: 進行需求分析,需求評審&#…

【Delphi】開發IOS 程序,TLabel 中英文字對齊(水平),一行代碼解決顯示對齊問題!

目錄 一、問題現象: 二、解決方案(一行代碼解決ios對齊問題): 三、解決后效果: 四、后記: 一、問題現象: 在用 Delphi 開發ios程序時,使用TLabel控件顯示,會出現中英…

WiFi 6的數據在發送端分片和在接收端重組的理解

802.11ax是WiFi 6標準,其引入了一些新的特性和技術來提升無線網絡的性能,其中包括幀聚合和幀分片。以下是它們的詳細處理流程: 1. 幀聚合 幀聚合是一種提高傳輸效率的技術,它允許多個數據幀被聚合到一起,然后作為一個…

layui(2.8.18)生成驗證碼

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>登入</title><meta name"renderer" content"webkit"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1&quo…

Go 工具鏈詳解(七):模塊緩存清理工具

go mod 緩存 在 Golang 中&#xff0c;模塊是對一組版本化的包的集合的描述。Go 1.11 版本引入了模塊支持&#xff0c;通過 go mod 命令提供了對模塊的管理。Go 模塊的一個重要特性是依賴管理&#xff0c;可以清晰地定義項目所依賴的模塊及對應的版本&#xff0c;并確保代碼使…

電磁優化的并行空間映射方法

空間映射(SM)是一種公認的加速電磁優化的方法。現有的SM方法大多基于順序計算機制。本文提出了一種用于電磁優化的并行SM方法。在該方法中&#xff0c;每次迭代開發的代理模型被訓練以同時匹配多個點的精細模型。多點訓練和SM使代理模型在比標準SM更大的鄰域內有效。本文提出的…

[補題記錄] Complete the Permutation(貪心、set)

URL&#xff1a;https://codeforces.com/group/OcmZ7weh45/contest/487583/problem/J 目錄 Problem/題意 Thought/思路 Code/代碼 Problem/題意 給出一個長度為 N 的序列&#xff0c;其中的元素都是奇數。 現在要求在兩個奇數之間插入一個偶數&#xff0c;使得這三個數遞增…

信息壓縮模型在自然語言處理中的應用和探討

信息壓縮模型在自然語言處理中的應用和探討 摘要:正文:結論:附錄:摘要: 隨著人工智能和深度學習的發展,自然語言處理(NLP)在信息處理中的角色變得越來越重要。然而,海量的自然語言數據為信息處理帶來了挑戰——更多的信息通常意味著更高的處理成本,并可能導致效率降低。為…

一個工具讓你明白“萬丈高樓平地起”,拒絕重復造輪子!

大家在公司工作當中是不是很多時間裝環境很麻煩&#xff0c;一個項目要上線了&#xff0c;開始網上搜了一邊又一遍的環境搭建教程&#xff1f;等到下一個項目要上線了&#xff0c;又上網上搜了一邊又一遍的環境搭建教程。關鍵天花亂墜的互聯網&#xff0c;找不到很靠譜的呀。有…

數組的移動

設計程序&#xff0c;給定包含N個整數的數組array&#xff0c;實現操作&#xff1a;前面各個整數順序向后移動m個位置&#xff0c;最后的m個整數移動到最前面。方法&#xff1a;void move(int array[], int n,int m ) 輸入要求 第一行輸入兩個整數N(1<N<1e6)和m(0<m&…

webpack 配置

1、基礎配置 // node js核心模塊 const path require(path) // 插件是需要引入使用的 const ESLintPlugin require(eslint-webpack-plugin) // 自動生成index.html const HtmlWebpackPlugin require(html-webpack-plugin); // 將css文件單獨打包&#xff0c;在index.html中…

如何做好項目管理?年薪百萬項目大佬一直在用這11張圖

大家好&#xff0c;我是老原。 日常工作中&#xff0c;我們會遇到各種大大小小的工作項目&#xff0c;如何能讓項目保質保量的完成&#xff0c;是我們項目經理的目標。 項目管理的流程可以說是由一系列的子過程組成的&#xff0c;它是一個循序漸進的過程&#xff0c;所以不能…

python數字

目錄 整數&#xff08;如&#xff0c;2、4、20 &#xff09;的類型是 int&#xff0c;帶小數&#xff08;如&#xff0c;5.0、1.6 &#xff09;的類型是 float。 Python 用 ** 運算符計算乘方 1&#xff1a; 等號&#xff08;&#xff09;用于給變量賦值。 解釋器像一個簡單…

進程API

linux下進程的api forkwaitexec fork #include <stdio.h> #include <stdlib.h> #include <unistd.h>/* linux環境運行 子進程并不是完全拷貝了父進程。具體來說&#xff0c;雖然它擁有自己的 地址空間&#xff08;即擁有自己的私有內存&#xff09;、寄存器…

【Delphi】使用TWebBrowser執行JavaScript命令傳入JSON參數執行出錯解決方案

目錄 一、問題背景&#xff1a; 二、實際示例&#xff1a; 三、解決方案&#xff1a; 1. Delphi 代碼&#xff1a; 2. javaScript代碼&#xff1a; 一、問題背景&#xff1a; 在用Delphi開發程序&#xff0c;無論是移動端還是PC端&#xff0c;都可以很方便的使用TWebBrows…

Postman如何使用(一):導入導出和發送請求查看響應

一、Postman如何導入導出打包的應用 在Postman中導入導出我們的 測試數據包 和 工作環境 非常的方便&#xff1a; 導出數據包的方法如下&#xff1a; 如果你想學習自動化測試&#xff0c;我這邊給你推薦一套視頻&#xff0c;這個視頻可以說是B站播放全網第一的自動化測試教程…

七天.NET 8操作SQLite入門到實戰 - 第三天SQLite快速入門

前言 今天我們花費一個小時快速了解SQLite數據類型、SQLite常用命令和語法。 七天.NET 8操作SQLite入門到實戰詳細教程 第一天 SQLite 簡介第二天 在 Windows 上配置 SQLite環境 EasySQLite項目源碼地址 GitHub地址&#xff1a;https://github.com/YSGStudyHards/EasySQLite&…