ApsaraDB RDS for MySQL インスタンスを OpenSearch データソースとして接続することで、手動でデータをプッシュすることなく、検索インデックスを最新の状態に保つことができます。OpenSearch は、設定時に完全スナップショットを取得し、その後、バイナリログのレプリケーションを通じて増分変更を自動的に同期します。
前提条件
開始する前に、以下をご確認ください。
ご利用の RDS インスタンスは、MySQL エンジンバージョン 5.2 から 8.0 を実行し、High-availability Edition である必要があります (Basic Edition および Enterprise Edition はサポートされていません)。
RDS インスタンスは、OpenSearch アプリケーションと同じリージョンに存在する必要があります。
RDS インスタンスは、VPC にデプロイされています。
RDS インスタンスは、OpenSearch コンソールへのログインに使用した同じ Alibaba Cloud アカウントで購入されている必要があります。
RDS インスタンスは、クローンインスタンス、読み取り専用インスタンス、または PolarDB-X インスタンスではない必要があります。
データベースアカウントのパスワードにパーセント記号(
%)が含まれていない場合、インデックスの再作成が失敗し、「Illegal hex characters in escape (%) pattern」というエラーが発生します。接続に使用するアカウントは、特権アカウントではない必要があります。
注:標準アプリケーションに RDS データソースを設定する場合、SDK または API オペレーションを使用してそのアプリケーションに増分データをプッシュすることはできず、フィルター条件を指定することもできません。
仕組み
RDS インスタンスを接続すると、OpenSearch は選択されたテーブルの完全スナップショットを取得し、データをインデックス化します。初回ロード後、増分変更は以下の 3 つの同期モードのいずれかを通じて反映されます。
| モード | 使用場面 |
|---|---|
| 自動同期 | デフォルトモードです。OpenSearch はバイナリログを介して変更を検出します。 |
| DTS によるリアルタイム同期 | 低遅延要件。詳細については、「DTS リアルタイム同期の設定 |
| 完全データ同期のみ | インデックスの再作成により、継続的な増分同期なしでインデックスを最初から再構築します。 |
完全データはプライマリデータベースからのみ取得されます。完全データのインポートとインデックスの再作成は、オフピーク時にスケジュールしてください。
注:RDS データソースに 15 日以上増分データがない場合、同期が失敗することがあります。手動でのインデックス再作成を実行するか、オフライン変更を適用して回復してください。
フィールドマッピングの動作
OpenSearch は、MySQL データを次のようにマッピングします。
ソーステーブルの各行は、OpenSearch インデックス内の 1 つのドキュメントになります。
各列は、そのドキュメント内のフィールドになります。
DATETIMEおよびTIMESTAMP列の値はミリ秒に変換されます。アプリケーションスキーマで、対応する送信先フィールドのタイプを TIMESTAMP に設定してください。
複数テーブルおよび複数ソースのマージ
1 つまたは複数のデータソースにまたがる複数のテーブルの行を、単一のアプリケーションテーブルにマッピングできます。ソーステーブルは同じテーブルスキーマを共有する必要があり、データ処理プラグインの構成はすべてのデータソースで同一である必要があります。プライマリキーの値は一意である必要があります。重複する値は上書きされます。
サポートされているパターン:
1 つのデータソース内の複数のソーステーブルを 1 つのアプリケーションテーブルにマッピングする
それぞれが 1 つ以上のソーステーブルを持つ複数のデータソースを 1 つのアプリケーションテーブルにマッピングする
データソースの設定
ApsaraDB RDS for MySQL データソースは、新しいアプリケーションを作成するとき、またはオフライン変更を介して既存のアプリケーションに追加するときに構成できます。
注意: データソースを Resource Access Management (RAM) ユーザーとして設定するには、まず RAM ユーザーに必要な権限を付与します。サービスロール AliyunServiceRoleForOpenSearch は、RAM ユーザーアカウントではなく、Alibaba Cloud アカウントを使用して作成する必要があります。
ステップ1:データベースアカウントとバイナリログの設定
接続する前に、OpenSearch のアクセスを許可するように RDS インスタンスを設定します。
最小権限を持つ専用アカウントの作成
ご利用の RDS インスタンスで次の SQL を実行して、読み取り専用アカウントを作成し、必要な権限を付与します (MySQL 5.7 以降で必須)。
CREATE USER '<username>'@'%' IDENTIFIED BY '<password>';
GRANT SELECT, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '<username>'@'%';
FLUSH PRIVILEGES;ご利用の環境に合わせて <username> と <password> を置き換えてください。
OpenSearch が ApsaraDB RDS for MySQL データソースにアクセスするには、以下の最小権限が必要です。
OpenSearch に
SHOW CREATE TABLE文を実行する権限が付与されていること。OpenSearch に
REPLICATION SLAVEまたはREPLICATION CLIENT文を実行する権限が付与されていること。binlog_row_imageパラメーターの値がFULLに設定されていること。binlog_formatパラメーターの値がROWに設定されていること。
Data Transmission Service (DTS) を使用してデータを同期する場合、アカウントがソースデータベース内のすべてのテーブルをクエリする権限を持っていることを確認してください。さらに、SHOW CREATE TABLE * 文が期待どおりに実行できることを確認してください。アカウントにこれらの権限がない場合、リアルタイム同期が失敗することがあります。
設定後にアカウントの権限を変更しないでください。アカウントの変更は、リアルタイム同期を中断させ、新しいアプリケーションバージョンの作成を妨げる可能性があります。アカウントやパスワードを変更する必要がある場合は、既存のデータソースを削除し、RDS インスタンスを再追加してください。
RDS インスタンスで SSL 暗号化が有効になっている場合は、SSL 証明書を有効に保ってください。証明書の有効期限が切れると、接続エラーが発生します。
バイナリログ設定の確認
OpenSearch では、RDS インスタンスで次のバイナリログ設定が必要です。
binlog_format = ROW
binlog_row_image = FULLbinlog_format:OpenSearch が行レベルの変更を読み取れるように、ROWである必要があります。binlog_row_image:完全な行イメージがバイナリログに書き込まれるように、FULLである必要があります。
MySQL 5.6 の場合、loose_max_execution_time と loose_max_statement_time のしきい値をより大きな値に増やしてください。これを行わないと、インデックスの再作成が Query execution was interrupted, max_statement_time exceeded というエラーで失敗する可能性があります。
注: バイナリロギングが無効になっている状態でのレプリカクライアントおよびレプリカスレーブモードはサポートされていません。詳細については、「ソースデータベースのバイナリロギングに関する事前チェック」をご参照ください。
ステップ2:OpenSearch の IP アドレスを RDS ホワイトリストに追加
OpenSearch がネットワーク経由で RDS インスタンスにアクセスできる必要があります。ご利用のリージョンの CIDR ブロックを RDS インスタンスの IP アドレスホワイトリストに追加してください。
| リージョン | CIDR ブロック |
|---|---|
| 中国 (杭州) | 100.104.190.128/26, 100.104.241.128/26 |
| 中国 (北京) | 100.104.16.192/26, 100.104.179.0/26 |
| 中国 (上海) | 100.104.37.0/26, 100.104.46.0/26 |
| 中国 (深セン) | 100.104.87.192/26, 100.104.132.192/26 |
| 中国 (青島) | 100.104.240.128/26, 100.104.111.128/26 |
| 中国 (張家口) | 100.104.155.192/26, 100.104.238.64/26 |
| ドイツ (フランクフルト) | 100.104.127.0/26, 100.104.35.192/26 |
| 米国 (シリコンバレー) および 米国 (バージニア) | 100.104.193.128/26, 100.104.119.128/26 |
| シンガポール | 100.104.58.192/26, 100.104.74.192/26 |
また、RDS インスタンスに内部エンドポイントが設定されていることを確認してください。内部エンドポイントがない場合、OpenSearch は接続できず、Failed to connect to RDS service. Try again later というエラーが返されます。
ステップ3:データベースへの接続
[Select Data Source] パネルで、[ApsaraDB RDS for MySQL] をクリックし、次に [Connect to Database] をクリックします。

