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 をキャッシュとして使用するには、最初にリレーショナルデータベースから ApsaraDB for Redisにデータを送信する必要があります。 キーと値の構造でデータを保存するApsaraDB for Redis データベースに、リレーショナルデータベースのテーブルを直接送信することはできません。 移行の前に、ソースデータを特別な構造に変換する必要があります。 このトピックでは、ネイティブツールを使用して、MySQL データベースから ApisaraDB for Redis にテーブルを簡単かつ効率的に移行する方法について説明します。 ApsaraDB for Redis のパイプライン機能を使用して、MySQL テーブルのデータを ApsaraDB for Redis のハッシュテーブルに送信できます。
このトピックでは、Alibaba Cloud RDS MySQL インスタンスを移行元として、また ApsaraDB for Redis インスタンスを移行先として説明します。 この例では、ECS インスタンスで移行コマンドを実行するLinux環境をインストールします。 それぞれのインスタンスは同じ VPC で実行されるため、相互に接続できます。

同様の方法で、他のリレーショナルデータベースから ApisaraDB for Redis にデータを移行することもできます。 移行にあたっては、移行元データベースからデータを抽出し、データ形式を変換してから、別のデータベースにデータを送信する必要があります。 この移行方法では、他の異種データベース間のデータ移行にも適しています。

前提条件

  • テーブルデータを移行元データとして利用する RDS MySQLインスタンスが作成されていること。
  • 移行先として ApsaraDB for Redis インスタンスが作成されていること。
  • Linux システムを実行する ECS インスタンスが作成されていること。
  • それぞれのインスタンスが、同一リージョン内の同じ VPC で実行されていること。
  • DS MySQL および ApsaraDB for Redis インスタンスのホワイトリストに ECS インスタンスの内部 IP アドレスが追加されていること。
  • データを抽出、変換、および送信するため、ECS インスタンスに MySQL および Redis データベースがインストールされていること。
上記は、Alibaba Cloud 内でデータを移行する場合の前提条件です。 オンプレミス環境でデータを移行する場合は、移行を実行する Linux サーバーが移行元のリレーショナルデータベースと移行先の ApsaraDB for Redis データベースに接続できることを確認してください。

移行前のデータ

このトピックでは、 custm_info データベースの companyテーブルに保存されているテストデータを移行する方法について説明します。 company テーブルには、下表に示すテストデータが保存されています。

このテーブルには6つのカラムがあります。 移行後、MySQL テーブルの id カラムの値は、ApsaraDB for Redis のハッシュテーブルのキーに変換されます。 他のカラムのカラム名はハッシュテーブルのフィールドに変換され、これらのカラムの値は対応するフィールドの値に変換されます。 移行に用いるスクリプトとコマンドは、実際のシナリオに応じて変更できます。

手順

  1. ソースデータ構造を分析し、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
  2. 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
    図 1. サンプルコード
    実行結果の errors は、システムがコマンドを実行した際に発生したエラーの数を示します。 また、replies は、システムから返された応答の数を示します。 errors の値が0で、replies の値が MySQL テーブルの項目数に等しい場合、移行が完了したことを示します。

移行後のデータ

データの移行後、MySQL テーブルの 1 つの項目は、ApsaraDB for Redis のハッシュテーブルの 1 つの項目に対応します。 コマンド HGETALL を実行して特定の項目を照会すると、以下のような結果が得られます。

実際のシナリオで必要な照会方法に基づいて、移行ソリューションを調整できます。 たとえば、MySQLテーブルの他のカラムをハッシュテーブルのキーに変換して id カラムをフィールドに変換したり、id カラムを無視したりできます。