主從同步
主從複制是redis的分布式基礎,哨兵模式和分片叢集等高可用方案離不開主從複制。
redis的分布式滿足CAP理論的的AP以及C的資料最終一緻性。redis是通過主從同步模式提供服務的可用性和資料最終一緻性。
redis主從複制是将redis的節點屬性分為主節點和從節點,主節點可以提供讀寫請求,從服務最好提供讀請求。從節點從主節點同步資料,保證主節點和從節點的資料一緻性。
如何同步資料
從伺服器同步主節點的資料,一般是通過2中方式。
- 快照同步
- 增量同步
快照同步:是從伺服器首次接入主節點或者從服務發送的偏移量在主伺服器上被覆寫了,這時是通過快照同步資料。主節點先bgsave,将目前的記憶體資料快照到磁盤,同時将并發請求主節點的操作指令放入住節點的緩沖區buffer中。主節點将快照檔案傳送給從節點,從節點收到快照檔案,先入磁盤,再将從伺服器的記憶體flush清空,開始加載快照檔案資料到記憶體中。從伺服器加載成功後通知主伺服器開始增量同步緩存區的資料。
增量同步:redis同步的是指令流。主節點會将修改的操作指令放在本地的記憶體buffer中,異步的将buffer指令集同步到從節點上。從節點執行這些指令,同時告訴主節點自己的同步的指令的偏移量。
記憶體的buffer是有限的,且記憶體的buffer是環形資料結構,當buffer滿了後就會覆寫之前的buffer裡的資料。如果從伺服器告知主伺服器的偏移量不在buffer中了或者被覆寫了,則主伺服器開始快照資料全量同步。
這個記憶體buffer大小很重要,根據業務的流量來規範大小。如果記憶體buffer設定不規範,則會導緻主從伺服器頻發的增量同步。
主從快照同步的I/O操作很耗時,如果是AOF模式,在AOF模式需要fsync的強制flush的時候,如果發送了快照同步,則fysnc指令被延遲執行。故redis增加了無盤複制模式。主節點通過socke将快照内容發送給從服務,從節點将接受的資料存儲到磁盤,在一次性加載