[データベースへの接続] ダイアログボックスで、接続パラメーターを入力し、[接続] をクリックします。

パラメーター 説明 ApsaraDB RDS インスタンス ID ApsaraDB RDS コンソールから取得したインスタンス ID。ID は大文字と小文字を区別します。読み取り専用インスタンスはサポートされていません。例: rm-bp19b4g5n11111111データベース名 接続先のデータベースの名前。大文字と小文字は区別されません。 ユーザー名 接続に使用するアカウント。テーブルスキーマと完全データに対する読み取り権限が必要です。大文字と小文字を区別します。 パスワード アカウントのパスワード。 %を含めることはできません。接続に失敗した場合、OpenSearch は次のいずれかのエラーを返します。
エラー 解決策 ApsaraDB RDS for MySQL インスタンスが OpenSearch アプリケーションと同じリージョンにありません。 インスタンス ID を確認し、RDS インスタンスが OpenSearch アプリケーションと同じリージョンにあることを確認してください。両方が正しい場合は、チケットを送信してください。 RDS サービスへの接続に失敗しました。 インスタンス ID、データベース名、ユーザー名、パスワードが正しいこと、および内部エンドポイントが設定されていることを確認してください。 現在の ApsaraDB RDS for MySQL インスタンスにテーブルが存在しません。 テーブル名を確認し、テーブルが RDS インスタンスに存在することを確認してください。
ステップ4:テーブルの選択
接続が確立されたら、同期するテーブルを選択します。

