Redis零基礎筆記之四 -- Redis主從複製的集羣模式

https://www.cnblogs.com/PatrickLiu/p/8426610.html

一、引言

          Redis的基本數據類型,高級特性,與Lua腳本的整合等相關知識點都學完了,說是學完了,只是完成了當前的學習計劃,在以後的時間還需繼續深入研究和學習。從今天開始來講一下有關Redis的集羣模式,Redis有三種集羣模式,第一個就是主從模式,第二種“哨兵”模式,第三種是Cluster集羣模式,第三種的集羣模式是在Redis 3.x以後的版本才增加進來的,我們今天就來說一下Redis第一種集羣模式:主從集羣模式。

二、配置操作

         實現主從複製(Master-Slave Replication)的工作原理:Slave從節點服務啓動並連接到Master之後,它將主動發送一個SYNC命令。Master服務主節點收到同步命令後將啓動後臺存盤進程,同時收集所有接收到的用於修改數據集的命令,在後臺進程執行完畢後,Master將傳送整個數據庫文件到Slave,以完成一次完全同步。而Slave從節點服務在接收到數據庫文件數據之後將其存盤並加載到內存中。此後,Master主節點繼續將所有已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。

        如果Master和Slave之間的鏈接出現斷連現象,Slave可以自動重連Master,但是在連接成功之後,一次完全同步將被自動執行。

       我先介紹一下我的環境,操作系統是Windows 10企業版,Redis有兩個版本,第一版本是以Windows服務形式安裝的Redis服務器,IP地址是:192.168.131.1,端口號:6379,當前沒有設置密碼;第二個版本是在Linux系統下安裝的Redis服務,IP地址是:192.168.127.128,端口號是:6379,當前也沒有設置密碼。今天測試兩個情況,一種情況:Windows系統上的Redis服務做主服務節點,Linux系統上的Redis服務做從服務節點,第二種情況是:Linux系統上的Redis服務做主服務節點,Windows系統上的Redis服務做從服務節點。其他情況就不測試了,同系統之間測試就很容易了,也不會出現什麼問題。

       主從複製配置:

       第一步:修改從節點的配置文件:slaveof <masterip> <masterport>

       第二步:如果設置了密碼,就要設置:masterauth <master-password>

       主從複製的配置很簡單,主要操作從節點的配置文件,主節點不需要任何改動。我們可以使用info查看role角色即可知道是主服務或從服務。


       1、Windows系統上的Redis服務做主服務節點,Linux系統上的Redis服務做從服務節點(測試很順利)

複製代碼

           //主節點服務:192.168.131.1    端口號:6379   Windows系統

           //從節點服務:192.168.127.128  端口號:6379   Linux系統

           //現在主要修改從節點服務Linux系統上的redis.conf配置文件

           slaveof 192.168.131.1 6379

           設置完成:

           //主節點配置信息:
           192.168.131.1:6379>info Replication
           #Replication
           role:master
           connected_slaves:1
           slave0:ip=192.168.131.1,port=6379,state=online,offset=239,lag=1
           master_repl_offset:239
           repl_backlog_active:1
           repl_backlog_size:1048576
           repl_backlog_first_byte_offset:2
           repl_backlog_histlen:238


           //從節點配置信息:
           192.168.127.128:6379>info Replication
           #Replication
           role:slave
           master_host:192.168.131.1
           master_port:6379
           master_link_status:up
           master_last_io_seconds_ago:8
           master_sync_in_progress:0

           slave_repl_offset:253
           slave_priority:100
           slave_read_only:1

           connected_slaves:0

           master_replid:7f2e5cde55803c8b78d26c16f0111695e3c1fb6f8
           master_replid2:000000000000000000000000000000000000000000
           master_repl_offset:253
           second_repl_offset:-1

           repl_backlog_active:1
           repl_backlog_size:1048576
           repl_backlog_first_byte_offset:2
           repl_backlog_histlen:252

複製代碼


       2、Linux系統上的Redis服務做主服務節點,Windows系統上的Redis服務做從服務節點(設置完成,但是主節點不能連接,master_link_status:down,該問題還沒解決)

複製代碼

          //主節點服務:192.168.127.128  端口號:6379  Linux系統

          // 從節點服務:192.168.131.1    端口號:6379  Windows系統

           //現在主要修改從節點服務在Windows系統上的redis.windows.conf配置文件

           slaveof 192.168.127.128 6379
           //如果需要密碼
           //masterauth 123456

           //主節點配置信息:
           192.168.127.128:6379>info Replication
           #Replication
           role:master
           connected_slaves:0
           master_replid:23ed05016a5fdf45e45318281b7f827cbbf75025
           master_replid2:0000000000000000000000000000000000000000
           master_repl_offset:0
           second_repl_offset:-1
           repl_backlog_active:1
           repl_backlog_size:1048576
           repl_backlog_first_byte_offset:1
           repl_backlog_histlen:0


           //從節點配置信息:
           192.168.127.128:6379>info Replication
           #Replication
           role:slave
           master_host:192.168.127.128
           master_port:6379
           master_link_status:down
           master_last_io_seconds_ago:-1
           master_sync_in_progress:0

           slave_repl_offset:1
           master_link_down_since_seconds:jd
           slave_priority:100
           slave_read_only:1

           connected_slaves:0

           repl_backlog_active:0
           repl_backlog_size:1048576
           repl_backlog_first_byte_offset:0
           repl_backlog_histlen:0

複製代碼

Slave從節點日誌顯示爲:

