Tablestore SDK for Go を使用して、ソースの多次元インデックスから再作成インデックスを作成し、テーブルの読み取りや書き込みを中断せずにスキーマを変更します。
前提条件
Tablestore Go SDK をインストールし、クライアントを初期化します。
説明
スキーマの動的変更では、再作成インデックスを作成し、データを同期した後、トラフィックを用いて新しいインデックスを検証し、インデックスを切り替えます。このプロセス中もテーブルの読み取りおよび書き込みは継続され、ソースインデックス名を使用するクエリコードを変更する必要はありません。ワークフローは次のとおりです。
ソースインデックスに基づき、新しいスキーマ全体を含む再作成インデックスを作成します。
再作成インデックスが増分同期状態に入り、ソースインデックスに追いつくまで待ちます。
必要に応じてクエリトラフィックを割り当て、新しいスキーマからの結果を検証します。
結果が期待通りであれば、インデックスを切り替えます。
-
一定期間インデックスを監視し、正常に動作していることを確認した後、古いスキーマを指す再作成インデックスを削除します。
重要再作成インデックス名は必ず
_reindexで終わる必要があります。ワークフロー中にインデックスターゲットおよびトラフィックの重みが変化するため、再作成インデックス名を長期的なクエリエンドポイントとして使用しないでください。同時に最大 5 つのインデックスを再構築できます。次のバッチを開始する前に、現在のバッチがソースインデックスに追いつくか、インデックスの切り替えが完了するのをお待ちください。
1. 再作成インデックスの作成
sourceIndexName := "example_index"
reindexName := "example_index_reindex"
newSchema := []*tablestore.FieldSchema{
{
FieldName: proto.String("category"),
FieldType: tablestore.FieldType_KEYWORD,
Index: proto.Bool(true),
},
{
FieldName: proto.String("new_field"),
FieldType: tablestore.FieldType_KEYWORD,
Index: proto.Bool(true),
},
}
_, err := client.CreateSearchIndex(&tablestore.CreateSearchIndexRequest{
TableName: "example_table",
IndexName: reindexName,
SourceIndexName: &sourceIndexName,
IndexSchema: &tablestore.IndexSchema{
FieldSchemas: newSchema,
},
})
if err != nil {
log.Fatal(err)
}
リクエストが成功したら、多次元インデックス情報の照会 を使用してスキーマおよび同期ステータスを確認します。SyncPhase の値が INCR であれば増分同期中です。トラフィックを割り当てる前に、同期がソースインデックスに追いついていることも確認してください。
2. クエリトラフィックの設定
weights := []*tablestore.QueryFlowWeight{
{IndexName: "example_index", Weight: 50},
{IndexName: "example_index_reindex", Weight: 50},
}
_, err := client.UpdateSearchIndex(&tablestore.UpdateSearchIndexRequest{
TableName: "example_table",
IndexName: "example_index",
QueryFlowWeights: weights,
})
if err != nil {
log.Fatal(err)
}
新しいスキーマを検証するために、まず少量のクエリトラフィックから開始し、その後、再作成インデックスの重みを徐々に増やしてください。2 つのインデックスの Weight 値の合計は 100 になる必要があります。
3. インデックスの切り替え
reindexName := "example_index_reindex"
_, err := client.UpdateSearchIndex(&tablestore.UpdateSearchIndexRequest{
TableName: "example_table",
IndexName: "example_index",
SwitchIndexName: &reindexName,
})
if err != nil {
log.Fatal(err)
}
切り替え後、ソースインデックス名は新しいスキーマを指し、再作成インデックス名は古いスキーマを指します。新しいインデックスを一定期間監視し、正常に動作していることを確認した後でのみ、再作成インデックスを削除してください。
パラメーター
再インデックス用インデックスの作成
|
名前 |
型 |
説明 |
|
TableName (必須) |
string |
データテーブルの名前です。 |
|
IndexName (必須) |
string |
再作成インデックス名。末尾は _reindex である必要があります。 |
|
SourceIndexName (必須) |
*string |
ソースインデックス名です。 |
|
IndexSchema (必須) |
*tablestore.IndexSchema |
更新後の完全なインデックススキーマです。フィールド、ルーティング、事前ソートのパラメーターについては、「多次元インデックスの作成」をご参照ください。 |
|
TimeToLive (オプション) |
*int32 |
再インデックスの TTL。有効な値と制約については、「検索インデックスの TTL を設定する」をご参照ください。 |
トラフィックの設定とインデックスの切り替え
|
名前 |
型 |
説明 |
|
TableName (必須) |
string |
データテーブルの名前です。 |
|
IndexName (必須) |
string |
ソースインデックス名です。 |
|
QueryFlowWeights (オプション) |
[]*tablestore.QueryFlowWeight |
ソースインデックスおよび再作成インデックスのトラフィック重みです。 |
|
SwitchIndexName (オプション) |
*string |
ソースインデックスと入れ替えられた再インデックス先のインデックス。 |