「[テーブルの選択]」セクションで、左側の[テーブル]ボックスからテーブルを選択し、右向き矢印をクリックして[選択済み]ボックスに移動させ、その後[OK]をクリックします。
テーブル名では大文字と小文字が区別されます。
同じ名前のプレフィックスを持つ複数のテーブルを照合するには、ワイルドカードとしてアスタリスク (
*) を使用します。例えば、table_*はtable_a、table_bなどに一致します。
ステップ5:フィールドのマッピング
[フィールド マッピング] ステップで、OpenSearch に同期するデータベース フィールドを選択し、[OK] をクリックします。

フィールドにデータ処理プラグインを適用するには、そのフィールドの [コンテンツ変換] 列にあるプラス記号 (+) をクリックします。利用可能なプラグインの詳細については、「データ処理プラグインの使用」をご参照ください。

注:異なるテーブルスキーマを使用するソーステーブルのフィールド値を連結することはできません。
ステップ6:フィルター条件の設定
RDS インスタンスから取得する行を制御するためのフィルター条件を指定します。

フィルター条件に一致する行のみがインデックス化されます。完全データが同期された後、フィルター条件を満たさなくなった行は削除されます。これには、プライマリキーの値がアプリケーション内の既存のドキュメントと一致する行も含まれます。
フィルターの構文および構成の詳細については、「ApsaraDB RDS および PolarDB データソース内のフィールドをフィルターするための条件を構成する」をご参照ください。
フィルターのフォーマット:DATE または DATETIME 列でフィルタリングする場合は、ゼロで埋められた完全なフォーマットを使用してください。
createtime>'2018-03-01 00:00:00' (正しい)
createtime>'2018-3-1 00:00:00' (エラーが返される)制限事項
サポートされているのは、High-availability Edition の通常の ApsaraDB RDS for MySQL インスタンスのみです。
サポートされている MySQL エンジンバージョン:5.2 から 8.0。
MySQL 5.6 の場合、
loose_max_execution_timeとloose_max_statement_timeのしきい値を増やしてください。そうしないと、インデックスの再作成がQuery execution was interrupted, max_statement_time exceededというエラーで失敗する可能性があります。REPLACE INTO文はサポートされていません。データを削除するには
DELETE文を使用してください。TRUNCATEおよびDROP文はサポートされていません。内部エンドポイントとパブリックエンドポイントの切り替えはサポートされています。OpenSearch が内部エンドポイントを介して RDS インスタンスにアクセスする場合、トラフィック料金は発生しません。
トラブルシューティング
複数テーブル間でのプライマリキーの競合
同じテーブルスキーマを持つ複数のテーブルから 1 つのアプリケーションテーブルに同期する場合、プライマリキーの値が重複するとデータが上書きされる可能性があります。これを避けるには、StringCatenateExtractor プラグインを使用して、元のプライマリキーとテーブル名を連結することで一意のキーを生成します。
プラグインをソースフィールド pk と $table で設定します。ここで、
pkはソーステーブルのプライマリキーフィールドです。$tableはテーブル名を保持するシステム変数です (ワイルドカードによるテーブルマッチングがアクティブである必要があります)。
区切り文字としてハイフン (-) またはカスタム文字を使用します。例えば、テーブルが my_table_0 でプライマリキーの値が 123456 の場合、結果のキーは 123456-my_table_0 となります。
RAM ユーザーがデータソースを設定できない
RAM ユーザーとしてログイン中に Failed to connect to RDS service. Try again later が表示された場合は、その RAM ユーザーに必要な権限を付与してください。詳細については、「RAM ユーザーの作成」をご参照ください。AliyunServiceRoleForOpenSearch サービスロールは、プライマリ Alibaba Cloud アカウントによって作成される必要があることに注意してください。