複製代碼

        * Connecting to MASTER 192.168.127.128:6379[11188] 07 Feb 15:33:10.908 

        * MASTER <-> SLAVE sync started[11188] 07 Feb 15:33:10.909 

        * Non blocking connect for SYNC fired the event.[11188] 07 Feb 15:33:10.913 

        * Master replied to PING, replication can continue...[11188] 07 Feb 15:33:10.917 

        * Partial resynchronization not possible (no cached master)[11188] 07 Feb 15:33:10.923 

        * Full resync from master: 0e17ac45471c6a94dadec46f993c14ee6dc33726:0[11188] 07 Feb 15:33:10.980 

        * MASTER <-> SLAVE sync: receiving 193 bytes from master[11188] 07 Feb 15:33:10.987 

        * MASTER <-> SLAVE sync: Flushing old data[11188] 07 Feb 15:33:10.989 

        * MASTER <-> SLAVE sync: Loading DB in memory[11188] 07 Feb 15:33:10.991 # Can't handle RDB format version 8[11188] 07 Feb 15:33:10.992 

        # Failed trying to load the MASTER synchronization DB from disk[11188] 07 Feb 15:33:11.910 紅色字體,就是問題所在,目前自己能力有限,還未解決

複製代碼

   效果截圖如下:

                 

             有誰可以解決問題的,請給我留言,不勝感謝,我自己也會繼續研究的

三、主從模式的配置

      下面是我使用的配置,需要修改的配置項我寫了出來,沒有更改的配置項就是用默認值,就不會寫出來:

      1、######Master config

         1.1、### NETWORK

複製代碼

                  bind 192.168.127.128

                  port 6379

                  timeout 30  # Client 端空閒斷開連接的時間

                  daemonize yes    #默認值是no,把值修改爲yes,以後臺模式運行

複製代碼


         1.2、### GENERAL

                  logfile /root/application/program/redis-tool/logs/redis.log  #日誌文件的位置


         1.3、### SNAPSHOTTING 設置:

                  dir /root/application/program/redis-tool/datas #SNAPSHOTTING文件的路徑


         1.4、### APPEND ONLY MODE 設置

                  appendonly yes  #默認值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改成Yes,使用AOF增量持久化的方式

                  appendfsync always


      2、###### Slave Config

          2.1、### NETWORK

複製代碼

                   bind 192.168.127.129

                   port 6379

                   timeout 30  # Client 端空閒斷開連接的時間

                   daemonize yes    #默認值是no,把值修改爲yes,以後臺模式運行

複製代碼


          2.2、### GENERAL

                   logfile /root/application/program/redis/logs/redis.log  #日誌文件的位置


          2.3、### SNAPSHOTTING 設置:

                   dir /root/application/program/redis/datas #SNAPSHOTTING文件的路徑


          2.4、### REPLICATION 設置:

                   slaveof 192.168.127.128 6379  

                   slave-serve-stale-data no  #如果slave 無法與master 同步,設置成slave不可讀,方便監控腳本發現問題。


          2.5、### APPEND ONLY MODE 設置:

                   appendonly yes  #默認值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改成Yes,使用AOF增量持久化的方式

                   appendfsync always


      3、用redis-cli bgsave 命令每天凌晨一次持久化一次master redis上的數據,並CP到其它備份服務器上。

      4、用redis-cli bgrewriteaof 命令每半小時持久化一次 slave redis上的數據,並CP到其它備份服務器上。

      5、寫個腳本 ,定期get master和slave上的key,看兩個是否同步,如果沒有同步,及時報警。


四、主從模式的優缺點

          1、Redis的Replication的特點和優點:

                  1】、同一個Master可以同步多個Slaves。

                  2】、Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力。因此我們可以將Redis的Replication架構視爲圖結構。

                  3】、Master Server是以非阻塞的方式爲Slaves提供服務。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求。

                  4】、Slave Server同樣是以非阻塞的方式完成數據同步。在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數據。

                  5】、爲了分載Master的讀操作壓力,Slave服務器可以爲客戶端提供只讀操作的服務,寫服務仍然必須由Master來完成。即便如此,系統的伸縮性還是得到了很大的提高。

                  6】、Master可以將數據保存操作交給Slaves完成,從而避免了在Master中要有獨立的進程來完成此操作。

                  7】、支持主從複製,主機會自動將數據同步到從機,可以進行讀寫分離。

         2、Redis的Replication的缺點:

                1】、Redis不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啓或者手動切換前端的IP才能恢復。

                2】、主機宕機,宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,降低了系統的可用性。

                3】、Redis的主從複製採用全量複製,複製過程中主機會fork出一個子進程對內存做一份快照,並將子進程的內存快照保存爲文件發送給從機,這一過程需要確保主機有足夠多的空餘內存。若快照文件較大,對集羣的服務能力會產生較大的影響,而且複製過程是在從機新加入集羣或者從機和主機網絡斷開重連時都會進行,也就是網絡波動都會造成主機和從機間的一次全量的數據複製,這對實際的系統運營造成了不小的麻煩。

                4】、Redis較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜。爲避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。

四、結束

           今天就寫到這裏了,其實redis的主從模式很簡單,在實際的生產環境中是很少使用的,我也不建議在實際的生產環境中使用主從模式來提供系統的高可用性,之所以不建議使用都是由它的缺點造成的,在數據量非常大的情況,或者對系統的高可用性要求很高的情況下,主從模式也是不穩定的。雖然這個模式很簡單,但是這個模式是其他模式的基礎,所以必須深刻的理解,對其他模式的學習纔會有幫助作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章