天天看點

Redis叢集主從複制(一主兩從)搭建配置教程【Windows環境】Redis叢集主從複制(一主兩從)搭建配置教程【Windows環境】

Redis叢集主從複制(一主兩從)搭建配置教程【Windows環境】

由于本地環境的使用,是以搭建一個本地的Redis叢集,本篇講解Redis主從複制叢集的搭建,使用的平台是Windows,搭建的思路和Linux上基本一緻! 

(精讀閱讀本篇可能花費您15分鐘,略讀需5分鐘左右)

Redis主從複制簡單介紹

為了使得叢集在一部分節點下線或者無法與叢集的大多數節點進行通訊的情況下, 仍然可以正常運作, Redis 叢集對節點使用了主從複制功能: 叢集中的每個節點都有 1 個至 N 個複制品(replica), 其中一個複制品為主節點(master), 而其餘的 N-1 個複制品為從節點(slave)。[ 摘自 Redis 叢集中的主從複制 ]

那麼上面是主從複制呢,簡單的來說就是一個主節點master可以擁有一個甚至多個從節點的slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級伺服器叢集架構。 

其中主節點以寫為主(可寫也可以讀),從節點隻能讀不可寫入!【讀寫分離場景】 

其中主節點寫入的資料會同步(不是準實時的)到salve上,這樣如果主節點出現故障,資料丢失,則可以通過salve進行恢複。【容災恢複場景,注:因為資料不是實時同步的,可能會存在從salve恢複資料後有資料丢失問題】

綜上:下面是關于redis主從複制的一些特點: 

1.一個master可以有多個slave 

2.除了多個slave連到相同的master外,slave也可以連接配接其他slave形成圖狀結構 

3.主從複制不會阻塞master。也就是說當一個或多個slave與master進行初次同步資料時,master可以繼續處理client發來的請求。相反slave在初次同步資料時則會阻塞不能處理client的請求。 

4.主從複制可以用來提高系統的可伸縮性,我們可以用多個slave 專門用于client的讀請求,比如sort操作可以使用slave來處理。也可以用來做簡單的資料備援 

5.可以在master禁用資料持久化,隻需要注釋掉master 配置檔案中的所有save配置,然後隻在slave上配置資料持久化。 

6.可以用于讀寫分離和容災恢複。

Redis主從複制的常用的幾種方式

一主二仆 A(B、C) 一個Master兩個Slave

薪火相傳(去中心化)A - B - C ,B既是主節點(C的主節點),又是從節點(A的從節點)

反客為主(主節點down掉後,手動操作更新從節點為主節點) & 哨兵模式(主節點down掉後,自動更新從節點為主節點)

本次主要介紹一主二仆,和反客為主的操作,薪火相傳不做介紹。哨兵模式後面專門寫一篇進行介紹!

Redis主從複制的搭建(一主二仆)

1.下載下傳Windows環境的Redis安裝包

Redis For Windows Download 

或者 

Redis For Windows GitHub

2.下載下傳完成進行解壓

解壓收的目錄如下圖: 

3.相關配置操作

(1)複制三份解壓後Redis

我自己本地修改了名稱,複制後檔案夾名稱顯示如下:

Redis-x64-3.2.100-6379

Redis-x64-3.2.100-6380

Redis-x64-3.2.100-6381

1

2

3

4

(2)修改redis.windows.conf

6379檔案夾,不做修改!

6380檔案夾,修改如下:

port 6380

# slaveof <masterip> <masterport>

slaveof 127.0.0.1 6379

5

6381檔案夾,修改如下:

port 6381

我預設大家是知道redis.xx.conf的相關配置的!如果不知道,請看: 

Redis學習——redis.conf 配置檔案介紹

(3)加入簡單的window腳本,友善快速啟動!

在對應的redis檔案夾下面建立

startRedisServer.bat

腳本的内容為:

@echo off

redis-server.exe redis.windows.conf

@pause

然後在redis檔案夾同級的目錄下在建立

start6379.cmd

cd Redis-x64-3.2.100-6379

然後6380和6381和上面操作一樣,操作完成後如下圖:

4.啟動測試

啟動規則:先啟動主節點,然後在啟動從節點!

(1)可以使用指令啟動

進入相應的檔案夾目錄,使用啟動指令:

redis-server.exe

(2)使用腳本啟動

如上面圖檔,分别執行start6379.cmd, 

start6380.cmd,start6381.cmd。

先啟動Master。使用用戶端登入,檢視資訊如圖:

然後啟動6380和6381,然後可以看到:如圖

在此檢視6378的主從複制資訊:如圖

在登入6380和6381的用戶端,檢視節點資訊:如圖

