PolarDB for MySQL のマルチマスターシャードテーブルでは、データが複数のデータベースクラスターに自動的に分散され、各ノードが読み取りおよび書き込みの両方を処理できます。本ドキュメントでは、マルチマスターシャードテーブルを操作する際に必要となる DDL 構文および動作に関する詳細について説明します。
マルチマスターシャードテーブルの利用タイミング
マルチマスターシャードテーブルは、単一ノードの MySQL 環境では対応しきれないワークロード向けに設計されています。以下のいずれかに該当する場合、本アーキテクチャをご検討ください。
書き込みスループットが垂直スケーリングの限界に達した場合
単一テーブルのサイズが大きくなり、クエリパフォーマンスが低下している場合
アプリケーションが線形なスループット向上を伴う水平方向のスケールアウトを必要とする場合
マルチマスターシャードテーブルは、非共有アーキテクチャと共有ストレージからのオンデマンドリソース割り当てを組み合わせて実現しており、各ノードが独立して動作する一方で、ストレージコストは実際の使用量に比例します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
カーネルバージョン 8.0 を実行中の、マルチマスタークラスター (Limitless) Edition の PolarDB for MySQL クラスター。詳細については、「カスタム購入」および「サブスクリプションクラスターの購入」をご参照ください。
特権アカウント。詳細については、「データベースアカウントの作成と管理」をご参照ください。
クラスターへのアクティブ接続。詳細については、「データベースクラスターへの接続」をご参照ください。
DDL 文
CREATE DATABASE
CREATE DATABASE を使用してデータベースを作成し、そのデフォルトの文字セットと照合順序を設定します。構文は MySQL と完全に互換です。データベースシャードモードでマルチマスターシャードテーブルを有効化するには、データベース作成時に DIST_DB='Y' を指定します。デフォルト値は 'N' です。
通常のデータベースをDIST_DB属性を持つデータベースに変換することはサポートされていません。作成時にDIST_DBを設定します。
構文
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option: [DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
| DIST_DB [=] {'Y' | 'N'}
}例
以下のステートメントは、データベースシャードモードを有効化した test1 という名前のデータベースを作成します。データベースシャードのデフォルト数は 8 です。
CREATE DATABASE test1 DIST_DB='Y';CREATE TABLE
データベースシャードモード
DIST_DB='Y' で作成されたデータベースでは、すべてのテーブルがマルチマスターシャードテーブルである必要があります。DBDISTRIBUTION BY 句を使用してディストリビューション方法を指定します。データベースシャード数は固定で 8 です。
構文
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[dbdistribution_options]
dbdistribution_options:
DBDISTRIBUTION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
| RANGE{(expr) | COLUMNS(column_list)}
| LIST{(expr) | COLUMNS(column_list)} }
[(dbdistribution_definition [, dbdistribution_definition] ...)]
dbdistribution_definition:
DBDISTRIBUTION distribution_name
[VALUES
{LESS THAN {(expr | value_list) | MAXVALUE}
|
IN (value_list)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string']
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]例
単一データベース・単一テーブル(シャーディングなし)
CREATE DATABASE test;
CREATE TABLE t1 (
id BIGINT NOT NULL,
name VARCHAR(30),
PRIMARY KEY (id)
);ハッシュシャーディング
大規模かつ書き込み負荷の高いテーブルをすべてのシャードに均等に分散する必要がある場合に使用します。指定された列の値をハッシュ化することで、データが 8 個のデータベースシャードに分割されます。
CREATE TABLE dist1 (
id BIGINT NOT NULL,
c1 INT,
c2 VARCHAR(30),
PRIMARY KEY (id)
) DBDISTRIBUTION BY HASH(id);リストシャーディング
データが既知の離散的な整数値の集合に対応し、どの値がどのシャードに配置されるかを明示的に制御する必要がある場合に使用します。
DBDISTRIBUTION BY LIST(expr) は、式の値を VALUES IN (value_list) と照合して行を分散します。式は整数を返す必要があります。value_list は、カンマ区切りの整数リストです。
CREATE TABLE t1 (
id INT NOT NULL,
store_id INT,
partion_no INT,
PRIMARY KEY (id, partion_no)
) DBDISTRIBUTION BY LIST(partion_no) (
DBDISTRIBUTION a VALUES IN (1),
DBDISTRIBUTION b VALUES IN (2)
);リストカラムシャーディング
整数以外のカラムや、離散的な値の集合を持つ複数のカラムでシャーディングする必要がある場合に使用します。
DBDISTRIBUTION BY LIST COLUMNS(column_list) は、式ではなく 1 つ以上のカラム名を受け付けます。サポートされるカラム型は以下のとおりです。
整数型:TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT
日付型:DATE、DATETIME
文字列型:CHAR、VARCHAR、BINARY、VARBINARY
DECIMAL、FLOAT、TEXT、BLOB は、リストカラムシャーディングキーとしてサポートされていません。
CREATE TABLE t3 (
id INT NOT NULL,
store_id INT,
partion_no VARCHAR(20),
PRIMARY KEY (id, partion_no)
) DBDISTRIBUTION BY LIST COLUMNS (partion_no) (
DBDISTRIBUTION a VALUES IN ('id_1'),
DBDISTRIBUTION b VALUES IN ('id_2')
);ALTER TABLE
MySQL 構文と互換性があります。詳細については、「MySQL 8.0 ALTER TABLE リファレンス」をご参照ください。
インデックスの作成
MySQL 構文と互換性があります。詳細については、「MySQL 8.0 CREATE INDEX リファレンス」をご参照ください。
分散クエリ
分散キーにフィルターがないクエリ、または複数のデータベースシャードにまたがるクエリの場合、それらをグローバル読み取り専用ノードにルーティングします。グローバル読み取り専用ノードは、すべてのパーティションからデータを自動的に集約するため、追加のストレージや同期リンクを設定することなく、すべてのシャードにわたってクエリを実行できます。
グローバル自動インクリメント列
マルチマスターシャードテーブルは、自動インクリメント列に対してグローバルに一意なシーケンスをサポートします。標準的な MySQL シングルノードの自動インクリメントとの主な動作の違いは次のとおりです:
グローバルに一意ですが、連続性は保証されません。 値はすべてのノードで一意ですが、ギャップが発生することが想定されます。
プライマリノードごとのバッチ割り当て。 各プライマリノードは一度に一定範囲の値を割り当てます。複数のプライマリノードが同時に挿入を行うと、異なるノードから生成された ID が順序通りにならない場合があります。
パーティションローカルな単調性。 値は単一のパーティション内では単調に増加しますが、グローバルでは単調増加しません。
次の表は、MySQL シングルノードとマルチマスターシャードテーブルにおける自動インクリメントの動作を比較したものです。
| 機能 | MySQL シングルノード | マルチマスターシャードテーブル |
|---|---|---|
| テーブルごとに 1 つの自動インクリメント列 | サポートされています | サポートされています |
| 自動インクリメント列のインデックス要件 | インデックスが必要です | 自動インクリメント列は分散キーにすることはできません。分散キーにする場合は、挿入ごとに自動インクリメント列の値を明示的に指定する必要があります。一意なインデックスはサポートされています。 |
| 列値を指定しない挿入 | サポートされています | サポートされています |
| 列値を指定した挿入 | サポートされています | 指定された値がローカルシーケンスの範囲内である場合にのみサポートされます。それ以外の場合は、グローバルインデックスによる重複チェックに依存します。 |
| グローバルに一意かつ単調増加 | サポートされています | グローバルに一意、パーティション内でのみ単調増加 |
| シーケンス内のギャップ | ギャップなし | ギャップあり |
| 自動インクリメントカウンターの変更 | サポートされています | サポートされています。各ローカルノードのシーケンスキャッシュを無効化する必要があります。 |
| 自動インクリメント列の値の更新 | サポートされています | サポートされていません。現在の動作は、列値を指定して行を挿入するのと同じです。 |
例:自動インクリメントを持つレンジシャードテーブル
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
c1 INT,
c2 INT,
PRIMARY KEY (id, c1)
) DBDISTRIBUTION BY RANGE (c1) (
DBDISTRIBUTION p0 VALUES LESS THAN (100),
DBDISTRIBUTION p1 VALUES LESS THAN (1000),
DBDISTRIBUTION p2 VALUES LESS THAN (10000),
DBDISTRIBUTION p3 VALUES LESS THAN (20000)
);自動インクリメント値を指定せずに行を挿入します:
INSERT INTO t1 (c1, c2) VALUES (1, 1);制限事項
マルチマスターシャードテーブルでは、以下の DDL 操作はサポートされていません。
| 操作 | 制約 |
|---|---|
テーブル名に __mt__ | 許可されていません |
ALTER TABLE {DISCARD|IMPORT} TABLESPACE | サポートされていません |
ALTER TABLE PARTITION BY ... | サポートされていません |
ALTER TABLE {DATA|INDEX} DIRECTORY='<absolute path>' | サポートされていません |
ALTER TABLE TABLESPACE tablespace_name [STORAGE {DISK|MEMORY}] | サポートされていません |
ALTER TABLE ADD {FULLTEXT|SPATIAL} | サポートされていません |
CREATE VIEW / DROP VIEW | サポートされていません |
CREATE TRIGGER / PROCEDURE / FUNCTION / EVENT | サポートされていません |