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

如何學會在合適的場景使用合適的技術方案,這值得思考。html

因爲本地環境的使用,因此搭建一個本地的Redis集羣,本篇講解Redis主從複製集羣的搭建,使用的平臺是Windows,搭建的思路和Linux上基本一致!
(精讀閱讀本篇可能花費您15分鐘,略讀需5分鐘左右)git

Redis主從複製簡單介紹

爲了使得集羣在一部分節點下線或者沒法與集羣的大多數節點進行通信的狀況下, 仍然能夠正常運做, Redis 集羣對節點使用了主從複製功能: 集羣中的每一個節點都有 1 個至 N 個複製品(replica), 其中一個複製品爲主節點(master), 而其他的 N-1 個複製品爲從節點(slave)。[ 摘自 Redis 集羣中的主從複製 ]github

那麼上面是主從複製呢,簡單的來講就是一個主節點master能夠擁有一個甚至多個從節點的slave,而一個slave又能夠擁有多個slave,如此下去,造成了強大的多級服務器集羣架構。
Master-Slave主從redis

其中主節點以寫爲主(可寫也能夠讀),從節點只能讀不可寫入!【讀寫分離場景】
其中主節點寫入的數據會同步(不是準實時的)到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.能夠用於讀寫分離和容災恢復。windows

Redis主從複製的經常使用的幾種方式

  1. 一主二僕 A(B、C) 一個Master兩個Slave
  2. 薪火相傳(去中心化)A - B - C ,B既是主節點(C的主節點),又是從節點(A的從節點)
  3. 反客爲主(主節點down掉後,手動操做升級從節點爲主節點) & 哨兵模式(主節點down掉後,自動升級從節點爲主節點)

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

Redis主從複製的搭建(一主二僕)

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

Redis For Windows Download
或者
Redis For Windows GitHub服務器

2.下載完成進行解壓

解壓收的目錄以下圖:
Window的Redis解壓圖網絡

3.相關配置操做

(1)複製三份解壓後Redis

我本身本地修改了名稱,複製後文件夾名稱顯示以下:架構

Redis-x64-3.2.100-6379
Redis-x64-3.2.100-6380
Redis-x64-3.2.100-6381

(2)修改redis.windows.conf

6379文件夾,不作修改!

6380文件夾,修改以下:

port 6380

# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379

6381文件夾,修改以下:

port 6381
slaveof 127.0.0.1 6379

我默認你們是知道redis.xx.conf的相關配置的!若是不知道,請看:
Redis學習——redis.conf 配置文件介紹

(3)加入簡單的window腳本,方便快速啓動!

在對應的redis文件夾下面新建

startRedisServer.bat

腳本的內容爲:

@echo off
redis-server.exe redis.windows.conf
@pause

而後在redis文件夾同級的目錄下在新建

start6379.cmd

@echo off
cd Redis-x64-3.2.100-6379
startRedisServer.bat

而後6380和6381和上面操做同樣,操做完成後以下圖:

目錄結構圖

4.啓動測試

啓動規則:先啓動主節點,而後在啓動從節點!

(1)可使用命令啓動

進入相應的文件夾目錄,使用啓動命令:

redis-server.exe

(2)使用腳本啓動

如上面圖片,分別執行start6379.cmd,
start6380.cmd,start6381.cmd。

先啓動Master。使用客戶端登陸,查看信息如圖:

Master啓動後信息

而後啓動6380和6381,而後能夠看到:如圖

Salve啓動

在此查看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"

測試當主節點從新啓動後,從節點的狀態【從節點依然能夠鏈接主節點】:

127.0.0.1:6379> info replication
# 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_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:42
127.0.0.1:6379>

小插曲【反客爲主】
測試當主節點shutdown後,使用slaveof no one 是的6380成爲主節點,可是也只是主節點,沒有任何從節點!:如圖

127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:155
master_link_down_since_seconds:jd
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>
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> info replication
# Replication
role:master
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> set test 11
OK
127.0.0.1:6381> get test
"11"
127.0.0.1:6381>

詳細能夠參考 Redis主從複製 中的內容!

Redis主從複製的原理

第一種介紹

  1. 當設置好slave服務器後,slave會創建和master的鏈接,而後發送sync命令。
  2. Master接到命令啓動後臺的存盤進程,同時收集全部接收到的用於修改數據集命令,在後臺進程執行完畢以後,master將傳送整個數據文件到slave,以完成一次徹底同步。
  3. 全量複製:而slave服務在接收到數據庫文件數據後,將其存盤並加載到內存中。(第一次全量)
  4. 增量複製:Master繼續將新的全部收集到的修改命令依次傳給slave,完成同步。(以後增量)
  5. 可是隻要是從新鏈接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主從複製原理

第三種介紹:

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 集羣可能會丟失已經被執行過的寫命令。

參考文章

Windows下Redis的主從複製

Redis 主從複製(服務集羣)

Redis主從複製

深刻剖析Redis主從複製

附件

若是想直接使用本篇講解使用的主從配置!我已經打包好了 點擊 下載地址 進行下載!

本系列文章:

第一篇:Redis集羣主從複製(一主兩從)搭建配置教程【Windows環境】

第二篇:Redis高可用集羣-哨兵模式(Redis-Sentinel)搭建配置教程【Windows環境】

第三篇:Redis建立高可用集羣教程【Windows環境】



若是您以爲這篇博文對你有幫助,請點個贊,謝謝!


若是帥氣(美麗)、睿智(聰穎),和我同樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!
祝你今天開心愉快!


歡迎訪問個人csdn博客,咱們一同成長!

"無論作什麼,只要堅持下去就會看到不同!在路上,不卑不亢!"

博客首頁http://blog.csdn.net/u010648555

相關文章
相關標籤/搜索