ApsaraDB for Redisのパイプライン機能を使用して、RDS MySQLまたはオンプレミスの MySQL データベースから ApsaraDB for Redis にデータを効率的に移行できます。 このトピックで説明されている手順に基づいて、他のエンジンを使用する RDS データベースから ApsaraDB for Redis にデータを移行することもできます。
シナリオ
ApsaraDB for Redis をアプリケーションとデータベース間のキャッシュとして使用して、従来のリレーショナルデータベースのサービス機能を拡張できます。 ビジネスエコシステムの最適化を図る方法として、 AdisaraDB for Redis の典型的なアプリケーションシナリオの 1 つです。 このサービスでは、ビジネスのホットデータが保存されます。 ApsaraDB for Redisの 一般的なデータをお使いのアプリケーションから簡単に取得でき、また ApsaraDB for Redis を使用して、アクティブなユーザーのセッションを対話型アプリケーションに保存できます。 このサービスにより、バックエンドリレーショナルデータベースの負荷が大幅に削減され、ユーザーエクスペリエンスが向上します。
同様の方法で、他のリレーショナルデータベースから ApisaraDB for Redis にデータを移行することもできます。 移行にあたっては、移行元データベースからデータを抽出し、データ形式を変換してから、別のデータベースにデータを送信する必要があります。 この移行方法では、他の異種データベース間のデータ移行にも適しています。
前提条件
- テーブルデータを移行元データとして利用する RDS MySQLインスタンスが作成されていること。
- 移行先として ApsaraDB for Redis インスタンスが作成されていること。
- Linux システムを実行する ECS インスタンスが作成されていること。
- それぞれのインスタンスが、同一リージョン内の同じ VPC で実行されていること。
- DS MySQL および ApsaraDB for Redis インスタンスのホワイトリストに ECS インスタンスの内部 IP アドレスが追加されていること。
- データを抽出、変換、および送信するため、ECS インスタンスに MySQL および Redis データベースがインストールされていること。
移行前のデータ
このテーブルには6つのカラムがあります。 移行後、MySQL テーブルの id カラムの値は、ApsaraDB for Redis のハッシュテーブルのキーに変換されます。 他のカラムのカラム名はハッシュテーブルのフィールドに変換され、これらのカラムの値は対応するフィールドの値に変換されます。 移行に用いるスクリプトとコマンドは、実際のシナリオに応じて変更できます。
手順
- ソースデータ構造を分析し、ECS インスタンスで以下の移行スクリプトを作成してから、mysql_to_redis.sql ファイルにスクリプトを保存します。
SELECT CONCAT( "*12\r\n", #The number 12 specifies the number of the following fields, and depends on the data structure of the MySQL table. '$', LENGTH('HMSET'), '\r\n', #HMSET specifies the command that you use when writing data to ApsaraDB for Redis. 'HMSET', '\r\n', '$', LENGTH(id), '\r\n', #id specifies the first field after you run the HMSET command for fields. This field changes to the key of the hash table in ApsaraDB for Redis. id, '\r\n', '$', LENGTH('name'), '\r\n', #'name' is passed to the hash table as a string field. Other fields such as 'sdate' are processed in the same way. 'name', '\r\n', '$', LENGTH(name), '\r\n', #The name variable specifies the company name in the MySQL table. This variable changes to the value of the field generated by the 'name' parameter. Other fields such as 'sdate' are processed in the same way. 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\n' ) FROM company AS c
- ECS インスタンスで以下のコマンドを実行し、データを同期します。
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 RDS MySQL データベースのエンドポイントを指定します。 注mysql
に続けて指定する -h オプションです。rm-bp1xxxxxxxxxxxx.mysql.rds.aliyuncs.com 注 Linux サーバーを RDS MySQL データベースに接続するためのエンドポイントを使用します。-P RDS MySQL データベースのサービスポートを指定します。 3306 -u RDS MySQL データベースのユーザー名を指定します。 testuser -D 移行先の MySQL テーブルが存在するデータベースを指定します。 mydatabase -p RDS MySQL データベースに接続するためのパスワードを指定します。 注- パスワードが設定されていない場合、このオプションを指定する必要はありません。
- セキュリティ向上のため、パスワードを指定せずに -p オプションを入力することもできます。 その場合、コマンドを実行してから、CLI (コマンドプロンプト) に従ってパスワードを入力します。
Mysqlpwd233 --skip-column-names カラム名はクエリ結果に書き込まない場合に指定します。 値の指定は不要です。 --raw 出力カラムの値をエスケープしない場合に指定します。 値の指定は不要です。 -h ApsaraDB for Redis のエンドポイントを指定します。 注redis-cli
に続けて指定する -h オプションです。r-bp1xxxxxxxxxxxxx.redis.rds.aliyuncs.com 注 Linux サーバーを ApisaraDB for Redis データベースに接続するためのエンドポイントを使用します。--pipe ApsaraDB for Redisのパイプライン機能を使用してデータを送信します。 値の指定は不要です。 -a ApsaraDB for Redis に接続するためのパスワードを指定します。 注 パスワードが設定されていない場合、またはパスワードが必要ない場合は、このオプションを指定する必要はありません。Redispwd233 注 実行結果のerrors
は、システムがコマンドを実行した際に発生したエラーの数を示します。 また、replies
は、システムから返された応答の数を示します。errors
の値が0で、replies
の値が MySQL テーブルの項目数に等しい場合、移行が完了したことを示します。
移行後のデータ
データの移行後、MySQL テーブルの 1 つの項目は、ApsaraDB for Redis のハッシュテーブルの 1 つの項目に対応します。 コマンド HGETALL を実行して特定の項目を照会すると、以下のような結果が得られます。
実際のシナリオで必要な照会方法に基づいて、移行ソリューションを調整できます。 たとえば、MySQLテーブルの他のカラムをハッシュテーブルのキーに変換して id カラムをフィールドに変換したり、id カラムを無視したりできます。