Tair (Redis OSS-compatible) インスタンスへのデータ移行が完了したら、redis-full-check ツールを使用してデータ整合性を検証できます。
前提条件
-
データ移行が完了していること。
-
Linux オペレーティングシステムを実行する ECS インスタンスが作成済みであること。 詳細については、「ECS インスタンスの作成」をご参照ください。
-
ECS インスタンスがソースとターゲットの両方の Redis インスタンスにアクセスできること。
説明-
ECS インスタンスと Redis インスタンスが同じ VPC およびアベイラビリティーゾーンにある場合は、ECS インスタンスの内部 IP アドレスを Redis の IP ホワイトリストに追加します。 詳細については、「IP ホワイトリストの設定」をご参照ください。
-
ECS インスタンスと Redis インスタンスが同じ VPC およびアベイラビリティーゾーンにない場合は、パブリックエンドポイントを使用して Redis インスタンスに接続できます。 詳細については、「パブリックエンドポイントを使用した Tair (Redis OSS-compatible) インスタンスへの接続」をご参照ください。
-
ユースケース
データ移行中にエラーが発生すると、ソースインスタンスとターゲットインスタンスの間で不整合が生じる可能性があります。 redis-full-check を使用してこれらの不整合を検出し、データを修正できます。
redis-full-check は、Alibaba Cloud が開発した Redis データ検証ツールです。 ソースとターゲットからデータを抽出し、複数回の比較を実行し、差異を SQLite3 データベースに記録します。
redis-full-check の詳細については、「redis-full-check GitHub リポジトリ」をご参照ください。
操作手順
-
Tair (Redis OSS-compatible) インスタンスにアクセスできる ECS インスタンスに接続します。 詳細については、「ECS インスタンスに接続する」をご参照ください。
-
redis-full-check ツールをダウンロードします。
説明最新のリリースをダウンロードすることを推奨します。
-
redis-full-check.tar.gz ファイルを解凍します。
tar -xvf redis-full-check.tar.gz -
次のコマンドを実行して、データ検証を行います:
./redis-full-check -s "<source_endpoint_1:port;source_endpoint_2:port;...>" -p <source_password> -t <destination_endpoint:port> -a <destination_password> --m=1 --sourcedbfilterlist=0;2 --targetdbfilterlist=0;2コマンドの例を次に示します。
./redis-full-check -s "10.xx.xx.1:6379" -p SourcePwd233 -t "r-bp1zc********.redis.rds.aliyuncs.com:6379" -a testaccount:Test1234 --m=1 --sourcedbfilterlist=0;2 --targetdbfilterlist=0;2パラメーターの完全なリストについては、「redis-full-check 設定ガイド」をご参照ください。
表 1. redis-full-check の共通パラメーター
パラメーター
説明
例
-s
ソース Redis インスタンスのエンドポイントとポート。
説明-
ソースがクラスターインスタンスの場合、複数のエンドポイントをセミコロン (;) で区切ります。
-
エンドポイントを二重引用符 ("") で囲みます。
-
このパラメーターは必須です。
r-bp1xxxxxxxxxxxxx.redis.rds.aliyuncs.com:6379"10.xx.xx.1:7000;10.xx.xx.1:7001;10.xx.xx.2:7002;10.xx.xx.2:7003"-p
ソース Redis インスタンスの認証情報。形式は
<username>:<password>です。 例:testaccount:Test1234。 インスタンスにユーザー名が必要ない場合は、パスワードのみを指定します。 インスタンスにパスワードが必要ない場合は、このパラメーターを省略できます。SourcePwd233またはtestaccount:Test1234-t
ターゲット Redis インスタンスのエンドポイントとポート。
説明-
ターゲットがクラスターインスタンスの場合、複数のエンドポイントをセミコロン (;) で区切ります。
-
エンドポイントを二重引用符 ("") で囲みます。
-
このパラメーターは必須です。
r-bp1xxxxxxxxxxxxx.redis.rds.aliyuncs.com:6379"10.xx.xx.1:7000;10.xx.xx.1:7001;10.xx.xx.2:7002;10.xx.xx.2:7003"-a
ターゲット Redis インスタンスの認証情報。形式は
<username>:<password>です。 例:testaccount:Test1234。 インスタンスにユーザー名が必要ない場合は、パスワードのみを指定します。 インスタンスにパスワードが必要ない場合は、このパラメーターを省略できます。TargetPwd233またはtestaccount:Test1234--sourcedbtype
ソースインスタンスのタイプ。 有効値:
-
0 (デフォルト): スタンドアロンまたはスタンダード
-
1: クラスター (直接接続モード)
-
2: クラスター (プロキシモード)
--sourcedbtype=1--sourcedbfilterlist
ソース Redis インスタンスで検証するデータベース。
説明-
このパラメーターは Redis OSS クラスターインスタンスには必要ありません。
-
他のクラスターインスタンスタイプの場合、デフォルトですべてのデータベースが検証されます。
-
複数のデータベースを指定するには、それらの番号をセミコロン (;) で区切ります。
--sourcedbfilterlist=0;1;2--targetdbtype
ターゲットインスタンスのタイプ。 有効値:
-
0 (デフォルト): スタンドアロンまたはスタンダード
-
1: クラスター (直接接続モード)
-
2: クラスター (プロキシモード)
--targetdbtype=0--targetdbfilterlist
ターゲット Redis インスタンスで検証するデータベース。
説明-
このパラメーターは Redis OSS クラスターインスタンスには必要ありません。
-
他のクラスターインスタンスタイプの場合、デフォルトですべてのデータベースが検証されます。
-
複数のデータベースを指定するには、それらの番号をセミコロン (;) で区切ります。
--targetdbfilterlist=0;1;2-d
不整合なデータのリストの出力ファイル名。 デフォルトのベース名は
result.dbです。xxx.db--comparetimes
検証回数。 デフォルト: 3。 最小値: 1。 5 以下の値を推奨します。
--comparetimes=1
-m
検証モード。 有効値:
-
1: 完全検証
-
2 (デフォルト): 値の長さのみを検証します
-
3: キーの存在のみを検証します
-
4: 完全検証を実行しますが、大きいキーは無視します
-m=1
--qps
QPS の上限。 デフォルト値は 15000 です。
説明-
最小値は 1 です。
-
最大値はサーバーのパフォーマンスに依存します。
--qps=10
--filterlist
比較するキーのリスト。 縦棒 (|) で区切ります。
説明-
abc*: 「abc」で始まるすべてのキーに一致します。
-
abc: キー "abc" にのみ一致します。
--filterlist=abc*|efg|m*
説明コマンドが終了すると、ツールはコマンドラインにサマリーを出力します。 出力例は、2 つの不整合なキーが存在することを示しています。 値が 0 の場合は、データに整合性があることを意味します。
all finish successfully, totally 2 keys or fields conflict -
-
不整合なキーを含む SQLite3 データベースを表示します。
-
sqlite3 result.db.3を実行します。説明デフォルトでは、不整合なデータのリストは
result.db.3に保存されます。 これは、検証回数 (comparetimes) のデフォルト値が 3 であり、ファイル名に付加されるためです。 -
SELECT * FROM key;を実行します。図 1. 不整合なデータのリストの表示
[root@redis-server RedisFullCheck]# sqlite3 result.db.3 SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> SELECT * FROM key; 1|differentkey1|string|lack_target|0|10|0 2|differentkey2|list|lack_target|0|4|0 sqlite>説明SQLite3 データベースには、
keyとfieldの 2 つのテーブルが含まれています。-
keyテーブルには、不整合なキーが格納されます。 -
hash、set、zset、list のデータ型の場合、
fieldテーブルには不整合なデータの詳細が格納されます。
-
-