(进阶篇)Redis6.2.0 集群 主从复制_原理剖析_02
文章目錄
- 一、主從復制流程
- 1. 主從復制流程圖
- 2. 主從復制日志
- 二、主從復制信息剖析
- 2.1. 主節點信息剖析
- 2.2. 從節點信息剖析
- 三、關鍵術語
- 3.1. 復制功能開啟
- 3.2. 全量復制場景
- 3.3. 主從復制異步性
- 3.4. 過期key的處理
- 3.5. 加速復制
一、主從復制流程
1. 主從復制流程圖
第一條線(全量同步):
①slave從節點發送FULL SYNC全量同步請求命令
②master執行bgsave
③將內存中數據通過copy-on-write方式 寫入到磁盤
④將磁盤的數據生成rdb快照
⑤master把rdb快照文件發送給slave從節點
⑥從節點丟棄舊的數據,接收新的rdb快照文件
⑦加載rdb文件
⑧slave復制完成
第二條線(增量同步):
①slave從節點發送FULL SYNC全量同步請求命令
②master執行bgsave
③主節點會往從節點連接緩沖區寫一份數據,同時往repl_backlog也寫一份數據,所有從節點共享同一份repl_backlog
④slave節點接收緩存區的命令
⑤增量數據同步/復制完成
2. 主從復制日志
master復制日志查看
* Ready to accept connections # 準備就緒等待鏈接 * Replica 1xxx.xxx.xxx.101:6379 asks for synchronization# 102節點向主節點發起了一個全量resync 的請求 * Full resync requested by replica 1xxx.xxx.xxx.101:6379# 主節點創建緩沖區, * Replication backlog created, my new replication IDs are 'b1f446c9ea7c0d5e95c8c47f31b000000000000000000000000000'# 通過BGSAVE 將數據寫入磁盤,生成rdb快照,發給子節點 * Starting BGSAVE for SYNC with target: disk * Background saving started by pid 11978 * DB saved on disk# 通過copy-on-write的方式將4m數據寫入磁盤 * RDB: 6 MB of memory used by copy-on-write * Background saving terminated with success# 101 節點的復制結束了 子節點加載rdb快照文件讀取數據 * Synchronization with replica 1xxx.xxx.xxx.101:6379 succeeded * Replica 1xxx.xxx.xxx.102:6379 asks for synchronization * Full resync requested by replica 1xxx.xxx.xxx.102:6379 * Starting BGSAVE for SYNC with target: disk * Background saving started by pid 11979 * DB saved on disk * RDB: 4 MB of memory used by copy-on-write * Background saving terminated with success * Synchronization with replica 1xxx.xxx.xxx.102:6379 succeeded # Disconnecting timedout replica: 1xxx.xxx.xxx.101:6379 # Connection with replica 1xxx.xxx.xxx.101:6379 lost. # Disconnecting timedout replica: 1xxx.xxx.xxx.102:6379二、主從復制信息剖析
通過什么可以查看主從節點信息呢?
info replcatipon
2.1. 主節點信息剖析
[root@bigdata01 bin]# /usr/local/redis/bin/redis-cli -a 123456 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> info replication # Replication role:master # 角色主節點 connected_slaves:2 #它所連接到的從節點的數量 # 從節點ip地址、 端口、狀態:在線 當前從節點讀取命令的偏移量 延遲時間:單位:秒 #offset指的是從節點已經復制的命令偏移量是266 # 這里的offset=master_repl_offset說明主從偏移量是一致的 slave0:ip=1xxx.xxx.xxx.101,port=6379,state=online,offset=266,lag=1 #當前連接從01 slave節點信息 slave1:ip=1xxx.xxx.xxx.102,port=6379,state=online,offset=266,lag=1 #當前連接從02 slave節點信息 master_failover_state:no-failover # 主從的id master_replid:b1f446c9ea7c0d5e95c8c47f31bb007cea158ce8 # 主從發生變化之后id master_replid2:0000000000000000000000000000000000000000 # 主節點會把所有的命令轉換成子字節。寫到隊里額里面,最終寫入的值就是master_repl_offset # 主節點已寫入的命令偏移量是266 master_repl_offset:266 # 判斷是否全量復制的標識 second_repl_offset:-1# 2.8之后 緩沖區 repl_backlog_active:1 # 是否開啟緩沖區 1-開啟 0-關閉 repl_backlog_size:1048576 # 緩沖區大小 1m,可以調控 repl_backlog_first_byte_offset:1 # 從偏移量為1開始寫入 repl_backlog_histlen:266 # 當前緩存沖區長度 127.0.0.1:6379>2.2. 從節點信息剖析
[root@bigdata02 ~]# /usr/local/redis/bin/redis-cli -a 123456 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> info replication # Replication# 角色 role:slave # 主節點ip master_host:1xxx.xxx.xxx.100 # 主節點端口 master_port:6379 # 主節點當前狀態 master_link_status:up # 主從復制最后一次 4秒之前 master_last_io_seconds_ago:4 # 現在主從同步狀態 0-未同步 1-正在同步 master_sync_in_progress:0 # 從節點復制的偏移量 slave_repl_offset:3xxx # 從節點在選舉時,成為主節點的權重優先級,這個參數越大,晉升主節點的優先級越高 slave_priority:100 # 從節點只讀模式是否開啟 1-開啟 0-未開啟 slave_read_only:1 # 從節點連接從節點數量 connected_slaves:0 master_failover_state:no-failover # 連接主節點的id #當前主節點宕機后master_replid會變成一個信心的,master_replid2存儲老的主節點master_replid master_replid:b1f446c9ea7c0d5e95c8c47f31bb007cea158ce8 master_replid2:0000000000000000000000000000000000000000 # 主節點寫入的偏移量 master_repl_offset:3xxx second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:3xxx 127.0.0.1:6379>三、關鍵術語
3.1. 復制功能開啟
通過什么配置項開啟主從之間的復制功能呢?
slaveof
在從節點的配置中添加slaveof,從節點就會識別主節點是誰?跟主節點建立連接,然后開始同步數據。
同步數據就是主從復制。復制的又分為全量復制和增量復制2種概念。
3.2. 全量復制場景
全量復制:從節點把主節點的數據全量復制過來
發生的場景:
1.初始化環境(剛搭建完主從復制集群,初始化主節點數據,從節點全量復制)
2.新增從節點,需要把主節點數據全量復制過來,才能對外提供讀服務
3.在redis2.8之前,主節點故障(run_id發生變化),重新選舉主節點,從節點為了保證安全性和一致性就會全量復制。
假設如果數據沒問題,進行一次全量復制就是多余的。
在2.8之后,多了一個second_repl_offset為了避免主從節點發生變化或者故障轉移都要全量復制。就會把主節點的偏移量記錄下來,當重新選擇舉主節點后,就會先判斷偏移量,根據偏移量做增復制。
例如:
從節點偏移量2590
主節點偏移量2591
主從節點偏移量相差1
就會只同步1偏移量而不會全量復制了
增量復制:
- 增量復制是Slave初始化后開始正常工作時,主服務器發生的寫操作同步到從服務器的過程。
- 復制過程是主服務器每執行一個寫命令就會向從服務器發送相同的寫命令,從服務器接收并執行收到的寫命令。
3.3. 主從復制異步性
- 主從復制對于主從redis服務器是非阻塞的,當從服務器在進行主從復制過程中,主redis仍然可以處理外界的訪問請求。
- 主從復制對于從redis服務器是非阻塞,從redis在進行主從復制過程中也可以接收外界的查詢請求,只不過這時候從redis返回以前的數據。
主從復制過程,主節點是非阻塞的,復制的流程中,主節點開啟了一個后臺子守護進程去做主從復制的,比如,bgsave、生成rdb快照、發送等等。同時,當前服務器的主節點仍然可以對外提供讀寫服務,這時他的異步性。
從節點也是一樣,比如,從節點正在復制主節點的數據,這個sync同步也是異步的,復制的過程中就會有問題。
什么問題呢?
比如,正在復制,這時一個查詢請求發過來,就會查詢的是老數據,這里面就會有臟讀、數據不一致的問題。
3.4. 過期key的處理
Slave不睡讓key過期,而是等待Master讓KEY過期。當Master讓KEY過期是,它會合成一個DEL命令并傳輸到所欲的SLave節點。
3.5. 加速復制
默認情況下,master節點接收SYNC命令后,執行BGSAVE操作,將數據先保存到磁盤,如果磁盤性能差,那么寫入磁盤會消耗大量的性能,因此,在redis2.8.18時進行改進,可以設置無需寫入磁盤的直接發送RDB快照給slave,加快復制速度。
修改配置:repl_diskless-sync yes (默認no)
總結
以上是生活随笔為你收集整理的(进阶篇)Redis6.2.0 集群 主从复制_原理剖析_02的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精讲23种设计模式-基于装饰模式~设计多
- 下一篇: 使用dubbo后尽量不用要@Servic