天天看點

華為雲PB級資料庫GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)遷移系列(上)

摘要:本期将詳細介紹社群版Redis、kvrocks和Pika到GaussDB(for Redis)的遷移

本文分享自華為雲社群《華為雲PB級資料庫GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)遷移系列(上)》,原文作者:高斯Redis官方部落格 。

GaussDB(for Redis)是一款基于計算存儲分離架構,相容Redis生态的雲原生NoSQL資料庫,基于共享存儲池的多副本強一緻機制,支援持久化存儲。在保障資料庫的高相容、搞成本效益、高可靠、無損擴容等特點的同時,GaussDB(for Redis)團隊針對不同的資料庫産品,為使用者提供了多種資料遷移方案,本期将詳細介紹社群版Redis、kvrocks和Pika到GaussDB(for Redis)的遷移。

社群版Redis作為非常受歡迎的記憶體資料庫,因具有性能高,資料結構豐富等優點,得到廣泛使用。GaussDB(for Redis)是相容Redis生态的持久化資料庫,不僅提供優秀的讀寫性能,還提供資料持久化能力,依托超前的系統架構,以極低的成本保證了資料三副本強一緻特性,可以避免社群版Redis需要fork、成本高等問題。

使用華為雲自研的遷移工具drs-redis進行源端Redis到目标端GaussDB(for Redis)的遷移。遷移過程中,drs-redis僞裝成源端Redis的從節點運作,與源端Redis建立連接配接後,觸發Redis的主從同步。源端Redis生成RDB檔案,傳輸給drs-redis完成全量同步。然後發送緩沖區儲存的所有寫指令到drs-redis完成增量同步。 drs-redis遷移工具接收并解析源端Redis的RDB檔案,将解析後的資料通過redis指令的方式發送到GaussDB(for Redis),然後以指令傳播的方式将增量資料也發送到GaussDB(for Redis),完成遷移。

部署遷移工具drs-redis。

保證遷移工具drs-redis、源端Redis和目标端GaussDB(for Redis)網絡互通。

正确修改drs相關配置檔案。

清理遷移程式中可能的遺留資料。

啟動drs,跟蹤日志,確定遷移正确進行。

drs-redis僞裝成源端Redis的從節點,隻讀取源端的全量資料和增量指令,無資料受損風險。

源端增加對drs-redis寫資料的流程,是以性能會有輕微影響。

GaussDB(for Redis)支援多個資料庫,若源端是單節點Redis,需要保留多個資料庫時,可以在GaussDB(for Redis)側開啟namespace功能,避免将多個資料庫的資料遷移到同一空間,造成資料丢失。

如果之前源端不存在從節點,源端會新增replication-buffer來緩存增量指令。

問題:redis主從同步的replication-buffer是ring buffer,若寫入buffer太快,會覆寫掉未發送給drs-redis的資料,源端Redis為了資料一緻性會主動斷開連接配接,造成遷移失敗。

建議:遷移過程中,降低源端Redis寫入資料的速率,在低壓時間段進行遷移。配置redis的client-output-buffer-limit參數,适量增大replication-buffer的大小。

環境:源端單節點Redis和遷移工具drs-redis部署在華為雲8U32GB的彈性雲伺服器上,目标端為4U16GB,3節點GaussDB(for Redis)執行個體。

場景一:

− 源端replication buffer采用預設值(slave 268435456 67108864 60),該預設值表示緩存積壓資料超過268435456bytes(256MB),或超過67108864bytes(64MB)且持續60s,源端會主動斷開與從節點的連接配接。

− 源端寫入速率5MB/s,遷移過程可持續進行,不會産生源端buffer滿造成的同步失敗。

− 遷移工具讀取資料的速率和源端寫入速率一緻。

場景二:

− 源端replication buffer不做限制(config set "client-output-buffer-limit" "slave 0 0 0")。

− 源端寫入速率10MB/s,容量充足的情況下,遷移持續進行。

結論: 在華為雲環境,使用8U32GB彈性雲伺服器部署遷移工具,若源端replication buffer采用預設值,遷移可在源端5MB/s的寫入速率下進行;若源端對replication buffer不做限制,遷移可在源端10MB/s的寫入速率下進行。

Kvrocks是一款開源的相容Redis生态的NoSQL key-value資料庫,底層基于RocksDB實作,提供namespace功能支援資料分區。Kvrocks叢集管理功能相對薄弱,自建叢集時需要與外部元件配合。Kvrocks支援的redis指令也不夠全面,例如缺少在消息流和統計場景經常使用的stream及hyperloglog資料結構。

GaussDB(for Redis)以不亞于RedisCluster的相容度,使使用者在應用時無需修改代碼,可直接使用,100%相容原生接口。GaussDB(for Redis)在适配Kvrocks業務的同時,還能克服器管理能力弱、對Redis相容度不高等缺點。

