Redis入門(八) Redis的主從複製

2022-09-08 03:39:11 字數 4079 閱讀 3861

redis入門(八)——redis的主從複製

目錄1.redis主從複製簡介

當系統的訪問量越來越大,一台redis伺服器已經支撐不了如此大的訪問量時,為了解決這個問題,通常會採取的一種方式是主從架構master/sl**e,master 以寫為主,sl**e 以讀為主,master 主節點更新後根據配置,自動同步到從機sl**e 節點。這就是常說的redis的主從複製讀寫分離。redis的主從架構除了可以實現讀寫分離,在主機發生故障時還可以實現主從轉換,從而保障系統具有一定的容災能力。

根據系統的需要,主從結構可使用一主一從、一主多從、以及樹狀結構。具體結構如下圖

2.如何配置

配置檔案修改:

如何開啟多個redis服務:首先將redis.conf 配置檔案複製三份,通過修改埠分別模擬三颱redis伺服器。

開啟守護程序:daemonize yes

pid檔案名字:設定pidfile。例如:/var/run/redis_6379.pid,此時當redis作為守護程序執行的時候,它會把 pid 預設寫到 /var/redis/run/redis_6379.pid 檔案裡面

指定埠號:三個埠號分別為6379、6380、6381。

指定log檔案:配置logfile。三個檔案中分別配置為,6379.log、,6380.log、6381.log。

指定dump檔案名字:配置dbfilename

設定主從關係:

redis的主從關係在從機上配置。在從機上使用如下命令配置主從關係和檢視主從關係:

配置主從:sl**eof 主庫ip 主庫埠號

檢視主從關係:info replicati

使當前資料庫停止與其他資料庫的同步,轉成主資料庫:sl**eof no one

從機:

主機:

注意:每次sl**e與master斷開後都需要重新連線,除非配置redis.conf檔案。

3.測試主從複製

全量複製:

從機執行 sl**eof 命令後,會將主節點所有的資料全部複製過來。每次通過sl**eof設定主從都會進行一次全量複製,後面就是增量複製。

增量複製:

主機寫入新的資料,從機會複製乙份。

讀寫分離:

下面我們在從機寫入新的資料

可見,此時從機是唯讀的。在redis的配置檔案中, sl**e-read-only 的配置可配置從機的豬肚狀態。若將該配置項設定為no,從機也可以寫入資料。

此時,新寫入到從機的資料有複製到主機嗎?由圖可見,從機的資料並沒有複製到主機。

主機宕機:

此時從機的主從狀態如何:

由此可見,主機宕機,從機仍為從機。若主機再次正常工作,此時原主機仍恢復主機的角色。若在主機回覆之前我們在6380上執行sl**eof no one命令設定新的主機。帶主機恢復後,此時主機並不會再次成為主機,而此時的主機還是6380。此時原主機仍然為主機,但是不再和其他兩個機器有主從關係。

4.複製原理

redis的複製功能分為同步(sync)和命令傳播(command propagate)兩個操作。

新版同步(2.8以上):

當從節點發出 sl**eof 命令,要求從伺服器複製主伺服器資料,建立連線的過程如下:

當sl**e接收到sl**eof後,將masterhost設定主機的節點。

redis在後台建立sl**e到master的連線,連線建立後,sl**e呼叫syncwithmaster與master建立同步。

sl**e向master非同步傳送ping,master回覆pong。

從機接收到主伺服器返回pong,確認可以和主機器通訊後,向機務器傳送」psync ? -1」命令,申請執行初次的全量同步

收到 sync 命令的主機執行 bgs**e 命令,在後台生成乙個 rdb 檔案,master在執行 bgs**e 命令期間會使用乙個緩衝區記錄這期間所有寫命令,以保證主機執行 bgs**e 命令期間的所有寫命令也可以同步給sl**e。

主機執行 bgs**e 命令完畢後,主機會將 bgs**e 命令生成的 rdb 檔案傳送給從機,從機接收此 rdb 檔案並匯入該rdb檔案。