測試讀寫,【主節點可讀可寫,從節點隻能讀不可寫】,如下圖:

測試當主節點shutdown後,從節點的狀态【從節點可讀,從節點也不會更新為主節點】:

127.0.0.1:6381> info replication

# Replication

role:slave

master_host:127.0.0.1

master_port:6379

master_link_status:up

master_last_io_seconds_ago:1

master_sync_in_progress:0

slave_repl_offset:15

slave_priority:100

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

127.0.0.1:6381>

127.0.0.1:6381> get hello

"world"

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

測試當主節點重新啟動後,從節點的狀态【從節點依然可以連接配接主節點】:

127.0.0.1:6379> info replication

role:master

connected_slaves:2

slave0:ip=127.0.0.1,port=6380,state=online,offset=43,lag=0

slave1:ip=127.0.0.1,port=6381,state=online,offset=43,lag=0

master_repl_offset:43

repl_backlog_active:1

repl_backlog_first_byte_offset:2

repl_backlog_histlen:42

127.0.0.1:6379>

小插曲【反客為主】 

測試當主節點shutdown後,使用slaveof no one 是的6380成為主節點,但是也隻是主節點,沒有任何從節點!:如圖

master_link_status:down

master_last_io_seconds_ago:-1

slave_repl_offset:155

master_link_down_since_seconds:jd

127.0.0.1:6381> slave no one

(error) ERR unknown command 'slave'

127.0.0.1:6381> slaveof no one

OK

127.0.0.1:6381> set test 11

127.0.0.1:6381> get test

"11"

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

詳細可以參考 Redis主從複制 中的内容!

Redis主從複制的原理

第一種介紹

當設定好slave伺服器後,slave會建立和master的連接配接,然後發送sync指令。

Master接到指令啟動背景的存盤程序,同時收集所有接收到的用于修改資料集指令,在背景程序執行完畢之後,master将傳送整個資料檔案到slave,以完成一次完全同步。

全量複制:而slave服務在接收到資料庫檔案資料後,将其存盤并加載到記憶體中。(第一次全量)

增量複制:Master繼續将新的所有收集到的修改指令依次傳給slave,完成同步。(之後增量)

但是隻要是重新連接配接master,一次完全同步(全量複制)将被自動執行。

當設定好slave伺服器後,slave會建立和master的連接配接,然後發送sync指令。無論是第一次同步建立的連接配接還是連接配接斷開後的重新連接配接,master都會啟動一個背景程序,将資料庫快照儲存到檔案中,同時master主程序會開始收集新的寫指令并緩存起來。背景程序完成寫檔案 後,master就發送檔案給slave,slave将檔案儲存到磁盤上,然後加載到記憶體恢複資料庫快照到slave上。接着master就會把緩存的指令轉發給slave。而且後續master收到的寫指令都會通過開始建立的連接配接發送給slave。從master到slave的同步資料的指令和從 client發送的指令使用相同的協定格式。當master和slave的連接配接斷開時slave可以自動重建立立連接配接。如果master同時收到多個 slave發來的同步連接配接指令,隻會使用啟動一個程序來寫資料庫鏡像,然後發送給所有slave。

第二種介紹:

圖檔内容來源網絡:

第三種介紹:

Redis 主從同步有兩種方式(或者所兩個階段):全同步和部分同步。 

主從剛剛連接配接的時候,進行全同步;全同步結束後,進行部分同步。當然,如果有需要,Slave 在任何時候都可以發起全同步。Redis 政策是,無論如何,首先會嘗試進行部分同步,如不成功,要求從機進行全同步,并啟動 BGSAVE……BGSAVE 結束後,傳輸 RDB 檔案;如果成功,允許從機進行部分同步,并傳輸積壓空間中的資料。 

Redis主從複制(一主兩從/一主多從)的分析

IO劇增 

每次slave斷開以後(無論是主動斷開,還是網路故障)再連接配接master都要将master全部dump出來rdb,在aof,即同步的過程都要重新執行一遍;是以要記住多台slave不要一下都啟動起來,否則master可能IO劇增(間隔1-2分)

複制延遲 

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

可用性不高 

當有主節點發生異常情況,就會導緻不能寫入,導緻業務出錯![解決方法是可以使用Redis-Sentinel模式,詳情見系列文章第二篇]

注意: 

Redis 叢集不保證資料的強一緻性(strong consistency)Redis 叢集的一緻性保證(guarantee): 在特定條件下, Redis 叢集可能會丢失已經被執行過的寫指令。

--------------------- 

作者:每天都在變得更好的阿飛 

來源:CSDN 

原文:

https://blog.csdn.net/u010648555/article/details/79427606

版權聲明:本文為部落客原創文章,轉載請附上博文連結!