redis資料複製,可用性怎麼做的?

redis資料複製,可用性怎麼做的?

複製的基本原理(全量同步)

1。slave啟動時會向master傳送sync命令。

2。主資料庫接收到sync請求後在後臺儲存快照,也就是實現RDB持久化,並將儲存快照期間接收到的命令快取起來

3。快照完成後主資料庫會將快照檔案和所有快取的命令傳送給從資料庫

4。從資料庫接收後會載入快照檔案並執行快取的命令, 從而完成複製

5。在資料庫使用階段主資料庫會自動把每次收到的寫命令同步到從伺服器

增量同步

redis增量複製是指slave初始化後開始工作時主伺服器發生的寫操作同步到從伺服器的過程。增量複製的過程主要是主伺服器每執行一個寫命令就會向從伺服器傳送相同的寫命令,從伺服器接收並執行收到的寫命令。

主從剛剛連線時,進行全量同步;全量同步結束後,進行增量同步,如果有需要,slave在任何時候都可以發起全量同步。redis策略是無論如何首先會嘗試進行增量同步,如不成功,要求從機進行全量同步。

redis伺服器崩潰時資料恢復

1)RDB方式

RDB方式的持久化時透過快照(snapshot)完成的,當符合一定條件時redis會自動將記憶體中的所有資料進行快照並存儲到硬碟上。快照條件在配置檔案裡配置,由時間和改動的鍵的個數構成。

save 900 1

redis使用fork函式複製一份當前程序的副本;父程序繼續接受並處理客戶端命令,子程序開始將記憶體中的資料寫入硬碟中的臨時檔案;子程序寫完所有資料後該臨時檔案替換舊的RDB檔案,快照完成;當執行fork時,作業系統會使用寫時複製策略,即fork函式發生一刻父子程序共享同一記憶體資料,當父程序更改其中某個資料時,作業系統會將該資料複製一份以保障子程序資料不受影響,所以新的RDB檔案儲存的是執行fork一刻的記憶體資料。

除了自動快照,可以手動傳送save或bgsave命令讓redis執行快照。前者是由主程序進行快照,會阻塞其他請求,後者透過fork子程序進行快照操作。

一旦redis異常退出,就會丟失最後一次快照以後更改的所有資料。設定合理的快照發生時間,將資料損失控制在能夠接受的範圍。如果資料很重要無法承擔任何損失,可以使用AOF持久化。

2)AOF方式

預設情況下redis沒開啟AOF方式持久化,可透過redis。cnf開啟appendonly yes開啟。在啟動redis的時候,會逐個執行AOF中的命令將資料載入到記憶體。載入速度比RDB慢一些。

開啟AOF後每執行一條會更改redis資料的命令,都會將該命令寫入硬碟的AOF檔案,AOF檔案儲存位置和RDB檔案位置相同,都是透過dir引數設定。預設appendonly。aof

aof方式追加log檔案可能導致體積過大,系統重啟時aof的方式則載入資料會非常慢。另外每條命令都要寫log,reids的讀寫效能也會有所下降。

redis允許同時開啟AOF和RDB,即保證資料安全又使得備份操作容易。重啟redis後redis會使用AOF檔案來恢復資料,AOF方式持久化可能丟失的資料更少。

斷點續傳

從redis 2。8開始,就支援主從複製的斷點續傳,如果主從複製過程中,網路連線斷掉了,那麼可以接著上次複製的地方,繼續複製下去,而不是從頭開始複製一份

master node會在記憶體中建立一個backlog,master和slave都會儲存一個replica offset還有一個master id,offset就是儲存在backlog中的。如果master和slave網路連線斷掉了,slave會讓master從上次的replica offset開始繼續複製

但是如果沒有找到對應的offset,那麼就會執行一次resynchronization

無磁碟化複製

master在記憶體中直接建立rdb,然後傳送給slave,不會在自己本地落地磁碟了

repl-diskless-sync

repl-diskless-sync-delay,等待一定時長再開始複製,因為要等更多slave重新連線過來

過期key處理

slave不會過期key,只會等待master過期key。如果master過期了一個key,或者透過LRU淘汰了一個key,那麼會模擬一條del命令傳送給slave。

非同步複製

master每次接收到寫命令之後,先在內部寫入資料,然後非同步傳送給slave node