テナントのスムーズなスケーリングをさらに実現するため、OceanBaseデータベースはプリスケールアウト機能を提供しています。この機能は、テナントのスケールインからスケールアウトまでに必要なスケールアウト係数(ls_scale_out_factor)を設定し、事前に十分な数のログストリームを生成します。これにより、ログストリームの状態と位置がスケールアウト後と一致するようにした上で、テナントのスケールアウトまたはスケールイン操作を開始することで、スムーズなスケーリングを実現します。
背景
現在のバージョンでは、OceanBaseデータベースはテナントの同種ゾーンモードと異種ゾーンモードをサポートしています:
同種ゾーンモードでは、テナント内の各ゾーンの
UNIT_NUMが同一である必要があります。異種ゾーンモードでは、テナント内の各ゾーンの
UNIT_NUMは同じでも異なっても構いませんが、一つのテナントのすべてのゾーンにおけるUNIT_NUMの種類は最大で2種類に制限されます。
本記事では主に同種ゾーンモードのテナントを例に、テナントの事前拡張操作の手順を説明します。異種ゾーンモードのテナントについては、異種ゾーンの運用保守手法を用いたスムーズなスケーリングを実現することを推奨します。異種ゾーンを利用したスムーズなスケーリングのユースケースについては、スムーズなスケーリングのアプリケーションケースを参照してください。
拡張係数の紹介
以前のバージョンでは、一つのテナントが一つのノード上でサービスを提供するログストリームは一つだけでした。ノード内に十分な数のログストリームが存在する場合、拡張時にはログストリームの位置の再配置を直接トリガーでき、Transferを用いてログストリームを分割する必要はありませんでした。
拡張前に十分な数のログストリームが存在するかどうかを定義するため、OceanBaseデータベースでは拡張係数(ls_scale_out_factor)という概念を導入しました。拡張係数とは、後続の拡張要件を満たすために、一つのログストリームを分割して必要なログストリームの数を指します。
拡張係数の計算式
OceanBaseデータベースでは、テナントの通常のログストリーム数(システムログストリームとブロードキャストログストリームを除く)は次のとおりです:テナントのUNIT_NUMの数(U)* テナントPRIAMRY_ZONEの第一優先順位の数(P)。
拡張前において、テナントの UNIT_NUM の数をU1、テナントの PRIAMRY_ZONE の第一優先順位の数をP1と仮定します。拡張後、テナントの UNIT_NUM の数をU2、テナントの PRIAMRY_ZONE の第一優先順位の数をP2とします。このとき、拡張係数(ls_scale_out_factor)の計算式は以下のとおりです:
ls_scale_out_factor = LCM(U1 * p1 , U2 * P2 )/ (U1 * P1)
つまり、(U1 * p1) と (U2 * P2) の二つの値の最小公倍数を (U1 * P1) で割ることで、そのテナントの拡張係数が得られます。
事前拡張
現在、テナント mq_t1 があり、そのローカリティは F@zone1, F@zone2, F@zone3 で、各ゾーンに1つのユニットがあります。PRIMARY_ZONE は zone1 と zone2 に分散しています。今後、このテナントの UNIT_NUM を2に調整し、テナントの PRIMARY_ZONE の第一優先順位の数を変更しないことを希望します。このテナントに対する事前拡張の操作手順は以下のとおりです。
rootユーザーでクラスタのsysテナントにログインします。接続例:
obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -Aテナント
mq_t1のTENANT_ID、UNIT_NUM、PRIAMRY_ZONEなどの情報を確認します。obclient(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, PRIMARY_ZONE, LOCALITY, UNIT_NUM FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';クエリ結果は次のとおりです:
+-----------+-------------+-------------+-------------------+---------------------------------------------+----------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | UNIT_NUM | +-----------+-------------+-------------+-------------------+---------------------------------------------+----------+ | 1002 | mq_t1 | USER | zone1,zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | 1 | +-----------+-------------+-------------+-------------------+---------------------------------------------+----------+ 1 row in set拡張係数
ls_scale_out_factorの値を計算し、テナントの拡張係数を設定します。この例では、テナント
mq_t1の拡張前のUNIT_NUMは1、PRIAMRY_ZONEの第一優先順位の数は2です。拡張後、テナントのUNIT_NUMは2、PRIMARY_ZONEの第一優先順位の数は変わらず2のままです。拡張係数の計算式によると、その拡張係数はLCM(2 * 1 , 2 * 2)/(2 * 1) = 2です。計算した拡張係数に基づき、パラメータ ls_scale_out_factor の値を設定します。
obclient(root@sys)[oceanbase]> ALTER SYSTEM SET ls_scale_out_factor = 2 TENANT = mq_t1;テナントレベルのパラメータ enable_rebalance と enable_transfer の値をどちらも有効状態 (
True) に設定します。これにより、テナント内で十分な数のログストリームを生成できるようにします。obclient(root@sys)[oceanbase]> ALTER SYSTEM SET enable_rebalance = True TENANT = mq_t1;obclient(root@sys)[oceanbase]> ALTER SYSTEM SET enable_transfer = True TENANT = mq_t1;テナントが十分な数のログストリームを生成したら、現在のテナント内の
NORMAL状態のログストリームの数が期待通りかどうかを確認します。拡張係数の公式によると、拡張後の現在のテナント内の
NORMAL状態(システムログストリームとブロードキャストログストリームを除く)のログストリームの数は、拡張前のテナントのUNIT_NUM(U1)× 拡張前のテナントのPRIAMRY_ZONEの第一優先順位の数(P1)× 拡張係数(ls_scale_out_factor)である必要があります。すなわち、現在のテナント内のログストリームの数は1 * 2 * 2 = 4である必要があります。obclient(root@sys)[oceanbase]> SELECT TENANT_ID, STATUS, COUNT(*) FROM oceanbase.CDB_OB_LS WHERE TENANT_ID = 1002 AND FLAG = '' AND LS_ID != 1 GROUP BY STATUS;クエリ結果の例は次のとおりです:
+-----------+--------+----------+ | TENANT_ID | STATUS | COUNT(*) | +-----------+--------+----------+ | 1002 | NORMAL | 4 | +-----------+--------+----------+ 1 row in set拡張対象のテナントに負荷分散タスクがないことを確認します。
obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_BALANCE_JOBS WHERE TENANT_ID = 1002;クエリ結果が空の場合、この事前拡張操作は完了です。
次のステップ
プレスケールアウト操作が完了したら、ユーザーはビジネスニーズに応じて、想定されたスケーリング計画に従ってスケーリング操作を実行できます。