Redisパイプラインを使用すると、ApsaraDB RDS for MySQLまたはオンプレミスMySQLデータベースからTair (Redis OSS-compatible) にデータを効率的に移行できます。 このトピックで説明する手順を実行すると、他のエンジンを使用する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", #The number 12 specifies the number of the following fields. This value depends on the data structure of the MySQL table. '$', LENGTH('HMSET'), '\r\n', #The HMSET variable specifies the command that you run to write data to Redis. 'HMSET', '\r\n', '$', LENGTH(id), '\r\n', #The id variable specifies the first field after you run the HMSET command for fields. This field is converted to the hash key in Redis. id, '\r\n', '$', LENGTH('name'), '\r\n', #The name variable 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 is converted 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' ) 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
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
列を無視したりできます。