您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Redis中的主從復制是什么”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Redis中的主從復制是什么”這篇文章吧。
Redis支持主從復制功能,可以通過執行slaveof(Redis5版本以后改成replicaof)或者在配置文件中設置slaveof(Redis5版本以后改成replicaof)來開啟復制功能。
一主兩叢
一主多從
主Redis配置基本不用修改,重點部分在從Redis配置
# salve的端口號 port 6380 #把pid進程號寫入pidfile配置的文件 pidfile /var/run/redis_6380.pid logfile "6380.log" #指定數據存放目錄 dir /usr/local/redis‐5.0.3/data/6380 #需要注釋掉bind #bind127.0.0.1(bind綁定的是自己機器網卡的ip,如果有多塊網卡可以配多個ip,代表允許客戶端通過機器的哪些網卡ip去訪問,內網一般可以不配置bind,注釋掉即可)
#從本機master6379的redis實例復制數據,Redis5.0之前使用slaveof replicaof 192.168.0.60 6379 #配置從節點只讀 replica‐read‐only yes
redis‐server redis.conf
redis‐cli ‐p 6380
docker run --name redis-6381 -v /Users/yujiale/docker/redis/conf/redis6381.conf:/etc/redis/redis.conf -v /Users/yujiale/docker/redis/conf/sentinel6381.conf:/etc/redis/sentine.conf -v /Users/yujiale/docker/redis/data6381:/data --network localNetwork --ip 172.172.0.14 -p 16381:6379 -d redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes
一主多從,主從同步
主負責寫,從負責讀
提升Redis的性能和吞吐量
主從的數據一致性問題
從機是主機的備份
主機宕機,從機可讀不可寫
默認情況下主機宕機后,從機不可為主機利用
哨兵可以實現主從切換,做到高可用
只有第一次從Redis連接主Redis時發生的是全量復制,如果是短點續傳可能是全量復制,也可能是部分復制。
流程圖
slaver與master建立socket連接
slaver關聯文件事件處理器
該處理器接收RDB文件(全量復制)、接收Master傳播來的寫命令(增量復制)
主服務器accept從服務器Socket連接后,創建相應的客戶端狀態。相當于從服務器是主服務器的Client端。
發送ping命令
1、發送“pong” ,說明正常
2、返回錯誤,說明Master不正常
3、timeout,說明網絡超時
1、檢測socket的讀寫狀態
2、檢測Master能否正常處理
Slaver向Master發送ping命令
Master的響應:
權限驗證
主從正常連接后,進行權限驗證
主未設置密碼(requirepass=“”),從也不用設置密碼(masterauth=“”)
主設置密碼(requirepass!=""),從需要設置密碼(masterauth=主的requirepass的值)
或者從通過auth命令向主發送密碼
主Redis接收到PSYNC命令后執行bgsave命令會生成最新的rdb快照,
主Redis發送rdb快照給從Redis時,master會繼續接收客戶端的請求,它會把這些可能修改數據集的請求緩存在內存中存儲到relp buffer緩存中
同步快照階段:Master創建并發送快照RDB給Slave,Slave載入并解析快照。Master同時將此階段所產生的新的寫命令存儲到緩沖區。
從節點接收到rdb快照后清空老數據,并加載rdb文件
同步寫緩沖階段:Master向Slave同步存儲在緩沖區的寫操作命令。
從節點接收buffer緩存文件,并加載buffer緩存文件到內存中
從Redis接收到主Redis發送過來的命令,執行當前命令
如果你為master配置了一個slave,不管這個slave是否是第一次連接上Master,它都會發送一個PSYNC命令給master請求復制數據。master收到PSYNC命令后,會在后臺進行數據持久化通過bgsave生成最新的rdb快照文件,持久化期間,master會繼續接收客戶端的請求,它會把這些可能修改數據集的請求緩存在內存中。當持久化進行完畢以后,master會把這份rdb文件數據集發送給slave,slave會把接收到的數據進行持久化生成rdb,然后再加載到內存中。然后,master再將之前緩存在內存中的命令發送給slave。當master與slave之間的連接由于某些原因而斷開時,slave能夠自動重連Master,如果master收到了多個slave并發連接請求,它只會進行一次持久化,而不是一個連接一次,然后再把這一份持久化的數據發送給多個并發連接的slave。
大體流程跟全量復制差不多,就不過多講解
當master和slave斷開重連后,一般都會對整份數據進行復制。但從redis2.8版本開始,redis改用可以支持部分數據復制的命令PSYNC去master同步數據,slave與master能夠在網絡連接斷開重連后只進行部分數據復制(斷點續傳)。master會在其內存中創建一個復制數據用的緩存隊列,緩存最近一段時間的數據,master和它所有的slave都維護了復制的數據下標offset和master的進程id,因此,當網絡連接斷開后,slave會請求master繼續進行未完成的復制,從所記錄的數據下標開始。如果master進程id變化了,或者從節點數據下標offset太舊,已經不在master的緩存隊列里了,那么將會進行一次全量數據的復制。主從復制(部分復制,斷點續傳)流程圖:
Redis增量同步主要指Slave完成初始化后開始正常工作時,Master發生的寫操作同步到Slave的過程。
通常情況下,Master每執行一個寫命令就會向Slave發送相同的寫命令,然后Slave接收并執行。
檢測主從服務器的網絡連接狀態通過向主服務器發送INFO replication命令,可以列出從服務器列表,可以看出從最后一次向主發送命令距離現在過了多少秒。lag的值應該在0或1之間跳動,如果超過1則說明主從之間的連接有故障。
Redis可以通過配置防止主服務器在不安全的情況下執行寫命令min-slaves-to-write 3(min-replicas-to-write 3)min-slaves-max-lag 10(min-replicas-max-lag 10)上面的配置表示:從服務器的數量少于3個,或者三個從服務器的延遲(lag)值都大于或等于10秒時,主服務器將拒絕執行寫命令。這里的延遲值就是上面INFOreplication命令的lag值。
如果因為網絡故障,主服務器傳播給從服務器的寫命令在半路丟失,那么當從服務器向主服務器發送REPLCONF ACK命令時,主服務器將發覺從服務器當前的復制偏移量少于自己的復制偏移量,然后主服務器就會根據從服務器提交的復制偏移量,在復制積壓緩沖區里面找到從服務器缺少的數據,并將這些數據重新發送給從服務器。(補發)網絡不斷增量同步:網斷了,再次連接時
客戶端發送saveof后主節點會判斷是否第一次復制,如果是則進行全量復制,如果不是通過runid offset偏移量進行判斷是否一致,如果一致則進行部分復制,否則進行全量復制。
以上是“Redis中的主從復制是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。