前言
redis的高可用涉及到持久化忧便、主從復制(讀寫分離)慷彤、哨兵和集群卖氨。持久化主要是內(nèi)存數(shù)據(jù)到磁盤挑豌,是一個單機備份問題骚腥,主從復制是多機數(shù)據(jù)備份問題夭谤。主從復制不僅僅解決數(shù)據(jù)備份還可以實現(xiàn)讀負載均衡和故障恢復论熙。
此篇文章主要分析富俄,如何使用主從復制缕题、復制的原理(全量復制截歉,部分復制,及心跳機制)烟零,在使用過程中注意的問題(數(shù)據(jù)不一致問題瘪松,復制鏈接超時問題,復制緩沖區(qū))锨阿,主從復制的相關(guān)配置凉逛。
一、如何使用主從復制(具體的配置可查找相關(guān)資料群井,本文不做過多的設計)
主從復制的配置不需要對主節(jié)點進行設置状飞,只要在從節(jié)點設置
通過對redis.conf文件中配置
port 6380? ? ?//端口
pidfile /var/run/redis_6380.pid? ?
slaveof 127.0.0.1 6379? ? //該從節(jié)點屬于哪個主節(jié)點
logfile "/data/logs/redis.slave1.log"
daemonize yes
配置完成后,在該redis目錄中輸入命令。redis-server? redis.conf
二诬辈、主從復制的原理
第一建立連接
第二 數(shù)據(jù)同步階段
從節(jié)點發(fā)送同步命令(psync)到主節(jié)點酵使,此時需注意,此時兩者的身份狀態(tài)發(fā)生改變焙糟,主節(jié)點也需要向從節(jié)點發(fā)送命令到命令緩沖區(qū)口渔,在數(shù)據(jù)同步階段,會根據(jù)子節(jié)點的狀態(tài)(offset穿撮,runid)來選擇全量復制或者部分設置缺脉。。
1.全量復制和部分復制
全量復制
1. 從節(jié)點發(fā)送psync命令給主節(jié)點悦穿,主節(jié)點收到命令后執(zhí)行bgsave命令攻礼,將數(shù)據(jù)生成rdb文件發(fā)送給從節(jié)點
2.從節(jié)點首先刪除舊的數(shù)據(jù),然后接收新的rdb文件栗柒,這個時候從節(jié)點的數(shù)據(jù)保持跟主節(jié)點執(zhí)行bgsave命令時的數(shù)據(jù)狀態(tài)礁扮,但是這個時候會出現(xiàn)數(shù)據(jù)的不一致
3.主節(jié)點將復制緩沖區(qū)的寫操作命令全部發(fā)送給子節(jié)點,然后子去執(zhí)行瞬沦,這樣會保證從節(jié)點的數(shù)據(jù)跟主節(jié)點的數(shù)據(jù)保持一致太伊,這時候從節(jié)點就擁有一個offset和runid
部分復制
因為全量復制會帶來很大的計算機性能開銷,所以redis后面提供了部分復制逛钻,在數(shù)據(jù)同步中斷或者網(wǎng)絡中間的前提下僚焦,實現(xiàn)部分復制
部分復制需要依賴一下幾個機制實現(xiàn)
runid: 主節(jié)點的標識符
復制緩沖區(qū): 用于存儲備份主節(jié)點的寫命令,是一個fifo隊列
復制偏移量 offset :復制緩沖區(qū)中的數(shù)據(jù)標識
其實部分復制是針對復制緩沖區(qū)的數(shù)據(jù)而言曙痘,復制緩沖區(qū)中的每條數(shù)據(jù)都帶有offset叠赐,主從節(jié)點都各自維護一個offset,當從節(jié)點發(fā)送同步命令的時候會帶有一個offset和runid,當runid的和接收的主節(jié)點的runid不一樣則執(zhí)行全量復制屡江,當runid一致的時候就比較offset,看從節(jié)點發(fā)送過來的offset是否在復制緩沖區(qū)中,如果不在赛不,那么執(zhí)行全量復制惩嘉,如果在,那么就把缺少的offset發(fā)送給從節(jié)點踢故,從而實現(xiàn)數(shù)據(jù)的一致性文黎。
第三 命令傳輸階段
數(shù)據(jù)同步階段完成之后就到了命令傳輸階段,主要是為了完成數(shù)據(jù)的一致性殿较,主節(jié)點將寫命令傳輸給從節(jié)點去執(zhí)行耸峭,中間涉及到復制緩沖區(qū),包括主從之間還涉及到心跳機制淋纲。心跳機制也影響數(shù)據(jù)同步采用何種同步方式劳闹。
但是該階段并不一定保證數(shù)據(jù)的強一致性,因為命令傳輸階段是異步的,也就是說主節(jié)點發(fā)送命令并不會等從節(jié)點的回復本涕,所以出現(xiàn)延遲和數(shù)據(jù)的不一致性還是在所難免业汰,這個也跟主從之間的網(wǎng)絡狀況和主節(jié)點發(fā)送命令的頻率有關(guān)。
repl-disable-tcp-nodelay no/yes? 該配置是主節(jié)點發(fā)送命令是否需要對包的合并從而減少帶寬菩颖,默認是關(guān)閉的
三样漆、心跳機制
ping
主節(jié)點發(fā)送ping給子節(jié)點,用來檢測兩者連接是否超時
ack
從節(jié)點發(fā)送offset的命令晦闰,每秒一次
四放祟、應用中的問題
數(shù)據(jù)過期問題
定期刪除(選取一部分數(shù)據(jù)判斷key是否過期從而進行刪除)+惰性刪除(獲取key時候先進行判斷是否過期)
內(nèi)存淘汰機制,在redis.cof 中??# maxmemory-policy volatile-lru 當內(nèi)存不夠用的時候呻右,刪除經(jīng)常不適用的key
復制超時時間
當連接的時間超過閾值的時候就斷開連接??repl-timeout參數(shù)跪妥,這個時間可以設置大一點,避免因為數(shù)據(jù)過大同步時間超過閾值時間斷開連接窿冯,或者查詢大量的數(shù)據(jù)比如 key * 等操作
正常重啟 盡量使用?debug reload