redis 主從復制
master 節(jié)點提供數(shù)據(jù),也就是寫。slave 節(jié)點負責讀。
不是說master 分支不能讀數(shù)據(jù),也能只是我們希望將讀寫進行分離。
slave 是不能寫數(shù)據(jù)的,只能處理讀請求
主從實現(xiàn)
客戶端 127.0.0.1:6379 服務器 212.64.89.173:6379
方式一
客戶端發(fā)送請求同步命令
slaveof masterip masterport
Copyslaveof 212.64.89.173 6379
方式二
客戶端啟動服務器參數(shù)
redis-server --slaveof masterip masterport
Copyredis-server --slaveof 212.64.89.173 6379
方式三
在客戶端的配置文件中寫入 slaveof 信息
Copyredis.conf
slaveof 212.64.89.173 6379
注意 斷開主從鏈接方式: 客戶端執(zhí)行 slaveof no one
設置鏈接密碼
server 端
服務啟動后設置
Copyconfig set requierpass <password>
配置文件添加密碼
Copy# redis.conf
requirepass <password>
client 端
命令設置密碼
Copyauth <password>
配置文件設置密碼
Copymasterauth <password>
啟動客戶端設置密碼
Copyredis-cli -a <password>
建立連接
建立鏈接的過程就是希望 master和 slave都保有對方的 IP 和 Port。
數(shù)據(jù)同步
數(shù)據(jù)的同步分兩部分,全量同步和增量同步,在增量同步結(jié)束后,master 應當保存Slave 同步數(shù)據(jù)的位置。
復制(積壓)緩沖區(qū)
它有兩部分組成 偏移量 + 字節(jié)值
結(jié)構(gòu)
創(chuàng)建
1 當啟動AOF 時就會創(chuàng)建 復制積壓緩沖區(qū)
2 當被選為 master 節(jié)點,必須創(chuàng)建積壓緩沖區(qū)
作用
保存所有的對數(shù)據(jù)修改或數(shù)據(jù)庫修改的指令,查詢指令不會被記錄。
數(shù)據(jù)源
所有的進入master 的對數(shù)據(jù)修改或數(shù)據(jù)庫修改的指令都會被填充到積壓緩沖區(qū)中。
偏移量
1 Master 和 Slave 都會記錄 offset 值, 每次復制都會對比offset 是否一致。如果一致,Master直接從 offset 處開始傳緩沖區(qū)數(shù)據(jù),如果不一致,那么Master將遵循 Slave 的offset 來傳。當然會保證命令是完整的。
2 Master 保存有多個 offset 而 Slave 僅保存自己的。
3 Master發(fā)送一次,記錄一次, Slave 接受一次記錄一次。
關于Master注意
1如果master 數(shù)據(jù)量過大,應該避免業(yè)務高峰期進行數(shù)據(jù)同步。避免造成 master 阻塞
2 數(shù)據(jù)緩沖區(qū)滿, 此時將會丟棄最早的記錄(FIFO),如果全量復制的時間開銷過大,則可能在開增量復制時候已經(jīng)存在數(shù)據(jù)丟失,這會導致Master 和 Slave 數(shù)據(jù)不一致,為了保證一致性,必須開始新一輪的全量復制,完成后緩沖區(qū)又被填滿并存在丟棄,則會讓Slave進入死循環(huán)。
因此數(shù)據(jù)緩沖區(qū)要設置的大小合適(依具體情況而定)。
Copyrepl-backlog-size 1mb # 默認的大小為 1MB
3 master 單機內(nèi)存不應該占用主機內(nèi)存過多。一般的 50 ~ 70% 預留下 30% ~ 50%來進行bgsave 、 創(chuàng)建復制緩沖區(qū)、執(zhí)行其他業(yè)務等。
關于Slave注意
1 為避免slave進行全量復制、部分復制時服務器響應阻塞或數(shù)據(jù)不同步,建議關閉此期間的對外服務。
Copyslave-server-stale-data yes|no
2 數(shù)據(jù)同步階段,master發(fā)送給 slave 信息可以理解 master是 slave 的一個客戶端,主動向slave發(fā)送命令。
3 多個slave同時對master請求數(shù)據(jù)同步,master發(fā)送的RDB文件增多,會對帶寬造成巨大沖擊,如果master寬帶不足,因此數(shù)據(jù)同步需要根據(jù)業(yè)務需求,適量錯峰。
4 slave過多時,應該對拓撲結(jié)構(gòu)進行調(diào)整,由一主多從結(jié)構(gòu)變?yōu)闃錉罱Y(jié)構(gòu),中間結(jié)點即是master,也是slave。但是使用樹狀結(jié)構(gòu)時,因為層級越深,數(shù)據(jù)同步時延越大,因此將強一致性的數(shù)據(jù)放在頂層節(jié)點,一致性稍弱的數(shù)據(jù)放在靠底層的節(jié)點。
命令傳播
當master數(shù)據(jù)庫狀態(tài)被修改后,導致主從服務器數(shù)據(jù)庫狀態(tài)不一致,此時需要讓主從數(shù)據(jù)同步到一致的狀態(tài),同步的動作成為命令傳播master將接受到的數(shù)據(jù)變更命令發(fā)送給slave,slave接受命令后執(zhí)行命令。
網(wǎng)絡閃斷閃連 忽略短時間網(wǎng)絡中斷 部分復制長時間網(wǎng)絡中斷 全量復制
服務器運行ID(runid)
每臺服務器每次運行都會產(chǎn)生的身份識別碼,同一個服務器多次運行產(chǎn)生的runid是不一樣的。
形式:runid 由 40 個字符組成 一般是16進制的字符串
Copyinfo server
run_id:409b6e9ea2e5c32958de8f365711598c98489f13
心跳機制
master
指令 PING
周期 repl-ping-slave-period 默認是 10s
作用 判斷 slave 是否在線
查詢 INFO replication 獲取最后一次 slave 連接時間間隔 lag = 0 / 1 屬于正常
slave
指令 REPLCONF{offset}
周期: 1s
作用1: 匯報自己的復制偏移量 獲取最新的數(shù)據(jù)變更指令
作用2: 判斷 master 是否存活
心跳注意事項
當 salve多數(shù)掉線 或者網(wǎng)絡延時過高時,master 會拒絕所有的同步信息。
Copymin-slaves-to-write 2 # 最小的 slave 數(shù)量
min-slaves-max-lag 8 # 最長的
當 slave 的數(shù)量小于2 ,或者所有的時延都大于等于 8 時,會強 關閉 master 的血功能來停止數(shù)據(jù)同步。
Slave 的數(shù)量和延時由REPLCONF{offset} 命令確認。
完整的主從復制流程
讀寫分離
在redis主從架構(gòu)中,Master節(jié)點負責處理寫請求,Slave節(jié)點只處理讀請求。對于寫請求少,讀請求多的場景,例如電商詳情頁,通過這種讀寫分離的操作可以大幅提高并發(fā)量,通過增加redis從節(jié)點的數(shù)量可以使得redis的QPS達到10W+。
負載均衡
基于主從結(jié)構(gòu),配合讀寫分離,由slave分擔master負載,并根據(jù)需求的變化,改變slave的數(shù)量,通過多個從節(jié)點分擔數(shù)據(jù)讀取負載,大大提高Redis服務器并發(fā)量與數(shù)據(jù)吞吐量
故障恢復
當master出現(xiàn)問題時,由slave提供服務,實現(xiàn)快速的故障恢復
數(shù)據(jù)冗余
實現(xiàn)數(shù)據(jù)熱備份,時持久化之外的一種數(shù)據(jù)冗余方式
高可用基石
基于主從復制,構(gòu)建哨兵模式與集群,實現(xiàn)redis 的高可用方案。
作者: black_monkey
出處:
https://www.cnblogs.com/monkey-code/p/13111453.html