DUICUO

Redis データの同期と移行を実行する方法は?

[[378331]]

序文

通常、ある Redis インスタンスから別の Redis インスタンスにデータを同期または移行するにはどうすればよいでしょうか?

データ移行は一般的に簡単です。ソースRedisインスタンスからRDBファイルを直接エクスポートし、それをターゲットRedisインスタンスにインポートするだけです。しかし、リアルタイムの増分同期はより困難です。このニーズに対処するための良い方法は何でしょうか?ここでは、Alibaba Cloudのオープンソースツールであるredis-shakeをご紹介します。

  • Redis-shake プロジェクトのアドレスは次のとおりです: https://github.com/alibaba/RedisShake

基本機能

redis-shakeは、redis-portをベースに改良した製品です。解析、リカバリ、バックアップ、同期の4つの機能をサポートしています。以下では、主に同期(sync)について紹介します。

  • 復元: RDB ファイルを宛先の Redis データベースに復元します。
  • バックアップ ダンプ: RDB ファイルを使用してソース Redis のデータ全体をバックアップします。
  • 解析 (デコード): RDB ファイルを読み取り、保存のために JSON 形式に解析します。
  • 同期:ソースと宛先のRedis間のデータ同期、完全および増分データ移行、オンプレミスからAlibaba Cloudへの同期、異なるオンプレミス環境間の同期をサポートします。また、単一ノード、マスタースレーブバージョン、クラスターバージョン間の同期もサポートします。ソースがクラスターバージョンの場合、RedisShakeインスタンスを起動して異なるデータベースノードからデータをプルすることは可能ですが、ソース側でスロット移動機能を有効にすることはできません。宛先がクラスターバージョンの場合、1つ以上のデータベースノードへの書き込みが可能です。
  • 同期機能:ソースとターゲットのRedisインスタンス間のデータ同期をサポートしますが、完全な移行のみをサポートします。移行は「scan」コマンドと「restore」コマンドを使用して実行され、異なるクラウドプロバイダーやRedisバージョン間の移行をサポートします。

基本原則

redis-shakeの基本原理は、スレーブノードがソースRedisクラスターに参加する様子をシミュレートすることです。まず、フルフェッチとリプレイを実行し、次に増分フェッチ(psyncコマンドを使用)を実行します。下の図をご覧ください。


ソースがクラスターモードの場合、プルには1回のredis-shakeのみを起動する必要があります。ソース側のスロット移動操作は有効化しないでください。ターゲットがクラスターモードの場合、単一のノードに書き込み、その後スロットを移行できます。多対多の書き込みも可能です。

現在、redis-shakeは宛先へのシングルリンク実装を使用しています。通常の状況では、これはボトルネックにはなりません。しかし、QPSが高い極端なケースでは、このパフォーマンスがボトルネックになる可能性があり、将来的に最適化する予定です。また、redis-shakeから宛先へのデータ同期は非同期で行われ、読み取りと書き込みの操作は2つの別々のスレッドで実行されるため、ネットワーク遅延によるパフォーマンスの低下を軽減できます。

高効率

完全同期フェーズは並行して実行され、増分同期フェーズは非同期で実行されるため、ミリ秒レベルのレイテンシ(ネットワークレイテンシに依存)を実現します。さらに、大きなキーを一括で取得することで、同期パフォーマンスを最適化します。

モニター

ユーザーは RESTful API を使用して、redis-shake をリアルタイムで監視するためのメトリックを取得できます: curl 127.0.0.1:9320/metric。

チェック

同期の正確性を確認するにはどうすればいいでしょうか?オープンソースの redis-full-check を使用できます: https://github.com/aliyun/redis-full-check?spm=a2c6h.12873639.0.0.4b8974955p9YxV。

サポートされているバージョン

  • バージョン 2.8 と 5.0 間の同期をサポートします。
  • Codisがサポートされています。
  • オンプレミスからクラウド、クラウドからクラウド、クラウドからオンプレミス (Alibaba Cloud は現在マスター/スレーブ バージョンをサポートしています)、およびその他のクラウドから Alibaba Cloud へのリンクをサポートし、ユーザーがハイブリッド クラウド シナリオを柔軟に構築できるようにします。

予防

  • ターゲットデータベースのデータエビクションポリシー(maxmemory-policy)がnoeviction以外の値に設定されている場合、ターゲットデータベースとソースデータベース間で不整合が発生する可能性があります。データエビクションポリシーの詳細については、Redisのデータエビクションポリシーの概要を参照してください。
  • ソース データベース内の一部のキーが有効期限メカニズムを使用している場合、期限切れのキーが時間内に削除されていない可能性があるため、ターゲット データベースに表示されるキーの数 (info コマンドなど) は、ソース データベース内のキーの数よりも少なくなります。

注: 有効期限メカニズムのないキー、または有効期限が切れていないキーの数は、ソース ライブラリとターゲット ライブラリの両方で同じです。

Redis-shakeをインストールする

  1. # Redis-shakeインストールパッケージをダウンロードする
  2. $ wget 'http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/120287/cn_zh/1608173646665/redis-shake-v2.0.3.tar.gz'  
  3.  
  4. # Redis-shakeインストールパッケージを解凍します
  5. $ tar xzf redis-shake-v2.0.3.tar.gz
  6.  
  7. # 設定ファイルを変更する
  8. $ cd redis-shake-v2.0.3/
  9. $ vim redis-shake.conf
  10.  
  11. # Redis-shake を起動し、データの移行を開始します。
  12. $ ./redis-shake.linux -type=sync -conf=redis-shake.conf
  • 起動エラーが発生した場合は、関連する原因と解決策について、「一般的なエラーと解決策」を参照してください。

参考リンク

https://developer.aliyun.com/article/691794

https://help.aliyun.com/document_detail/117311.html?spm=a2c4g.11186623.6.651.57fc1516WTPTT9