ApsaraDB RDS for MySQL またはオンプレミスの MySQL データベースから Tair (Redis OSS-compatible) へ、Redis パイプラインを使用して効率的にデータを移行できます。また、このトピックで説明する手順を実行することで、他のエンジンを使用する RDS データベースから Tair (Redis OSS-compatible) へデータを移行することもできます。
背景情報
Redis の典型的なユースケースの 1 つは、アプリケーションとデータベース間のキャッシュレイヤーとしての実装です。これにより、従来のリレーショナルデータベースのサービス機能を拡張し、ビジネスエコシステム全体を最適化できます。Redis はホットデータを格納するために使用されます。アプリケーションは Redis からホットデータを直接取得できます。さらに、Redis はインタラクティブなアプリケーションを使用するアクティブなユーザーのセッションを維持できます。これにより、バックエンドのリレーショナルデータベースの負荷が軽減され、ユーザーエクスペリエンスが向上します。
Redis をキャッシュとして使用するには、まずリレーショナルデータベースから Redis にデータを転送する必要があります。リレーショナルデータベース内のテーブルを、キー・バリュー構造でデータを格納する Redis データベースに直接転送することはできません。開始する前に、ソースデータを特定の構造に変換する必要があります。このトピックでは、オープンソースツールを使用して MySQL データベースから Redis にテーブルを簡単かつ効率的に移行する方法について説明します。Redis パイプラインを使用して、MySQL テーブルのデータを Redis のハッシュテーブルに転送できます。
このトピックでは、ソースの ApsaraDB RDS for MySQL インスタンスから宛先の Tair (Redis OSS-compatible) インスタンスにデータが移行されます。Elastic Compute Service (ECS) インスタンスにデプロイされた Linux 環境を使用して、データ移行コマンドを実行します。これらのインスタンスは、相互に通信できるように、同じ VPC にデプロイされます。
同じ手順に従って、他のリレーショナルデータベースから Redis にデータを移行できます。移行プロセス中に、ソースデータベースからデータを抽出し、データ形式を変換してから、異種データベースにデータを転送する必要があります。この移行方法は、他の異種データベース間のデータ移行にも適しています。
前提条件
ApsaraDB RDS for MySQL インスタンスが作成され、移行するテーブルが格納されていること。
宛先インスタンスとして Tair (Redis OSS-compatible) インスタンスが作成されていること。
Linux システムを実行する ECS インスタンスが作成されていること。
これらのインスタンスが同じ VPC とリージョンにデプロイされていること。
ECS インスタンスのプライベート IP アドレスが、ApsaraDB RDS for MySQL および Tair (Redis OSS-compatible) インスタンスの IP アドレスホワイトリストに追加されていること。
データを抽出、変換、転送するために、MySQL および Redis サービスが ECS インスタンスで実行されていること。
これらの前提条件は、Alibaba Cloud 上でデータを移行する場合にのみ適用されます。オンプレミス環境でデータを移行する場合は、移行を実行する Linux サーバーがソースのリレーショナルデータベースと宛先の Redis データベースに接続できることを確認してください。
移行前のデータ
このトピックでは、[custm_info] データベースの [company] テーブルに格納されているテストデータを移行する方法について説明します。[company] テーブルには、次の表に示すテストデータが含まれています。
テーブルには 6 つの列があります。移行後、MySQL テーブルの id 列の値は Redis ハッシュのキーになります。他の列の名前はハッシュフィールドになり、列の値は対応するフィールドの値になります。要件に応じて、移行手順のスクリプトとコマンドを調整できます。
手順
ソースデータ構造を分析し、ECS インスタンスで次の移行スクリプトを作成し、スクリプトを mysql_to_redis.sql ファイルに保存します。
SELECT CONCAT( "*12\r\n", #数値 12 は、後続のフィールドの数を指定します。この値は MySQL テーブルのデータ構造によって異なります。 '$', LENGTH('HMSET'), '\r\n', #HMSET 変数は、Redis にデータを書き込むために実行するコマンドを指定します。 'HMSET', '\r\n', '$', LENGTH(id), '\r\n', #id 変数は、フィールドに対して HMSET コマンドを実行した後の最初のフィールドを指定します。このフィールドは Redis のハッシュキーに変換されます。 id, '\r\n', '$', LENGTH('name'), '\r\n', #name 変数は、文字列フィールドとしてハッシュテーブルに渡されます。sdate などの他のフィールドも同様に処理されます。 'name', '\r\n', '$', LENGTH(name), '\r\n', #name 変数は、MySQL テーブルの会社名を指定します。この変数は、'name' パラメーターによって生成されたフィールドの値に変換されます。sdate などの他のフィールドも同様に処理されます。 name, '\r\n', '$', LENGTH('sdate'), '\r\n', 'sdate', '\r\n', '$', LENGTH(sdate), '\r\n', sdate, '\r\n', '$', LENGTH('email'), '\r\n', 'email', '\r\n', '$', LENGTH(email), '\r\n', email, '\r\n', '$', LENGTH('domain'), '\r\n', 'domain', '\r\n', '$', LENGTH(domain), '\r\n', domain, '\r\n', '$', LENGTH('city'), '\r\n', 'city', '\r\n', '$', LENGTH(city), '\r\n', city, '\r' ) FROM company AS cECS インスタンスで次のコマンドを実行してデータを移行します:
mysql -h <MySQL host> -P <MySQL port> -u <MySQL username> -D <MySQL database name> -p --skip-column-names --raw < mysql_to_redis.sql | redis-cli -h <Redis host> --pipe -a <Redis password>表 1. オプション
オプション
説明
例
-h
ApsaraDB RDS for MySQL データベースのエンドポイント。
説明これはコマンドの最初の -h です。
rm-bp1xxxxxxxxxxxx.mysql.rds.aliyuncs.com
説明エンドポイントを使用して、Linux サーバーを ApsaraDB RDS for MySQL データベースに接続します。
-P
ApsaraDB RDS for MySQL データベースのサービスポート。
3306
-u
ApsaraDB RDS for MySQL データベースへの接続に使用するユーザー名。
testuser
-D
移行する MySQL テーブルが格納されているデータベース。
mydatabase
-p
ApsaraDB RDS for MySQL データベースへの接続に使用するパスワード。
説明パスワードが設定されていない場合、このパラメーターを指定する必要はありません。
セキュリティを強化するために、-p のみを入力してコマンドを実行し、プロンプトが表示されたらパスワードを入力できます。
Mysqlpwd233
--skip-column-names
列名はクエリ結果に書き込まれません。
値は不要です。
--raw
出力列の値はエスケープされません。
値は不要です。
-h
Redis データベースへのアクセスに使用されるエンドポイント。
説明これは
redis-cliの後の -h オプションを指します。r-bp1xxxxxxxxxxxxx.redis.rds.aliyuncs.com
説明エンドポイントを使用して、Linux サーバーを Redis データベースに接続します。
--pipe
Redis パイプラインを使用してデータを転送します。
値は不要です。
-a
Redis データベースへのアクセスに使用されるパスワード。
説明パスワードが設定されていない場合、このパラメーターを指定する必要はありません。
Redispwd233
図 1. サンプルコード
説明出力では、
errorsは実行中に発生したエラーの数を示し、repliesは受信した返信の数を示します。errorsの値が 0 で、repliesの値が MySQL テーブルのレコード数と同じ場合、移行は成功です。
移行後のデータ
データが移行されると、MySQL テーブルの 1 つのデータエントリが Redis のハッシュテーブルの 1 つのデータエントリに対応します。HGETALL コマンドを実行してデータエントリをクエリし、次の結果を表示できます:

シナリオで必要なクエリメソッドに基づいて移行計画を調整できます。たとえば、MySQL データの他の列をハッシュキーに変換し、id 列をフィールドに変換したり、id 列を完全に省略したりできます。