Redis 主從同步

一、Redis 主從同步介紹

Redis 是一個開源的內存資料庫,用 C 語言編寫,支持多種數據結構,如字元串、哈希表、列表等。Redis 使用非同步 IO,在內存中存儲數據,非常適用於緩存和實時數據分析等場景。Redis 的主從同步機制是實現高可用架構的重要組成部分。

Redis 主從同步,一般指一主多從的同步模式,其中主節點負責寫入數據,從節點負責讀取數據並保持和主節點數據的同步。在這種模式下,主節點將寫入數據同步到所有從節點,從而實現數據的備份、讀取負載均衡和故障切換等功能。

Redis 的主從同步採用非同步複製方式,從節點會定期發送同步請求給主節點,主節點在接收到同步請求後會將當前的數據快照和寫入操作非同步推送到從節點。從節點會先接收到全量同步,之後再接收到增量同步,從而把自己的數據與主節點的數據保持同步。

二、Redis 主從同步配置

在 Redis 中,實現主從同步需要進行一些配置。首先,需要在主節點和從節點之間建立連接,然後在主節點上進行配置,啟用主從同步功能,設置從節點的 IP 和埠號。

具體的配置步驟如下:

# 在主節點上配置
slaveof master_ip master_port

# 在從節點上配置
# 如果主節點和從節點不在同一台機器上,需要設置主節點的 IP 和埠號
# 如果主節點和從節點在同一台機器上,則不需要設置
replicaof master_ip master_port

其中,slaveof 命令用於在主節點上配置從節點,replicaof 命令用於在從節點上配置主節點。在配置完成後,從節點會自動連接到主節點,並開始數據同步。

三、Redis 主從同步實現原理

Redis 的主從同步實現依賴於複製和命令傳播兩個模塊。

複製模塊

複製模塊由同步源和同步目標兩個部分組成,同步源即主節點,同步目標即從節點。同步源在接收到同步請求後,會將當前執行的寫命令內容和參數進行序列化,並發送給同步目標,從而實現數據的同步。

// 同步請求處理實現
void syncCommand(client *c) {
    // 序列化當前執行的寫命令並發送給同步目標
    replicationFeedSlaves(c->db->id, &c->argv, c->argc);
    c->flags |= CLIENT_MASTER_FORCE_REPLY;
    addReply(c, shared.ok);
}

命令傳播模塊

當主節點執行寫入命令時,需要將命令發送給所有從節點進行同步。消息的發送有兩種方式:非同步複製和主節點判斷從節點已經收到的可靠複製。

在非同步複製方式中,主節點將命令發送給所有從節點,並返回結果。在寫入數據前,主節點會將寫操作添加到寫命令 AOF(append-only file)文件中,從節點會定期讀取 AOF 文件,從而保持和主節點數據的一致性。

// AOF 文件寫操作實現
int flushAppendOnlyFile(int force) {
    ...
    if (server.aof_selected_db->dirty == 0) {
        ...
        return C_OK;
    }
    // 將 AOF 文件和複製緩存中的內容發送給所有從節點
    feedSlaves(ALL_SLAVES,server.delCommand,c->db->id,c->argv,c->argc,"del",OBJ_SHARED_INTEGERS[2]->ptr);
    ...
    // 將寫操作添加到 AOF 文件中
    addReply(c,shared.ok);
    writeCommandsVectorLenToFile(c->db->id,c->argv,c->argc);
    ...
}

在可靠複製方式中,主節點根據從節點的複製緩衝區中保存的 offset 和 ACK 信息來判斷哪些命令已經被從節點接收並執行。主節點會等待從節點的 ACK 信息後,再執行後續操作。

// 可靠複製方式實現
void syncWithMaster(void) {
    while(1) {
        // 讀取主節點發送的命令並執行
        if (syncReadLine(reply,buf,PROTO_REPLY_CHUNK_BYTES,maxlen,&rlen) == -1) goto cleanup;
        if (rlen == 0) goto cleanup;
        if (buf[0] == '-') {
            // 命令出錯,中止同步
            ...
        } else if (buf[0] == '+') {
            // 命令執行成功,繼續同步
            ...
        } else if (buf[0] == '*') {
            // 命令包含多個回復,解析後繼續同步
            ...
        } else if (buf[0] == '$') {
            // 命令結果為 BulkString 類型,解析後繼續同步
            ...
        } else if (buf[0] == ':') {
            // 命令結果為 Integer 類型,解析後繼續同步
            ...
        }
        // 發送 ACK 信息給主節點
        if (write(sfd,"+",1) != 1) goto cleanup;
    }
}

四、Redis 主從同步流程

Redis 主從同步流程可以分為全量同步和增量同步兩個階段。

全量同步

全量同步也叫 initial sync,是主從節點第一次進行同步時使用的同步方式。全量同步會在從節點啟動時自動觸發,主節點會將當前的數據快照和寫命令推送給從節點,從節點會接收到全量同步數據並進行載入,之後再接收增量同步。