主機傳送rdb 檔案完成後,會將緩衝區的所有寫命令也傳送給從伺服器,從伺服器執行相應命令。

命令傳播:

當同步操作完成之後,主伺服器會進行相應的修改命令,這時候從伺服器和主伺服器狀態就會不一致。

為了讓主伺服器和從伺服器保持狀態一致,主伺服器需要對從伺服器執行命令傳播操作,主伺服器會將自己的寫命令傳送給從伺服器執行。從伺服器執行相應的命令之後,主從伺服器狀態繼續保持一致。

注意:

全量複製:而sl**e服務在接收到資料庫檔案資料後,將其存檔並載入到記憶體中。在redis2.8之後,主從斷開重連後會根據斷開之前最新的命令偏移量進行增量複製。

增量複製:master繼續將新的所有收集到的修改命令依次傳給sl**e,完成同步。

為何是rdb而不是aof:

rdb檔案中記錄的是redis資料庫中所有的key-value對,這種持久方式在任意時刻開啟都能保證持久化的資料是主機中完整資料,也就是說該方式可以保證主從機資料一致。與此相對的aof持久化方式則是將所有寫命令計入到檔案中,這種檔案保留的資料只是從開啟aof的那一刻開始,開啟之前的資料是無法儲存的,所以複製機制沒有使用aof檔案。

5.哨兵模式

在實際應用中若採取一主多從的模式,當主機宕機後,就沒有主機的角色發揮作用,此時在主機無法工作的時候,有某個從機轉換成主機,承擔主機的工作,這就是哨兵模式。哨兵模式就是監控redis是否按照預期良好地執行(至少是保證主節點是存在的),若一台主機出現問題時,哨兵會自動將該主機下的某乙個從機設定為新的主機,並讓其他從機和新主機建立主從關係。

如何配置:

在配置檔案目錄下新建 sentinel.conf 檔案,名字絕不能錯,然後配置相應內容。

sentinel monitor 被監控資料庫名字(自己起名字) 127.0.0.1 6379 1

上面最後乙個數字1,表示主機掛掉後salve投票看讓誰接替成為主機,得票數多少後成為主

啟動哨兵模式:

redis-sentinel /myredis/sentinel.conf 

上述目錄依照各自的實際情況配置,可能目錄不同

此時主機宕機,兩個從機會進行投票,選出新的主機,(此時可從redis的日誌中看到這些操作)。若主機再次恢復,它會成為新主機下的乙個從機繼續工作。

在我實際工作中接觸到的分布式系統,redis的主從選舉是由zookeeper來完成。切zookeeper在系統中的數目為單數,保證選舉的快速高效。

主從複製的缺點

由於所有的寫操作都是先在master上操作,然後同步更新到sl**e上,所以從master同步到sl**e機器有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,sl**e機器數量的增加也會使這個問題更加嚴重。

redis入門 redis安裝

如果一些同學是要學習redis對於key的操作命令 可以跳過這一篇文章 直接進入 當然要是你想自己搭建redis的服務或者對redis的持久化,主從集群進行一些研究的話,還是建議學習一下怎麼安裝redis,畢竟學習成本不高,簡單!繼續redis安裝篇 二 安裝 go 1.ssh工具把jar包放到li...

redis入門 redis常用的鍵

設定鍵值 set key value set name michael 獲取鍵值 get key get name 獲取制定健的值的序列化版本 dump key dump name 判斷該健是否存在 exists key exists name expire name 3 那麼name健在3秒後過期...

Redis入門到高可用(八) list

key value 結構,value是乙個有序佇列。可進行左邊的新增及彈出,右邊的新增及彈出。可獲取列表的長度,刪除列表中指定元素,獲取列表的子列表,按照索引獲取列表的指定元素。特點 列表有序 可重複 左右兩邊插入彈出。rpush 將乙個或多個值value插入到列表key的表尾 最右邊 lpush ...