検索インデックスのスキーマを動的に変更して、カラムの追加、更新、削除、またはルーティングキーとプリソーティング方法の変更を行うことができます。これにより、新しいビジネス要件への対応やパフォーマンスの最適化が可能になります。このプロセスでは、変更されたスキーマを持つカナリアインデックスの作成、データの同期、トラフィック重み付けによる A/B テスト、ソースインデックスとカナリアインデックスのスキーマのスワップ、そしてカナリアインデックスの削除を行います。
仕組み
Tablestore のデータテーブルはスキーマフリーですが、検索インデックスには厳格なスキーマがあります。検索インデックスを作成する際には、クエリ用にインデックス化するカラムを定義する必要があります。ビジネスの変化やパフォーマンスチューニングをサポートするために、このスキーマを変更することがよく必要になります。一般的なシナリオには次のものがあります。
-
インデックスカラムの追加:ビジネスの進化に伴い、追加のカラムをクエリする必要が生じる場合があります。
-
インデックスカラムの更新:カラムタイプ、仮想列、配列設定、アナライザー、日付フォーマットなどのプロパティを変更できます。
-
インデックスカラムの削除:クエリに不要になったカラムを削除できます。
-
ルーティングキーの変更:適切に定義されたルーティングキーにより、読み出し増幅を減らし、クエリパフォーマンスを向上させることができます。
-
プリソーティングの変更:クエリ内のデータソート順序がインデックスのプリソーティング設定と一致する場合、クエリ速度が向上します。
ワークフロー
動的に動作するため、この一時的なインデックスをクエリに使用しないでください。この機能がニーズを満たさない場合は、チケットを送信。
次の図は、スキーマを動的に変更するワークフローを示しています。プロセス全体がアプリケーションに対して透過的であるため、アプリケーションコードを変更することなくスキーマを変更できます。
次の表は、検索インデックスのスキーマを変更するための主な手順を説明しています。
|
ステップ |
アクション |
説明 |
|
1 |
カナリアインデックスの作成 |
ソースインデックスのカナリアインデックスを作成し、必要に応じてカラムの追加、変更、削除を行って、新しいスキーマを定義します。 |
|
2 |
インデックス同期進捗状況の確認 |
次に進む前に、すべての既存データと増分データが同期され、カナリアインデックスの進捗状況がソースインデックスと一致するまで待ちます。 |
|
3 |
A/B テスト用の重み設定 |
A/B テストでは、ソースインデックスとカナリアインデックス間でクエリトラフィックを分散して、新しいスキーマを検証できます。 カナリアインデックスがクエリトラフィックの 100% を処理するまで、段階的にトラフィックをリダイレクトします。 |
|
4 |
インデックススキーマのスワップ |
すべてのクエリトラフィックがカナリアインデックスに切り替えられた後、ソースインデックスとカナリアインデックスのスキーマをスワップします。 スワップ後、ソースインデックス名は新しいスキーマを、カナリアインデックス名は古いスキーマを指すようになります。すべてのクエリトラフィックは、新しいスキーマを使用するソースインデックス名に向けられます。 |
|
5 |
カナリアインデックスの削除 |
スキーマをスワップし、インデックスが期待どおりに動作することを確認した後、安定期間 (たとえば 1 日) を待ってからカナリアインデックスを削除します。 |
操作手順
-
インデックス タブに移動します。
-
Tablestore コンソールにログインします。
-
上部メニューで、リージョンとリソースグループを選択します。
-
概要 ページで、インスタンス名をクリックするか、操作 列の インスタンスの管理 をクリックします。
-
インスタンスの詳細 タブの テーブルリスト エリアで、データテーブル名をクリックするか、操作 列の インデックス をクリックします。
-
-
ソースインデックスに基づいてカナリアインデックスを作成します。
-
インデックス タブで、検索インデックスを見つけ、操作 列の スキーマの変更 をクリックします。
-
インデックスの再作成 ダイアログボックスで、必要に応じてインデックスフィールドを追加、変更、または削除します。