使用開源工具kvrocks2redis進行Kvrocks到GaussDB(for Redis)的遷移,在此基礎上,從GaussDB(for Redis)源碼層面對Kvrocks的namespace功能進行适配。

遷移過程分為全量和增量兩個階段:遷移開始後,先進行全量遷移,此時對kvrocks打快照,并記錄對應的資料版本(seq)。然後解析全量資料檔案成redis指令寫入GaussDB(for Redis)。全量遷移完成後進入持續的增量遷移過程,遷移工具循環給Kvrocks發送PSYNC指令,将擷取到的增量資料不斷轉發給GaussDB(for Redis),完成增量遷移 。

部署kvrocks2redis到獨立主機。

確定源端、目标端、遷移工具之間網絡互通。

源端Kvrocks執行個體提前做好資料備份。

目标端GaussDB(for Redis)執行個體清空全部資料。

修改遷移工具配置檔案,填入源端kvrocks連接配接資訊、目标端GaussDB (for Redis) 連接配接資訊、源端kvrocks namespace到目标端GaussDB (for Redis) DB的映射關系。

確定配置檔案内容正确。

啟動遷移工具。

跟蹤日志,確定全量遷移順利完成,進入持續增量遷移過程。

進行驗證。確定資料遷移後,目标端GaussDB (for Redis) 已正确加載全部資料。

待後續業務側壓力轉移到GaussDB (for Redis) 後,停止增量遷移,即手動停止遷移工具的運作。

kvrocks2redis需要從Kvrocks提取資料到本地檔案,并從中解析出指令發送到目标端GaussDB(for Redis) ,該過程中可能影響源端性能,但理論上不會有資料受損風險。

遷移工具運作過程中,若出現問題,遷移工具會自動停止,友善問題定位。

GaussDB(for Redis)從安全性角度出發,不提供清庫語義指令,是以要在遷移開始前確定無資料。

Pika是一個可持久化的大容量Redis存儲服務,解決了Redis由于存儲資料量巨大而導緻記憶體不夠用的容量瓶頸。但其叢集管理功能較為薄弱,需要使用twemproxy或者codis實作靜态資料分片,資料一緻性較弱。同時由于資料全部存儲在磁盤中,相比于社群版Redis,性能明顯下降。

GaussDB(for Redis)實作了冷熱分離,解決了緩存(cache)與資料庫(Data Base,DB)之間互動通路的問題,當使用者資料量小于記憶體時可以達到和社群版redis相當的性能。通過proxy代理,使上層業務可以不感覺核心處理擴縮容過程中的資料遷移。

使用開源遷移工具pika-port進行Pika到GaussDB(for Redis)的遷移。pika-port僞裝成Pika的從節點運作,通過主從複制的方式進行資料遷移。Pika主節點通過比較pika-port和自己的binlog偏移量判斷做全量遷移還是增量遷移。如果需要做全量遷移,Pika主節點會将全量資料快照發送給pika-port,pika-port将解析後的快照資料發送給GaussDB(for Redis)。全量遷移結束後進入增量遷移,pika-port将增量資料解析後以redis指令的形式發送給GaussDB(for Redis)。

華為雲PB級資料庫GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)遷移系列(上)

部署遷移工具pika-port

確定源端Pika執行個體、pika-port和目标端GaussDB(for Redis)執行個體網絡互通。

正确修改pika-port配置檔案;

啟動遷移工具pika-port;

跟蹤日志,確定全量遷移完成後停服,進入增量遷移過程;

增量遷移完成後,校驗遷移資料的正确性和完備性;

校驗完畢将業務切到GaussDB (for Redis).

pika-port僞裝成源端Pika的從節點,隻讀取全量和增量資料,無資料受損風險。

源端增加了和pika-port的主從同步流程,可能會影響源端性能。

全量和增量結合遷移可以不停服,業務切入GaussDB(for Redis)時短暫停服。

環境:Pika(單節點)和pika-port同時部署在華為雲8U32GB的彈性雲伺服器上,目标端為8U16GB,3節點GaussDB(for Redis)執行個體。

預置資料:使用memtier_benchmark工具預置200GB資料。

遷移性能:約50000qps。

高斯 Redis 在社群版 Redis 的基礎上,結合華為自研強一緻存儲DFV Pool,具有強一緻、秒擴容、超可用、低成本等優勢,保證了計數的準确性、可靠性。

本文作者:華為雲高斯Redis團隊。

杭州西安深圳履歷投遞:[email protected]

更多技術文章,關注高斯Redis官方部落格:https://bbs.huaweicloud.com/community/usersnew/id_1614151726110813

點選關注,第一時間了解華為雲新鮮技術~

繼續閱讀