Redis進階實踐之十 Redis主從複製的集羣模式html
1、引言
Redis的基本數據類型,高級特性,與Lua腳本的整合等相關知識點都學完了,說是學完了,只是完成了當前的學習計劃,在之後的時間還需繼續深刻研究和學習。從今天開始來說一下有關Redis的集羣模式,Redis有三種集羣模式,第一個就是主從模式,第二種「哨兵」模式,第三種是Cluster集羣模式,第三種的集羣模式是在Redis 3.x之後的版本才增長進來的,咱們今天就來講一下Redis第一種集羣模式:主從集羣模式。
2、配置操做
實現主從複製(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角色便可知道是主服務或從服務。
一、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
二、Linux系統上的Redis服務作主服務節點,Windows系統上的Redis服務作從服務節點(設置完成,可是主節點不能鏈接,master_link_status:down,該問題還沒解決)redis
//主節點服務: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 紅色字體,就是問題所在,目前本身能力有限,還未解決
效果截圖以下:
windows
有誰能夠解決問題的,請給我留言,不勝感謝,我本身也會繼續研究的
3、主從模式的配置
下面是我使用的配置,須要修改的配置項我寫了出來,沒有更改的配置項就是用默認值,就不會寫出來:
一、######Master config
1.一、### NETWORK服務器
bind 192.168.127.128 port 6379 timeout 30 # Client 端空閒斷開鏈接的時間 daemonize yes #默認值是no,把值修改成yes,之後臺模式運行
1.二、### GENERAL網絡
logfile /root/application/program/redis-tool/logs/redis.log #日誌文件的位置
1.三、### SNAPSHOTTING 設置:架構
dir /root/application/program/redis-tool/datas #SNAPSHOTTING文件的路徑
1.四、### APPEND ONLY MODE 設置app
appendonly yes #默認值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改爲Yes,使用AOF增量持久化的方式 appendfsync always
二、###### Slave Config
2.一、### NETWORK運維
bind 192.168.127.129 port 6379 timeout 30 # Client 端空閒斷開鏈接的時間 daemonize yes #默認值是no,把值修改成yes,之後臺模式運行
2.二、### GENERAL
logfile /root/application/program/redis/logs/redis.log #日誌文件的位置
2.三、### SNAPSHOTTING 設置:
dir /root/application/program/redis/datas #SNAPSHOTTING文件的路徑
2.四、### REPLICATION 設置:
slaveof 192.168.127.128 6379 slave-serve-stale-data no #若是slave 沒法與master 同步,設置成slave不可讀,方便監控腳本發現問題。
2.五、### APPEND ONLY MODE 設置:
appendonly yes #默認值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改爲Yes,使用AOF增量持久化的方式 appendfsync always
三、用redis-cli bgsave 命令天天凌晨一次持久化一次master redis上的數據,並CP到其它備份服務器上。
四、用redis-cli bgrewriteaof 命令每半小時持久化一次 slave redis上的數據,並CP到其它備份服務器上。
五、寫個腳本 ,按期get master和slave上的key,看兩個是否同步,若是沒有同步,及時報警。
4、主從模式的優缺點
一、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】、支持主從複製,主機會自動將數據同步到從機,能夠進行讀寫分離。
二、Redis的Replication的缺點:
1】、Redis不具有自動容錯和恢復功能,主機從機的宕機都會致使前端部分讀寫請求失敗,須要等待機器重啓或者手動切換前端的IP才能恢復。
2】、主機宕機,宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,下降了系統的可用性。
3】、Redis的主從複製採用全量複製,複製過程當中主機會fork出一個子進程對內存作一份快照,並將子進程的內存快照保存爲文件發送給從機,這一過程須要確保主機有足夠多的空餘內存。若快照文件較大,對集羣的服務能力會產生較大的影響,並且複製過程是在從機新加入集羣或者從機和主機網絡斷開重連時都會進行,也就是網絡波動都會形成主機和從機間的一次全量的數據複製,這對實際的系統運營形成了不小的麻煩。
4】、Redis較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜。爲避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源形成了很大的浪費。
4、結束
今天就寫到這裏了,其實redis的主從模式很簡單,在實際的生產環境中是不多使用的,我也不建議在實際的生產環境中使用主從模式來提供系統的高可用性,之因此不建議使用都是由它的缺點形成的,在數據量很是大的狀況,或者對系統的高可用性要求很高的狀況下,主從模式也是不穩定的。雖然這個模式很簡單,可是這個模式是其餘模式的基礎,因此必須深入的理解,對其餘模式的學習纔會有幫助做用。
天下國家,可均也;爵祿,可辭也;白刃,可蹈也;中庸不可能也