-
ルーティングキーまたはプレソーティングメソッドを変更するには、詳細設定を有効にし、次の表で説明されているパラメーターを設定します。
パラメータ
説明
ルーティングキー
カスタムルーティングフィールドを指定します。1 つ以上のプライマリーキーカラムをルーティングフィールドとして選択できます。
データがインデックスに書き込まれる際、システムはルーティングキー値を使用してデータ分散を決定します。同じルーティングキー値を持つレコードは、同じパーティションにインデックス化されます。詳細については、「検索インデックスでのルーティングフィールドの使用」をご参照ください。
プリソーティング
検索インデックス内のデータのデフォルトのソート方法です。プリソーティングは、クエリ結果が返されるデフォルトの順序を決定します。詳細については、「インデックスプリソーティング」をご参照ください。
-
プライマリキーでソートするには、デフォルトソートを選択します。
-
フィールド値またはプライマリキー列の組み合わせで並べ替えるには、カスタムソート を選択して設定します。
-
プライマリーキーの事前ソート や フィールドの事前ソート などの並べ替えタイプを選択し、追加 をクリックします。
-
フィールド名とソート順序を選択します。
サポートされているソート順序は、昇順と降順です。
重要フィールドの事前ソート を選択した場合にのみ、フィールド名を選択する必要があります。
カスタムソートを使用する場合、必要に応じてプライマリーキープリソーティングとフィールドプリソーティングの両方を設定できます。
-
-
-
OK をクリックします。
-
インデックスの比較 ダイアログボックスで、ソースインデックスとカナリアインデックス間のルーティングキー、プレソーティング、スキーマの比較を確認します。情報が正しいことを確認したら、OK をクリックします。
-
-
インデックス同期情報を確認します。
-
ソースインデックスの横にある
アイコンをクリックするか、ソースインデックス名をクリックします。ソースインデックスのカナリアインデックスが表示されます。
-
カナリアインデックスの操作列で、グレーインデックスの使用をクリックします。
重要カナリアインデックスは、完全データ同期フェーズと増分データ同期フェーズを経ます。
-
データ同期が完了する前に、操作 列の グレーインデックスの使用 ボタンにポインターを合わせると、切り替え可能、セキュリティリスクあり というツールチップが表示され、切り替えが無効になります。
-
カナリアインデックスがソースインデックスに追いつき、操作 列の グレーインデックスの使用 ボタンにポインターを合わせると、「安全に切り替え可能」というツールチップが表示されます。その後、次のステップに進むことができます。
-
-
グレーインデックスの使用 ダイアログボックスで、インデックス同期情報を確認します。

-
-
同期が完了したら、トラフィックの重みを設定して A/B テストを実行します。
A/B テストを使用して、ソースインデックスとカナリアインデックス間でクエリトラフィックを分散することで、新しいスキーマを検証します。次の手順に進む前に、すべてのトラフィックをカナリアインデックスに切り替える必要があります。
-
グレーインデックスの使用 ダイアログボックスの 操作 セクションで、スライダーをドラッグしてソースインデックスとカナリアインデックスの重みを調整し、重みの設定 をクリックします。

-
重みの設定 ダイアログボックスで、重みデータとスキーマの比較を確認します。
-
情報が正しいことを確認したら、重みの設定 をクリックします。
-
表示される確認ダイアログボックスで、OK をクリックします。
-
-
すべてのクエリトラフィックがカナリアインデックスに切り替えられた後、ソースインデックスとカナリアインデックスのスキーマをスワップします。
スワップ後、ソースインデックス名は新しいスキーマを、カナリアインデックス名は古いスキーマを指すようになります。すべてのクエリトラフィックは、新しいスキーマを使用するソースインデックス名に向けられます。

-
グレーインデックスの使用 ダイアログボックスの 操作 セクションで、インデックスの切り替え をクリックします。
-
インデックスの切り替え ダイアログボックスで、ソースインデックスとカナリアインデックス間のルーティングキー、プレソーティング、およびスキーマを比較し、内容が正しいことを確認してから 切り替えの確認 をクリックします。
-
-
スキーマをスワップし、インデックスが期待どおりに動作することを確認した後、安定期間 (たとえば 1 日) を待ってからカナリアインデックスを削除します。