具體的全量同步流程如下:

  1. 從節點請求主節點進行全量同步
  2.     # 在從節點上執行
        SLAVEOF master_ip master_port
        
  3. 主節點返回 RDB 快照文件
  4.     # 主節點發送 RDB 快照文件
        $redis-benchmark -t set -n 100000 -r 100000 -D redis-master
        
  5. 從節點載入 RDB 快照文件,並接收增量同步

增量同步

增量同步也叫 partial sync,是在全量同步完成後進行的同步方式。增量同步會在主節點執行寫入操作後,將寫入操作推送給所有從節點,從節點接收到寫入操作後進行同步。

具體的增量同步流程如下:

  1. 從節點連接主節點,並請求進行數據同步
  2.     # 在從節點上執行
        SLAVEOF master_ip master_port
        
  3. 主節點接收到同步請求,並推送寫入命令給所有從節點
  4.     # 主節點推送命令給所有從節點
        SET key value
        
  5. 從節點接收到命令並執行

五、Redis 主從同步優化

為了提高 Redis 主從同步的效率和穩定性,我們可以進行一些優化。

優化複製緩衝區

為了避免從節點處理速度低於主節點的寫入速度,導致從節點複製緩衝區積壓過多,我們可以擴大從節點複製緩衝區的大小。

# 在從節點上配置
repl_backlog_size size

優化 AOF 緩衝區

為了避免從節點讀取 AOF 文件時,因為 AOF 緩衝區寫滿而阻塞,導致數據同步失敗,我們可以啟用 AOF 重寫機制,定期對 AOF 文件進行重寫。

# 在主節點上配置
auto-aof-rewrite-percentage percentage
auto-aof-rewrite-min-size size

啟用故障轉移機制

在主從同步環境下,如果主節點出現故障,則需要從節點接替主節點成為新的主節點。為了實現自動切換,我們可以啟用 Redis 的 Sentinel(哨兵)機制。

# 在主節點和從節點上啟用 Sentinel
sentinel monitor master_name master_ip master_port num_slaves

六、總結

Redis 主從同步是實現高可用的必要手段,在多節點環境下具有重要意義。掌握 Redis 主從同步的配置、實現原理和優化策略,可以提高系統的穩定性和性能。

原創文章,作者:TJND,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/142168.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TJND的頭像TJND
上一篇 2024-10-10 09:25
下一篇 2024-10-10 09:25

相關推薦

  • 在CentOS上安裝Redis

    Redis是一款非關係型資料庫,它支持多種數據結構,包括字元串、哈希、列表、集合、有序集合等。Redis運行內存內並且支持數據持久化,它還可以應用於緩存、消息隊列等場景。本文將介紹…

    編程 2025-04-28
  • 解析spring.redis.cluster.max-redirects參數

    本文將圍繞spring.redis.cluster.max-redirects參數進行詳細闡述,從多個方面解讀它的意義與作用,並給出相應的代碼示例。 一、基礎概念 在介紹sprin…

    編程 2025-04-27
  • Redis Bitmap用法介紹

    Redis是一款高性能的內存資料庫,支持多種數據類型,其中之一便是bitmap。Redis bitmap(點陣圖)是一種用二進位位來表示元素是否在集合中的數據結構。由於使用了二進位位…

    編程 2025-04-27
  • 使用yum安裝redis

    一、什麼是redis? Redis是一種開源的基於key-value存儲的NoSQL資料庫,它支持多種數據結構的存儲,例如字元串、哈希、列表、集合以及有序集合等。同時,Redis還…

    編程 2025-04-25
  • Linux Redis 重啟

    一、概述 Redis 是一款高性能的 NoSQL 資料庫,常用於各種應用場景的數據緩存、消息隊列、實時數據分析等等。在使用 Redis 過程中,如果出現了某些問題,有時候只需要重啟…

    編程 2025-04-25
  • Ubuntu安裝Redis指南

    一、安裝步驟 1、查看Ubuntu是否已安裝Redis,如果已安裝,則卸載Redis。 sudo apt-get remove redis-server 2、安裝Redis——命令…

    編程 2025-04-25
  • 深入解析Redis內存淘汰策略

    Redis是一個高性能鍵值資料庫,由於其快速、穩定和易於使用,它已經成為很多應用程序中不可或缺的一部分。在使用Redis時,我們需要考慮內存管理問題。Redis內存淘汰策略是如何工…

    編程 2025-04-25
  • Redis MSET完全指南

    一、MSET簡介 Redis是一個高性能的開源緩存軟體,被稱作NoSQL資料庫。其中,MSET是Redis中的一種命令,可以同時設置多個Key-Value對。如果KeyValue已…

    編程 2025-04-25
  • Redis樂觀鎖詳解

    一、樂觀鎖概述 樂觀鎖是一種並發控制機制,它假定在數據變更時不會有衝突發生,因此不會像悲觀鎖一樣在操作時先加鎖。 在Redis中,樂觀鎖常用於多線程、多用戶同時操作同一個數據的場景…

    編程 2025-04-25
  • Redis的作用

    一、緩存 Redis最常見的用途是作為緩存。所謂緩存,就是將頻繁讀取、但不經常修改的數據存儲在內存中,用戶請求數據時優先從內存中讀取,可大幅提升數據訪問效率。Redis的數據結構特…

    編程 2025-04-24

發表回復

登錄後才能評論