構建高性能數據庫緩存之redis主從複製

一、什麼是redis主從複製?

主從複製,當用戶往Master端寫入數據時,通過Redis Sync機制將數據文件發送至SlaveSlave也會執行相同的操作確保數據一致;且實現Redis的主從複製非常簡單。

 

二、redis主從複製特點

1、同一個Master可以擁有多個Slaves

2Master下的Slave還可以接受同一架構中其它slave的鏈接與同步請求,實現數據的級聯複製,即Master->Slave->Slave模式;

3Master以非阻塞的方式同步數據至slave,這將意味着Master會繼續處理一個或多個slave的讀寫請求;

4Slave端同步數據也可以修改爲非阻塞是的方式,當slave在執行新的同步時,它仍可以用舊的數據信息來提供查詢;否則,當slavemaster失去聯繫時,slave會返回一個錯誤給客戶端;

5、主從複製具有可擴展性,即多個slave專門提供只讀查詢與數據的冗餘,Master端專門提供寫操作;

6、通過配置禁用Master數據持久化機制,將其數據持久化操作交給Slaves完成,避免在Master中要有獨立的進程來完成此操作。

 

三、redis主從複製原理

wKiom1Ozz5OThc6NAAGUIzDDlQs366.jpg      當啓動一個Slave進程後,它會向Master發送一個SYNC Command,請求同步連接。無論是第一次連接還是重新連接,Master都會啓動一個後臺進程,將數據快照保存到數據文件中,同時Master會記錄所有修改數據的命令並緩存在數據文件中。後臺進程完成緩存操作後,Master就發送數據文件給SlaveSlave端將數據文件保存到硬盤上,然後將其在加載到內存中,接着Master就會所有修改數據的操作,將其發送給Slave端。若Slave出現故障導致宕機,恢復正常後會自動重新連接,Master收到Slave的連接後,將其完整的數據文件發送給Slave,如果Mater同時收到多個Slave發來的同步請求,Master只會在後臺啓動一個進程保存數據文件,然後將其發送給所有的Slave,確保Slave正常。


四、服務器資源列表

wKiom1Ozz7PilaRGAAD2EbEmDy4850.jpg


五、配置過程

關於Redis的安裝與配置這裏便不操作,想了解的朋友請閱讀:高性能數據庫緩存之redis(一)http://cfwlxf.blog.51cto.com/3966339/1423106


31 Master端操作如下:

運行redis服務

[root@redis_master sh]# redis-server/etc/redis/redis.conf

查詢redis運行日誌

wKioL1Ozz6bw05VBAAJdwyDX2eg504.jpg

##通過閱讀日誌文件輸出的一些信息,可以看出MasterSlave建立連接時,需要執行的會話機制:加載數據文件至硬盤,用時0.012秒,可想而知速度是多麼的快,當然得依據數據的大小去評測;服務連接至6379端口,收到Slave同步連接請求,開啓“BGSAVE”同步等;


清除Master端數據庫中所有Key

[root@redis_master sh]# redis-cli
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> keys *
(empty list or set)

32 Slave端操作如下:

[root@redis_slave ~]# vim/etc/redis/redis.conf

#添加Master端的IP與端口

 

# slaveof <masterip><masterport>
slaveof 192.168.8.8 6379

                                          

運行redis

[root@redis_slave ~]# redis-server/etc/redis/redis.conf

查詢Slave運行日誌

wKioL1Ozz7vRolYwAAOCbyhb-MU029.jpg

##分析redis日誌,可以看出SlaveMaster建立連接,數據同步的過程;如:發送SYNC命令,與Master192.168.8.8:6379建立連接,然後Slave sync started;隨後Master發送PING命令檢查Slave的存活狀態,複製被繼續….

 

查詢數據庫中的所有key

[root@redis_slave ~]# redis-cli                
127.0.0.1:6379> keys *
(empty list or set)

33 slave2端操作如下:

[root@redis_slave2 ~]# vim/etc/redis/redis.conf

#添加Slave端的IP與端口,實現級聯複製;

 

# slaveof <masterip><masterport>
slaveof 192.168.8.10 6379

 

#運行redis服務

[root@redis_slave2 ~]# redis-server/etc/redis/redis.conf

 

查詢redis運行日誌

wKiom1Oz0AGRPpzyAAOAB3zsl1Q226.jpg

##結果與Slave1類似,只不過Slave2Slave1192.168.8.10:6379)建立連接,同步數據;MySQL的級聯複製便是這樣,Master->Slave1->Slave2;

#查詢數據庫的所有key

[root@redis_slave2 ~]# redis-cli

127.0.0.1:6379> keys *

(empty list or set)

34 master端操作如下:

[root@redis_master sh]# redis-cli
127.0.0.1:6379> MSET ID 1005 NAMEMariaDB City BeiJing
OK
127.0.0.1:6379> MGET ID NAME City
1) "1005"
2) "MariaDB"
3) "BeiJing"
127.0.0.1:6379> keys *
1) "NAME"
2) "ID"
3) "City"

 

35 客戶端驗證同步結果

slave1端驗證

[root@redis_slave ~]# redis-cli
127.0.0.1:6379> auth !@#aedf
127.0.0.1:6379> keys *
1) "City"
2) "NAME"
3) "ID"
127.0.0.1:6379> MGET ID NAME City
1) "1005"
2) "MariaDB"
3) "BeiJing"

slave2端驗證

[root@redis_slave2 ~]# redis-cli
127.0.0.1:6379> keys *
1) "ID"
2) "NAME"
3) "City"
127.0.0.1:6379> MGET ID NAME City
1) "1005"
2) "MariaDB"
3) "BeiJing"

 

四、Master writeSlave read機制

Redis的主從複製,通過程序實現數據的讀寫分離,讓Master負責處理寫請求,Slave負責處理讀請求;通過擴展Slave處理更多的併發請求,減輕Master端的負載,如下圖:

wKioL1Ozz-3yEjbBAAEZvvETcp8136.jpg

此圖畫得比較簡易,展示了實現Redis讀寫分離的過程,通過判斷用戶讀寫請求,將write請求發送給Redis Master處理,Read請求發送給Redis Slave處理,文章中的不足之處,歡迎大家指點。


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