-
グレーインデックスの使用 ダイアログボックスで、グレースケールインデックスを削除する をクリックします。
-
[カナリアリリースを完了し、古いインデックスを削除してもよろしいですか?] ダイアログボックスで、削除するカナリアインデックスに関する情報が正しいことを確認します。 次に、テキストボックスに
I have confirmed that the new index data has been synchronized and has been in canary release for a period of timeと入力します。 -
OK をクリックします。
-
セーフガード
運用の安全性を確保するため、Tablestore はロールバックメカニズムと切り替えアラートを提供し、インデックス変更時のリスクを最小限に抑えます。
-
ロールバックメカニズム
動的スキーマ変更プロセスの主要なステップでは、ロールバックがサポートされています。
-
カナリアインデックスを作成した後、スキーマが正しくないことに気づいた場合は、削除して新しいものを作成できます。
-
A/B テスト中は、トラフィックの重みを調整することで、カナリアインデックスにトラフィックを段階的にリダイレクトできます。問題が発生した場合は、重みをリセットすることで、いつでもソースインデックスにトラフィックを戻すことができます。
-
スキーマを交換した後、何らかの問題が見つかった場合は、いつでも 切り替えのキャンセル を実行してソースインデックスのスキーマに戻すことができます。インデックスの切り替え 操作と 切り替えのキャンセル 操作は逆の操作です。
-
-
切り替えアラート
カナリアインデックスがソースインデックスと完全に同期される前にトラフィックを切り替えると、クエリで古いデータが返される可能性があります。Tablestore は、両方のインデックスの同期ステータスと最終同期時刻に基づいて、「切り替えが安全」かどうかを判断します。
Tablestore は、以下の条件下で、スイッチオーバーが 安全に切り替え可能 であると判断します:
-
ソースインデックスが完全同期フェーズにあり、カナリアインデックスが完全同期フェーズまたは増分同期フェーズにある場合。つまり、カナリアインデックスがソースインデックスに追いついています。
-
ソースインデックスとカナリアインデックスの両方が増分データ同期フェーズにあり、カナリアインデックスの最終同期時刻がソースインデックスの最終同期時刻より 60 秒以上遅れていない場合。
-
課金
カナリアインデックスの構築やデータの書き込みには課金されません。両方のインデックスが消費するストレージと、それらに対してプロビジョニングされた予約読み込み CU に対して課金されます。詳細については、「検索インデックスの課金項目」をご参照ください。
関連ドキュメント
-
テーブル構造を変更せずに新しいフィールドやデータタイプをクエリするには、検索インデックススキーマを変更するか、新しい検索インデックスを作成する際に仮想列機能を使用できます。詳細については、「仮想列」をご参照ください。
-
Tablestore は、さまざまなシナリオに対応する各種クエリタイプをサポートしています。これには、「MatchAll クエリ」、「Match クエリ」、「Match Phrase クエリ」、「Term クエリ」、「Terms クエリ」、「ワイルドカードクエリ」、「プレフィックスクエリ」、「サフィックスクエリ」、「トークン化ベースのワイルドカードクエリ」、「範囲クエリ」、「Bool クエリ」、「ネストクエリ」、「地理的距離クエリ」、「地理的境界ボックスクエリ」、「地理的ポリゴンクエリ」、「Exists クエリ」、「折りたたみ (distinct)」、「仮想列」が含まれます。
-
SQL ステートメントを使用して検索インデックス内のさまざまなタイプのデータを迅速にクエリするには、SQL クエリ機能を使用できます。詳細については、「SQL クエリ」、「検索インデックス用のマッピングテーブルの作成」、「データのクエリ」、「全文検索」、「配列タイプ」、「ネストタイプ」、「仮想列」をご参照ください。
-
検索インデックス集計機能を使用して、最小値、最大値、合計、平均の検索、行数のカウント、個別カウントの実行、パーセンタイルの計算、フィールド値、範囲、地理的位置、フィルター条件によるグループ化、ヒストグラムの作成、ネストクエリの実行などのデータ分析を実行できます。詳細については、「集計」をご参照ください。