構(gòu)建高性能數(shù)據(jù)庫緩存之redis主從復(fù)制
一、什么是redis主從復(fù)制?
主從復(fù)制,當(dāng)用戶往Master端寫入數(shù)據(jù)時(shí),通過Redis Sync機(jī)制將數(shù)據(jù)文件發(fā)送至Slave,Slave也會執(zhí)行相同的操作確保數(shù)據(jù)一致;且實(shí)現(xiàn)Redis的主從復(fù)制非常簡單。
二、redis主從復(fù)制特點(diǎn)
1、同一個(gè)Master可以擁有多個(gè)Slaves。
2、Master下的Slave還可以接受同一架構(gòu)中其它slave的鏈接與同步請求,實(shí)現(xiàn)數(shù)據(jù)的級聯(lián)復(fù)制,即Master->Slave->Slave模式;
3、Master以非阻塞的方式同步數(shù)據(jù)至slave,這將意味著Master會繼續(xù)處理一個(gè)或多個(gè)slave的讀寫請求;
4、Slave端同步數(shù)據(jù)也可以修改為非阻塞是的方式,當(dāng)slave在執(zhí)行新的同步時(shí),它仍可以用舊的數(shù)據(jù)信息來提供查詢;否則,當(dāng)slave與master失去聯(lián)系時(shí),slave會返回一個(gè)錯(cuò)誤給客戶端;
5、主從復(fù)制具有可擴(kuò)展性,即多個(gè)slave專門提供只讀查詢與數(shù)據(jù)的冗余,Master端專門提供寫操作;
6、通過配置禁用Master數(shù)據(jù)持久化機(jī)制,將其數(shù)據(jù)持久化操作交給Slaves完成,避免在Master中要有獨(dú)立的進(jìn)程來完成此操作。
三、redis主從復(fù)制原理
當(dāng)啟動(dòng)一個(gè)Slave進(jìn)程后,它會向Master發(fā)送一個(gè)SYNC Command,請求同步連接。無論是第一次連接還是重新連接,Master都會啟動(dòng)一個(gè)后臺進(jìn)程,將數(shù)據(jù)快照保存到數(shù)據(jù)文件中,同時(shí)Master會記錄所有修改數(shù)據(jù)的命令并緩存在數(shù)據(jù)文件中。后臺進(jìn)程完成緩存操作后,Master就發(fā)送數(shù)據(jù)文件給Slave,Slave端將數(shù)據(jù)文件保存到硬盤上,然后將其在加載到內(nèi)存中,接著Master就會所有修改數(shù)據(jù)的操作,將其發(fā)送給Slave端。若Slave出現(xiàn)故障導(dǎo)致宕機(jī),恢復(fù)正常后會自動(dòng)重新連接,Master收到Slave的連接后,將其完整的數(shù)據(jù)文件發(fā)送給Slave,如果Mater同時(shí)收到多個(gè)Slave發(fā)來的同步請求,Master只會在后臺啟動(dòng)一個(gè)進(jìn)程保存數(shù)據(jù)文件,然后將其發(fā)送給所有的Slave,確保Slave正常。
四、服務(wù)器資源列表
五、配置過程
關(guān)于Redis的安裝與配置這里便不操作,想了解的朋友請閱讀:高性能數(shù)據(jù)庫緩存之redis(一)http://cfwlxf.blog.51cto.com/3966339/1423106
3、1 Master端操作如下:
運(yùn)行redis服務(wù)
- [root@redis_master sh]# redis-server/etc/redis/redis.conf
查詢r(jià)edis運(yùn)行日志
##通過閱讀日志文件輸出的一些信息,可以看出Master與Slave建立連接時(shí),需要執(zhí)行的會話機(jī)制:加載數(shù)據(jù)文件至硬盤,用時(shí)0.012秒,可想而知速度是多么的快,當(dāng)然得依據(jù)數(shù)據(jù)的大小去評測;服務(wù)連接至6379端口,收到Slave同步連接請求,開啟“BGSAVE”同步等;
清除Master端數(shù)據(jù)庫中所有Key
- [root@redis_master sh]# redis-cli
- 127.0.0.1:6379> FLUSHALL
- OK
- 127.0.0.1:6379> keys *
- (empty list or set)
3、2 Slave端操作如下:
[root@redis_slave ~]# vim/etc/redis/redis.conf
#添加Master端的IP與端口
- # slaveof <masterip><masterport>
- slaveof 192.168.8.8 6379
運(yùn)行redis
- [root@redis_slave ~]# redis-server/etc/redis/redis.conf
查詢Slave運(yùn)行日志
##分析redis日志,可以看出Slave與Master建立連接,數(shù)據(jù)同步的過程;如:發(fā)送SYNC命令,與Master端192.168.8.8:6379建立連接,然后Slave sync started;隨后Master發(fā)送PING命令檢查Slave的存活狀態(tài),復(fù)制被繼續(xù)….
查詢數(shù)據(jù)庫中的所有key
- [root@redis_slave ~]# redis-cli
- 127.0.0.1:6379> keys *
- (empty list or set)
3、3 slave2端操作如下:
[root@redis_slave2 ~]# vim/etc/redis/redis.conf
#添加Slave端的IP與端口,實(shí)現(xiàn)級聯(lián)復(fù)制;
- # slaveof <masterip><masterport>
- slaveof 192.168.8.10 6379
#運(yùn)行redis服務(wù)
- [root@redis_slave2 ~]# redis-server/etc/redis/redis.conf
查詢redis運(yùn)行日志
##結(jié)果與Slave1類似,只不過Slave2與Slave1(192.168.8.10:6379)建立連接,同步數(shù)據(jù);MySQL的級聯(lián)復(fù)制便是這樣,Master->Slave1->Slave2;
#查詢數(shù)據(jù)庫的所有key
[root@redis_slave2 ~]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
3、4 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"
3、5 客戶端驗(yàn)證同步結(jié)果
slave1端驗(yàn)證
- [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端驗(yàn)證
- [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 write,Slave read機(jī)制
Redis的主從復(fù)制,通過程序?qū)崿F(xiàn)數(shù)據(jù)的讀寫分離,讓Master負(fù)責(zé)處理寫請求,Slave負(fù)責(zé)處理讀請求;通過擴(kuò)展Slave處理更多的并發(fā)請求,減輕Master端的負(fù)載,如下圖:
此圖畫得比較簡易,展示了實(shí)現(xiàn)Redis讀寫分離的過程,通過判斷用戶讀寫請求,將write請求發(fā)送給Redis Master處理,Read請求發(fā)送給Redis Slave處理,文章中的不足之處,歡迎大家指點(diǎn)。