標籤:redis 主從複製
關於主從複製
和MySQL的主從一樣,這種結構主要是為了資料冗餘和提示效能。Redis的主從同步是非同步進行的,所以並不會影響主的處理效能。在資料持久化方面,可以把這個任務交給從伺服器來做,這樣可以減小主伺服器的負擔。
在主從結構中,一般把從伺服器設定為唯讀模式,這樣也是為了更好的保持資料一致性。
Redis主從同步有兩種方式,一種是全同步和部分同步,從伺服器第一次(之前從來沒有過)和主伺服器建立串連的時候是進行全同步的,以後會進行部分同步,只有當部分同步不成功時才會進行全同步。不過任何時候從伺服器都可以直接請求全同步。
一般情況下主從都是高頻的部分同步(也稱增量同步處理),也就是第一次全同步後,不出其他意外的話下,主伺服器會把緩衝區的內容同步到從伺服器上。請注意,並不是把資料直接給從伺服器,而是主伺服器把資料先放到自己的記憶體緩衝區,然後從緩衝區給從伺服器。那麼如果主從直接的增量同步處理不成功,將會執行全同步,也就是複製dump.rdb檔案和緩衝區增量資料給從伺服器。
過程是:主伺服器探索資料有寫操作,那麼就把變更記錄寫入緩衝區和所有已串連的從伺服器。
下面來說一下全同步過程:
從伺服器會定期向主伺服器發送PSYNC命令,從伺服器提供master_runnid(希望擷取資料的MASTER的ID資訊)和offset(位移量資訊)資訊,主伺服器接收資訊後會進行驗證,如果兩者都驗證通過就會進行部分同步,如果offset驗證未通過則會進行全同步。
半同步:主伺服器使用從伺服器發來的位移量offset,定位到自己的緩衝區內,然後將增量資料同步到從伺服器上。
全同步:半同步失敗後主伺服器會向從伺服器發送全同步返回資訊,然後調用BGSAVE(Backgroundsave,其實就是執行save命令)指令來建立一個子進程,用於儲存記憶體中的資料到磁碟,也就是將資料寫入RDB檔案中。在開始寫入RDB檔案的那一刻之後的記憶體資料庫變化會繼續在記憶體中發生。
RDB寫入完成後,主伺服器會將RDB檔案傳送給從伺服器,從伺服器把該檔案儲存到磁碟中,然後再載入到從伺服器的記憶體中。載入完成之後,主伺服器會將RDB寫入到從資料庫載入完成這段時間發生的資料變化再通過redis協議的格式發送給從伺服器。
如果有多個從伺服器給主伺服器發送SYNC指令,對於主伺服器來說只會執行一次BGSAVE操作,然後把這個儲存的RDB檔案發給多個從伺服器。
如果同步過程中出現網路中斷,那麼在2.8版本以後的處理方式是並不會像之前版本那樣重新同步所有,而是會進行增量同步處理。
從伺服器為什麼會有master_runid和offset呢?因為從伺服器與主伺服器斷開前會暫存這些資訊,目的也是為了後面的資料同步需要。
環境說明
按照之前的步驟安裝2台伺服器:
| Redis01 |
172.16.100.10 |
| Redis02 |
172.16.100.20 |
開啟防火牆連接埠和關閉seLinux
開啟6379連接埠
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/83/4C/wKiom1dv5RLS4mfeAADUNpcsLBA267.jpg-wh_500x0-wm_3-wmp_4-s_775245447.jpg" title="1.jpg" alt="wKiom1dv5RLS4mfeAADUNpcsLBA267.jpg-wh_50" />
關閉selinux
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/83/4B/wKioL1dv5RnitAcfAACkjWDivZ0128.jpg-wh_500x0-wm_3-wmp_4-s_771839037.jpg" title="2.jpg" alt="wKioL1dv5RnitAcfAACkjWDivZ0128.jpg-wh_50" />
然後重啟iptables服務。
修改設定檔
修改主伺服器設定檔,如果不要求輸入密碼驗證則無需修改此檔案,修改後請重新啟動Redis服務
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/83/4C/wKiom1dv5V3yLZohAADOZCadLwE041.jpg-wh_500x0-wm_3-wmp_4-s_807254622.jpg" title="3.jpg" alt="wKiom1dv5V3yLZohAADOZCadLwE041.jpg-wh_50" />
修改從伺服器設定檔,
找到slaveof欄位,如果主伺服器有密碼驗證,則要配置相同的密碼,如下如:
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/83/4B/wKioL1dv5ZzRNB84AAD-Y4hYySU743.jpg-wh_500x0-wm_3-wmp_4-s_3479071749.jpg" title="4.jpg" alt="wKioL1dv5ZzRNB84AAD-Y4hYySU743.jpg-wh_50" />
驗證主從複製
在主上設定一個索引值資料
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/83/4C/wKiom1dv5eHiBSPsAAAqym-9nn0394.jpg-wh_500x0-wm_3-wmp_4-s_1182764526.jpg" title="5.jpg" alt="wKiom1dv5eHiBSPsAAAqym-9nn0394.jpg-wh_50" />
在從上擷取一個索引值資料
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/83/4C/wKioL1dv5eqA_MEaAAAoMrEWUxM063.jpg-wh_500x0-wm_3-wmp_4-s_861575786.jpg" title="6.jpg" alt="wKioL1dv5eqA_MEaAAAoMrEWUxM063.jpg-wh_50" />
通過info查看串連資訊,在主上執行下面的命令:
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/83/4C/wKiom1dv5fLzxSKXAAAZHBhiSxY494.jpg-wh_500x0-wm_3-wmp_4-s_3963703395.jpg" title="7.jpg" alt="wKiom1dv5fLzxSKXAAAZHBhiSxY494.jpg-wh_50" />
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/83/4C/wKioL1dv5frAjGQjAABbdJf_ejg221.jpg-wh_500x0-wm_3-wmp_4-s_1931301989.jpg" title="8.jpg" alt="wKioL1dv5frAjGQjAABbdJf_ejg221.jpg-wh_50" />
不停機切換
Redis的主從模式中的主與從沒有什麼區別,唯一的區別就是在這個模式下從伺服器是不允許被寫入資料的,看:
我在從伺服器上做一個SET操作,提示如下
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/83/4D/wKiom1dv5oPQV1v2AAAoj3R_ThI313.jpg-wh_500x0-wm_3-wmp_4-s_3172528787.jpg" title="1.jpg" alt="wKiom1dv5oPQV1v2AAAoj3R_ThI313.jpg-wh_50" />
其實主從切換就是把從變成主,主變成從。基本步驟如下:
設定從伺服器可寫:
修改設定檔,如:
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/83/4D/wKiom1dv5oqB3UCDAACWtOByeBg840.jpg-wh_500x0-wm_3-wmp_4-s_3503795992.jpg" title="2.jpg" alt="wKiom1dv5oqB3UCDAACWtOByeBg840.jpg-wh_50" />
修改完成後,重啟從伺服器。
修改和重啟從伺服器後,從伺服器依然可以從主伺服器去同步資料,這一點不用擔心。
把應用訪問的IP更換成從伺服器的IP:
這一步忽略,實際上就是業務對資料庫訪問IP的變更。
把從伺服器設定為主伺服器:
在從上執行這個命令
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/83/4C/wKioL1dv5pOz5lbKAAAbNQqlzXQ379.jpg-wh_500x0-wm_3-wmp_4-s_63068319.jpg" title="3.jpg" alt="wKioL1dv5pOz5lbKAAAbNQqlzXQ379.jpg-wh_50" />
上面這個命令是將從伺服器關閉複製功能,將從伺服器作為獨立的主伺服器運行。這個很好理解,就是它不去同步其他的資料庫伺服器了,自己單獨運行,那麼自然就是主伺服器。
上面的命令還有其他用法就是動態切換主伺服器,比如如果我們要臨時讓從伺服器去其他主伺服器去同步資料,可以這樣運行,如:
slaveof MasterIP MasterPort |
注意:假如當前伺服器已經是A伺服器的從伺服器,而你又使用該命令讓當前伺服器成為B伺服器的從伺服器,也就是從B同步資料,那麼當前伺服器將丟棄之前同步的就資料,開始對新的主伺服器進行同步。 這個命令只是臨時生效,臨時覆蓋設定檔中的slaveof設定,重啟後恢複。 |
驗證一下複製是否停止:
在原來的主伺服器上運行info命令,如下顯示:
雖然角色是主,但是SLAVE的串連已經沒有了
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/83/4D/wKiom1dv5vaDOLnpAABB0SABb-I979.jpg-wh_500x0-wm_3-wmp_4-s_114007627.jpg" title="4.jpg" alt="wKiom1dv5vaDOLnpAABB0SABb-I979.jpg-wh_50" />
我們做一個SET操作,然後在原來的從伺服器(Redis02)上執行一下GET操作,看看是否還可以擷取數值:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/83/4C/wKioL1dv5v6w9DraAAA5HpujskY627.jpg-wh_500x0-wm_3-wmp_4-s_459869346.jpg" title="5.jpg" alt="wKioL1dv5v6w9DraAAA5HpujskY627.jpg-wh_50" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/83/4D/wKiom1dv5wXxxDD8AAAkjjeY_d4109.jpg-wh_500x0-wm_3-wmp_4-s_936721214.jpg" title="6.jpg" alt="wKiom1dv5wXxxDD8AAAkjjeY_d4109.jpg-wh_50" />
可以看到無法擷取。
在Redis02上執行info命令看看結果:
顯示它自己已經變成主了。
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/83/4C/wKioL1dv5w2CspTJAABAS0mT0wE388.jpg-wh_500x0-wm_3-wmp_4-s_3269861062.jpg" title="7.jpg" alt="wKioL1dv5w2CspTJAABAS0mT0wE388.jpg-wh_50" />
通過上述的操作我們就可以替換原來的主伺服器或者在主伺服器失敗的時候可以手動切換
本文出自 “小惡魔的家” 部落格,請務必保留此出處http://littledevil.blog.51cto.com/9445436/1793091
(四)Redis主從複製