redis复制_Redis复制
redis復制
本文是我們學院課程的一部分,標題為Redis NoSQL鍵值存儲 。
這是Redis的速成課程。 您將學習如何安裝Redis和啟動服務器。 此外,您還會在Redis命令行上亂七八糟。 接下來是更高級的主題,例如復制,分片和集群,同時還介紹了Redis與Spring Data的集成。 在這里查看 !
目錄
1.簡介 2.在Redis中復制 3.在Redis中配置基本復制 4.驗證復制是否有效 5.在運行時配置復制 6.高級復制配置1.簡介
復制是任何面向數據的解決方案的一個非常重要的功能:復雜的關系數據庫或簡單的鍵/值存儲。 復制使您可以將數據的許多副本分布在許多節點(服務器),數據中心和/或地理區域中。
復制是可靠的,可水平擴展和容錯的系統的基礎:一旦一個數據節點(服務器)發生故障,另一個就準備好服務具有故障節點的(大部分)最新數據的查詢或請求。 更不用說能夠在主節點和從節點(只讀副本)之間有效地拆分寫入和讀取操作的功能。 一些有趣的軟件系統模式基于此類決策,例如CQRS (命令查詢責任分離)和復制緩存解決方案。
基本上有兩個主要的復制類:
- Master – Master (或Active – Active )和
- Master – Slave (或Active – Passive )。
盡管Master – Master是自動故障轉移的最佳選擇,但它非常復雜,只有很少的數據解決方案。 在撰寫本文時,Redis 2.8.4僅支持Master – Slave復制。
2.在Redis中復制
本部分的內容基于出色的Redis文檔[1] 。 如前所述,Redis支持Master – Slave復制,該復制允許從服務器成為主服務器的精確副本。
有關Redis復制的一些事實:
- Redis使用異步復制
- Redis主服務器可以有多個從服務器
- Redis從站可以接受來自其他從站的連接(級聯復制)
- Redis復制在主服務器端無阻塞:當一個或多個從服務器執行初始同步時,主服務器將繼續處理查詢
- 可以將Redis復制配置為在從屬端無阻塞:在從屬端執行初始同步時,它可以使用舊版本的數據集處理查詢(請參閱Advanced Replication Configuration , slave-serve-stale-data設置)
在幾個建議的用例中,Redis復制可能非常方便。 首先,它可以用于具有多個從屬服務器以進行只讀查詢或僅用于數據冗余。 其次,也可以使用復制來避免主服務器將整個數據集寫入磁盤:從服務器可以配置為定期這樣做。
另外,Redis 2.8中最近的一項非常重要的增強功能是:主服務器和從服務器通常能夠繼續復制過程,而無需在復制鏈接斷開后進行完全重新同步。 實際上,這意味著,如果在主服務器和從服務器之間發生網絡分區,則從服務器可以稍后通過獲取丟失的更改集而不是整個數據集來追趕主服務器。
3.在Redis中配置基本復制
從站(或副本)配置非常簡單,基本形式只需要在redis.conf文件中設置單個參數slaveof :主IP地址和端口。 值得一提的是,默認情況下,Redis從站以只讀模式運行。 此行為由配置文件redis.conf的slave-read-only選項redis.conf ,可以在從屬運行時使用CONFIG SET命令更改(請參考本教程的第2部分 : Redis命令–使用Redis命令行 ) 。 只讀從站將拒絕所有寫命令。
反過來,非只讀從設備將接受寫命令。 請注意,以這種方式寫入從站的數據是短暫的,當從站和主站重新同步或重新啟動從站時,這些數據將消失。
為了在實踐中了解Redis復制配置有多么容易,我們將配置一個主服務器和兩個從屬服務器(副本)。 一個從屬服務器(副本)將具有默認的只讀模式(在下面的圖片中用綠色標記),而另一個從屬服務器(副本)將被配置為支持寫操作,以便我們可以實際看到發生了什么。
圖1. Redis主從拓撲
對于主服務器和從服務器,我們將使用Redis發行版中的配置模板redis.conf(請參閱本教程的第1部分 , Redis安裝–如何安裝Redis )。
并使用以下配置啟動Redis服務器:
redis-server redis-master.conf圖2. Redis主服務器啟動
并將以下配置設置添加到redis-slave1.conf (我們假設Redis master的主機名是master ):
slaveof master 6379然后使用此配置啟動Redis服務器,將默認端口覆蓋為6380 :
redis-server redis-slave1.conf --port 6380啟動后,從站(副本)立即與主站同步(如下圖所示)。
圖3. Redis從站(副本)1已啟動(默認情況下處于只讀模式),并立即與master同步
并將以下配置設置添加到redis-slave2.conf (我們假設Redis master的主機名是master ):
slaveof master 6379將slave-read-only從yes (默認)更改為no ,從而有效地允許寫入。
slave-read-only no最后使用此配置啟動Redis服務器,將默認端口替換為6381 :
redis-server redis-slave2.conf --port 6381啟動后,從站(副本)立即與主站同步(如下圖所示)。
圖4. Redis從屬服務器(副本)2已啟動(讀寫模式)并立即與主服務器同步
此時,我們有了一個拓撲,其中連接了一個Redis主服務器和兩個Redis從屬服務器(副本)。
4.驗證復制是否有效
有兩種簡單的技術可以確認Redis復制是否按預期工作。 最簡單的方法是在主服務器上SET一些密鑰,然后在每個從服務器上對此密鑰發出GET命令以查看它是否已復制。
圖5.在主節點上設置密鑰mykey
圖6a
圖6b。 在兩個從節點上獲取密鑰mykey并驗證是否復制了主節點上的更改
嘗試在從站1上發出任何寫命令都會導致錯誤,因為它是在只讀模式下配置的(如下圖所示)。
圖7.只讀從屬服務器( slave1 )上的SET命令返回錯誤
因此,在從機2上發出任何寫命令都是合法的,但是一旦從機與主機重新同步,所有這些臨時數據都將消失。
圖8.接受讀寫從設備( slave2 )上的SET命令
5.在運行時配置復制
如果您已經在運行多個獨立的Redis服務器,則借助Redis運行時配置功能,可以配置主從復制而無需重新啟動其中的一個。 為了在現場進行演示,我們將在端口6390上運行常規Redis實例,然后使其成為另一個Redis實例( master )的從屬。 因此,讓我們來看看獨立實例:
redis-server --port 6390圖9.在端口6390上運行獨立Redis實例
現在,讓我們使用redis-cli連接到該實例,并使用SLAVEOF命令( [2] ),使該實例成為正在運行的master實例的從屬(副本)。
圖10.使獨立Redis實例成為從屬(副本)
實例通過使用完全同步立即與主服務器同步(如下圖所示)。
圖11.獨立Redis實例成為從屬(副本),并與主實例進行完全重新同步
也可以同時使用CONFIG SET命令( [3] )將從站的默認只讀模式更改為讀寫模式。
圖12.將slave的默認只讀模式更改為讀寫
在任何時候,都可以使用CONFIG GET命令查詢當前配置設置。 以下示例檢索slave-read-only設置,以確保將其值更改為“ yes ”。
圖13.查詢從站的只讀模式配置設置
6.高級復制配置
除了我們的基本示例外,還有很多設置在實詞場景中非常有用。 在本節中,將詳細介紹其中的大部分內容,以指出如何使復制更加健壯。
僅當當前至少有N個從屬服務器連接到Redis主服務器時,才可以將其配置為接受寫入命令(但是無法確保從屬服務器實際收到了給定的寫入操作,僅在不足夠的情況下限制丟失寫入操作的暴露窗口從站可用)具有指定的秒數。
配置設置支持最小數量的從屬設備( min-slaves-to-write ),該min-slaves-to-write的延遲不大于最大秒數( slaves-max-lag )。 如果不滿足這些條件,則主機將返回一個錯誤,并且將不接受寫入。
| 設置 | min-slaves-to-write <從站數量> |
| 描述 | 設置<奴隸數>,為了執行寫命令,應該連接該奴隸數。 <奴隸數>奴隸必須處于“在線”狀態。 將該值設置為0將禁用此功能。 |
| 默認值 | 默認情況下, min-slaves-to-write設置為0(禁用功能) |
| 例 | min-slaves-to-write 3 |
表格1
| 設置 | min-slaves-max-lag <秒數> |
| 描述 | 以秒為單位設置必須小于或等于指定值的延遲。 它是根據從從站收到的最后一次ping計算得出的(通常每秒發送一次)。 將該值設置為0將禁用該功能。 |
| 默認值 | 默認情況下, min-slaves-max-lag設置為10 |
| 例 | min-slaves-max-lag 10 |
表2
如果主服務器受密碼保護(使用requirepass配置指令),則可以在開始復制同步過程之前告訴從服務器進行身份驗證,否則主服務器將拒絕從服務器請求。
| 設置 | 大師認證 |
| 描述 | 配置用于與主服務器進行身份驗證的密碼 |
| 默認值 | 已注釋掉(無身份驗證) |
| 例 | masterauth mysectetpassword |
表3
當從屬服務器失去與主服務器的連接或復制仍在進行時,從屬服務器可以通過兩種不同的方式進行操作:
- 如果slave-serve-stale-data設置為“ yes ”(默認設置),slave仍將回復客戶端請求,可能包含過期數據,或者如果這是第一次同步,則數據集可能為空
- 如果slave-serve-stale-data設置為“ no ”,則slave將對所有類型的命令( “ INFO ( [4]” )和SLAVEOF ( [2] )進行答復,并顯示錯誤“ 與主機進行同步 ”。
| 設置 | slave-save-stale-data是| 沒有 |
| 描述 | 配置從站失去與主站的連接時的行為 |
| 默認值 | 默認情況下, slave-serve-stale-data設置為yes |
| 例 | slave-serve-stale-data是 |
表4
從站以預定義的間隔將PING發送到服務器。 允許使用repl_ping_slave_period選項更改此間隔。
| 設置 | repl-ping-slave-period <秒數> |
| 描述 | 配置從站將PING發送到服務器的頻率 |
| 默認值 | 默認情況下, repl-ping-slave-period設置為10 |
| 例 | repl-ping-slave-period 10 |
表5
可以配置主服務器和從服務器的復制超時(從服務器的角度來看是超時,當從服務器決定主服務器不可用時,從超時的角度來看,超時是從主服務器的角度來看,當主服務器決定從服務器的角度是超時時)不可用):
- 從站的角度來看,在SYNC期間進行批量傳輸I / O
- 從機角度來看主機超時
- 從主機角度來看從機超時
| 設置 | repl-timeout <秒數> |
| 描述 | 配置復制超時。 重要的是要確保該值大于為repl-ping-slave-period指定的值,否則,每當主機和從機之間的通信量較低時,都會檢測到超時。 |
| 默認值 | 默認情況下, repl-timeout設置為60 |
| 例 | repl-timeout 60 |
表6
出于復制目的,Redis通過使用repl-disable-tcp-nodelay選項支持一些底層TCP協議調整。 如果將其設置為“ yes ”,則Redis服務器將使用較少數量的TCP數據包和較少帶寬將數據發送到從屬服務器。 但這會增加數據顯示在從屬端的延遲(對于使用默認配置的Linux內核,此延遲最多為40毫秒)。 激活此設置在非常繁忙的流量條件下或當主從之間的距離很遠時可能會很有用。 默認情況下,它設置為“ no ”,這意味著將減少數據出現在從屬端的延遲,但是將使用更多帶寬進行復制。
| 設置 | repl-disable-tcp-nodelay是| 沒有 |
| 描述 | SYNC后在從屬套接字上禁用/啟用TCP_NODELAY |
| 默認值 | 默認情況下, repl-disable-tcp-nodelay設置為“ no ”(針對低延遲進行了優化) |
| 例 | repl-disable-tcp-nodelay否 |
表7
有兩個配置參數可幫助主服務器管理從屬斷開連接和部分復制:復制積壓大小和積壓緩沖區生存時間。 待辦事項是一個緩沖區,當從站斷開連接一段時間后,該緩沖區會累積從站數據,因此,當從站要再次重新連接時,通常不需要完全重新同步,但是部分重新同步就足夠了(只需將部分數據傳遞給從站即可)斷開連接時錯過)。 復制積壓最大,從服務器可以斷開連接的時間越長,以后就可以執行部分??重新同步。 僅當連接了至少一個從站時,才分配積壓。
| 設置 | repl-backlog-size |
| 描述 | 設置復制積壓大小 |
| 默認值 | 默認情況下, repl-backlog-size is set to “ 1mb ” |
| 例 | repl-backlog-size 1mb |
表8
主機在一段時間內不再連接從機后,積壓的訂單將被釋放。 repl-backlog-ttl選項配置從釋放最后一個從屬服務器開始到釋放待辦事項緩沖區所需的秒數。
| 設置 | repl-backlog-ttl <秒數> |
| 描述 | 設置積壓緩沖區的生存時間,然后再釋放它。 值為0表示從不釋放積壓。 |
| 默認值 | 默認情況下, repl-backlog-ttl設置為“ 3600 ” |
| 例 | repl-backlog-ttl 3600 |
表9
最后,一個非常有趣的設置,即為Redis Sentinel( [5] )使用的從站(副本)分配優先級,以便在主站無法正常工作時選擇要升級為主站的從站。 具有較低優先級編號的從屬服務器更適合提升,例如,如果有三個具有優先級10、100和25的從屬服務器,Redis Sentinel( [5] )將選擇一個具有優先級10(最低的)的從屬服務器。 但是,特殊優先級0表示從屬服務器無法執行主機角色,因此Redis Sentinel( [5] )永遠不會選擇優先級為0的從屬服務器進行升級。
| 設置 | 從屬優先級 <數字> |
| 描述 | 從屬優先級是Redis在INFO輸出中發布的整數。 |
| 默認值 | 默認情況下, slave-priority設置為100 |
| 例 | slave-priority 100 |
表10
Redis Sentinel( [5] )將在本教程的后面進行討論。
| [1] http://redis.io/topics/replication |
| [2] http://redis.io/commands/slaveof |
| [3] http://redis.io/commands/config-set |
| [4] http://redis.io/commands/info |
| [5] http://redis.io/topics/sentinel |
翻譯自: https://www.javacodegeeks.com/2015/09/redis-replication.html
redis復制
總結
以上是生活随笔為你收集整理的redis复制_Redis复制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020最新U盘ExFAT或NTFS格式
- 下一篇: redis分片_Redis分片