Redis 的高可靠性 :
- 數(shù)據(jù)盡量少丟失 : AOF/RDB 保證
- 服務(wù)盡量少中斷 : 增加副本冗余量,同數(shù)據(jù)保存多個實例
Redis 提供主從庫模式,保證數(shù)據(jù)副本的一致
主從庫間采用 : 讀寫分離的方式
- 讀操作:主庫、從庫都接收
- 寫操作:先到主庫執(zhí)行,再把主庫的寫操作同步給從庫
主從庫同步的模式:全量復(fù)制、基于長連接的命令傳播,增量復(fù)制
主從庫第一次同步
設(shè)置實例 2 (172.16.19.5) 為實例 1 (172.16.19.3) 的從庫 :
replicaof 172.16.19.3 6379
主從庫第一次同步流程 :
- 主從庫間建立連接,并告知主庫同步,為全量復(fù)制做準(zhǔn)備
- 從庫給主庫發(fā) psync (參數(shù) : runID : 隨機(jī) ID ; offset=-1 : 第一次復(fù)制) ,表示要數(shù)據(jù)同步
- 主庫發(fā) FULLRESYNC (第一次復(fù)制用 : 全量復(fù)制) 給從庫
- 主庫將所有數(shù)據(jù)同步給從庫。從庫收到數(shù)據(jù)后,在本地完成數(shù)據(jù)加載
- 主庫執(zhí)行 bgsave ,生成 RDB ,并把文件發(fā)給從庫
- 從庫收到 RDB 后,先清空當(dāng)前數(shù)據(jù)庫,再加載 RDB
- 為了主從庫的數(shù)據(jù)一致性,主庫會用
replication buffer
,記錄 RDB 生成后的所有寫操作
- 主庫會把 2 階段中 , 新收到的寫命令 , 發(fā)給從庫
- 主庫完成 RDB 發(fā)送后,把
replication buffer
的新修改操作 ,發(fā)給從庫,從庫再執(zhí)行這些操作
- 主庫完成 RDB 發(fā)送后,把
主從級聯(lián)模式
主從庫間第一次的全量復(fù)制同步 :
- 對主庫,要完成兩個耗時操作:生成 RDB 文件 , 傳輸 RDB 文件
當(dāng)從庫數(shù)量很多,并都和主庫進(jìn)行全量復(fù)制的問題 :
- 主庫忙于
fork
子進(jìn)程生成 RDB 文件 -
fork
會阻塞主線程處理正常請求,并導(dǎo)致主庫響應(yīng)請求速度變慢 - 傳輸 RDB 會占用主庫的網(wǎng)絡(luò)帶寬,導(dǎo)致主庫的資源使用壓力
分擔(dān)主庫壓力的解決方案 :
-
主-從-從
模式 : 將主庫生成 RDB/傳輸 RDB 壓力,以級聯(lián)方式分散到從庫
級聯(lián)的 主-從-從 模式 :
主從庫間網(wǎng)絡(luò)斷
當(dāng)主從庫斷后,主庫會把寫操作寫入 replication buffer
,并也寫入 repl_backlog_buffer
環(huán)形緩沖區(qū)
- 主庫會記錄自己寫的位置,從庫會記錄自己已讀的位置
- 主從同步偏移量
master_repl_offset
: 當(dāng)主庫的寫操作越多,該值會越大 - 當(dāng)從庫的讀取速度較慢,環(huán)形緩沖區(qū)寫滿后,主庫會覆蓋之前寫操作 , 可能會導(dǎo)致主從庫間的數(shù)據(jù)不一致
repl_backlog_buffer :
Redis 增量復(fù)制流程 :
- 主從庫的連接恢復(fù)后,從庫先給主庫發(fā) psync ,并把自己當(dāng)前
slave_repl_offset
發(fā)給主庫 - 主庫會判斷自己的 master_repl_offset 和 slave_repl_offset 之間的差距
- 主庫把
master_repl_offset ~ slave_repl_offset
間的寫操作,同步給從庫就行
避免主從庫間的數(shù)據(jù)不一致 :
- 方案 : 調(diào)整
repl_backlog_size
- 計算公式 : 緩沖空間大小 = 主庫寫入命令速度 * 操作大小 - 主從庫間網(wǎng)絡(luò)傳輸命令速度 * 操作大小
- repl_backlog_size = 緩沖空間大小 * 2
例子 : 主庫每秒寫入 2000 個操作,每個操作的大小 : 2KB,網(wǎng)絡(luò)每秒能傳輸 1000 個操作文章來源:http://www.zghlxwxcb.cn/news/detail-430412.html
- 緩沖空間大小 = 2000*2 - 1000 *2 = 2MB
- 為了應(yīng)對突發(fā)壓力,repl_backlog_size = 2MB * 2 = 4MB
當(dāng)并發(fā)請求量非常大 :文章來源地址http://www.zghlxwxcb.cn/news/detail-430412.html
- 調(diào)大 repl_backlog_size ,如 : 緩沖空間大小 * 4
- 切片集群 : 分擔(dān)單個主庫的請求壓力
到了這里,關(guān)于Redis 主從數(shù)據(jù)同步的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!