Redis主从复制与优化
Redis主從復(fù)制與優(yōu)化
主從復(fù)制
我們關(guān)注主從復(fù)制之前,首先要考慮單機有什么問題?
- 機器故障
- 容量瓶頸
- QPS瓶頸
這些都是單節(jié)點所遇到的問題,所以這個時候出現(xiàn)了主從復(fù)制(一主一從,一主多從)
使用主從復(fù)制可以:
- 數(shù)據(jù)副本
- 擴展讀性能
注意:
- 一個master可以有多個slave
- 一個slave只有一個master
- 數(shù)據(jù)流向是單向的,master到slave
主從復(fù)制的配置
兩種實現(xiàn)方式
- slaveof命令
兩臺機器:主節(jié)點:47.11.11.11 從節(jié)點 47.22.22.22
在從節(jié)點執(zhí)行 slaveof 命令
47.22.22.22-6379 > slacefof 47.11.11.11 6379 OK取消復(fù)制:
47.22.22.22-6379 > slacefof no one OK- 修改配置
- 兩種方式比較
- 查看主從
知識點 :
- 主節(jié)點 runID:
每個redis節(jié)點啟動后都會動態(tài)分配一個40位的十六進制字符串為運行ID。運行ID的主要作用是來唯一識別redis節(jié)點,比如從節(jié)點保存主節(jié)點的運行ID識別自已正在復(fù)制是哪個主節(jié)點。如果只使用ip+port的方式識別主節(jié)點,那么主節(jié)點重啟變更了整體數(shù)據(jù)集(如替換RDB/AOF文件),從節(jié)點再基于偏移量復(fù)制數(shù)據(jù)將是不安全的,因此當(dāng)運行ID變化后從節(jié)點將做全量復(fù)制。可以在info server命令查看當(dāng)前節(jié)點的運行ID。
需要注意的是redis關(guān)閉再啟動,運行的id會隨之變化。
全量復(fù)制和部分復(fù)制等
全量復(fù)制
用于初次復(fù)制或其它無法進行部分復(fù)制的情況,將主節(jié)點中的所有數(shù)據(jù)都發(fā)送給從節(jié)點。當(dāng)數(shù)據(jù)量過大的時候,會造成很大的網(wǎng)絡(luò)開銷。
redis2.8+ 全量復(fù)制流程
開銷:
部分復(fù)制
用于處理在主從復(fù)制中因網(wǎng)絡(luò)閃退等原因造成數(shù)據(jù)丟失場景,當(dāng)從節(jié)點再次連上主節(jié)點,如果條件允許,主節(jié)點會補發(fā)丟失數(shù)據(jù)給從節(jié)點,因為補發(fā)的數(shù)據(jù)遠遠小于全量數(shù)據(jù),可以有效避免全量復(fù)制的過高開銷。但需要注意,如果網(wǎng)絡(luò)中斷時間過長,造成主節(jié)點沒有能夠完整地保存中斷期間執(zhí)行的寫命令,則無法進行部分復(fù)制,仍使用全量復(fù)制 。
流程:
復(fù)制偏移量:
- 參與復(fù)制的主從節(jié)點都會維護自身復(fù)制偏移量,主節(jié)點在處理完寫入命令操作后,會把命令的字節(jié)長度做累加記錄,統(tǒng)計信息在info replication中的master_repl_offset指標(biāo)中。
- 從節(jié)點每秒鐘上報自身的復(fù)制偏移量給主節(jié)點,因此主節(jié)點也會保存從節(jié)點的復(fù)制偏移量slave0:ip=192.168.1.3,port=6379,state=online,offset=116424,lag=0
- 從節(jié)點在接收到主節(jié)點發(fā)送的命令后,也會累加記錄自身的偏移量。統(tǒng)計信息在info replication中的slave_repl_offset中。
復(fù)制積壓緩沖區(qū):
- 復(fù)制積壓緩沖區(qū)是保存在主節(jié)點上的一個固定長度的隊列,默認(rèn)大小為1MB,當(dāng)主節(jié)點有連接的從節(jié)點時被創(chuàng)建,這時主節(jié)點響應(yīng)寫命令時,不但會把命令發(fā)給從節(jié)點,還會寫入復(fù)制積壓緩沖區(qū)。
在命令傳播階段,主節(jié)點除了將寫命令發(fā)送給從節(jié)點,還會發(fā)送一份給復(fù)制積壓緩沖區(qū),作為寫命令的備份;除了存儲寫命令,復(fù)制積壓緩沖區(qū)中還存儲了其中 的每個字節(jié)對應(yīng)的復(fù)制偏移量(offset) 。由于復(fù)制積壓緩沖區(qū)定長且先進先出,所以它保存的是主節(jié)點最近執(zhí)行的寫命令;時間較早的寫命令會被擠出緩沖區(qū)。
生產(chǎn)中常見問題
讀寫分離
分流到從節(jié)點。主節(jié)點寫數(shù)據(jù),從節(jié)點讀數(shù)據(jù),可能遇到讀問題
主從配置不一致
規(guī)避全量復(fù)制
? - 第一次不可避免,盡量小節(jié)點 ,低峰處理
? - 故障轉(zhuǎn)移,例如哨兵或者集群
? - 增大復(fù)制緩存區(qū)配置rel_backlog_size ,網(wǎng)絡(luò)增強
規(guī)避復(fù)制風(fēng)暴
最后的注意事項:
- 在上述的過程的實現(xiàn)是從庫不開啟AOF持久化情況下,如果從庫開啟的AOF持久化,重啟時候依然使用全量復(fù)制。
- 之前從master復(fù)制過來的數(shù)據(jù)并不會丟失,只是不再同步之前master(如上圖的6379節(jié)點)后續(xù)寫入的數(shù)據(jù)
- slaveof 可以用來改變其所屬的master節(jié)點,即重新成為另一臺master的slave,但是新的master首先就會把從節(jié)點的數(shù)據(jù)全部清除掉
- 關(guān)于讀寫分離延時: 讀寫分離 ,master會一步將數(shù)據(jù)復(fù)制到slave,如果slave發(fā)生阻塞,則會延遲master數(shù)據(jù)的寫命令,造成數(shù)據(jù)不一致的問題。-------一般不考慮這個問題
- 讀到過期數(shù)據(jù):redis在刪除key時有兩種策略,一種是懶惰型策略,即只有當(dāng)redis操作這個key時才會將key刪除,第二種是定期采樣key刪除--------當(dāng)key數(shù)據(jù)非常多時,采樣速度比不上key生成速度會造成很多過期數(shù)據(jù)沒有刪除,因為redis一般都是在master節(jié)點(增加刪除數(shù)據(jù)),slave查詢到過期數(shù)據(jù)也不能刪除。會導(dǎo)致slave讀到過期數(shù)據(jù)(在redis3.2中已經(jīng)解決)
- 推薦 redis 主從文章https://www.cnblogs.com/wdliu/p/9407179.html
- 推薦 redis 全量復(fù)制與部分復(fù)制文章https://blog.csdn.net/gaobinzhan/article/details/106536326
個人博客:[http://blog.yanxiaolong.cn/](個人博客:http://blog.yanxiaolong.cn/
)
原文鏈接:https://developer.aliyun.com/article/775627?
版權(quán)聲明:本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻,版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的Redis主从复制与优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开放下载!《iOS开发者必读资讯》
- 下一篇: 每秒8.8亿次请求!让数据存得起,看得见