データパーティションとは、テーブル作成ステートメントに基づいて作成される論理オブジェクトであり、テーブルデータを分割および管理するための仕組みです。各テナントは複数のユニットで構成されており、ログストリームは一定のルールに従ってこれらのユニット上に分散されます。これにより、ログストリームに属するデータパーティションのユニット上での配置が決定されます。このセクションでは、データおよびそのトラフィックの分散ルールについて説明します。
OceanBaseデータベースは、通常のテーブルとパーティションテーブルをサポートしています。パーティションテーブルはさらに、パーティションテーブルとコンポジット・パーティションテーブルに分類され、パーティションテーブルは1つまたは複数のパーティションで構成されます。通常のテーブルは1つのパーティションで構成されており、パーティションテーブルの特殊なケースと見なすことができます。OceanBaseデータベースの基本的なパーティショニング戦略には、範囲(Range)パーティショニング、リスト(List)パーティショニング、ハッシュ(Hash)パーティショニング、キー(Key)パーティショニングなどが含まれます。
ユニットグループの紹介
OceanBaseデータベースV4.0から、テナント管理に制限が追加され、同一テナント内のすべてのゾーンのユニット数を同一にすることが求められます。システムは各ゾーンのユニットに番号を付けており、異なるゾーン間で同一の番号(UNIT_GROUP_ID)を持つユニットは、1つのユニットグループを形成します。ユニットグループには以下の特徴があります:
各ユニットグループには一意のIDが割り当てられており、システムテナントは
oceanbase.DBA_OB_UNITSビューのUNIT_GROUP_IDフィールドを通じてこのIDを確認できます。1つのログストリームは1つのユニットグループにのみ属し、そのユニットグループ内のユニットにのみ分散されます。したがって、ユニットグループ内のすべてのユニットはログストリーム単位で、同一のデータパーティションが分散され、1組のデータを定義します。同時に、各ゾーンのサービス能力も対等であることが求められます。
OceanBaseデータベースV4.0以降では、ゾーンごとにテナントのユニット数を個別に設定することはサポートされなくなりました。ユニットグループ単位での全体的な調整のみ可能です。例えば、テナントの水平スケールアップを行いユニット数を増やす場合、すべてのゾーンを統一的に拡張する必要があります。同様に、テナントのスケールダウンの場合も、ユニットグループ単位でユニットを一括削除するしかありません。ユニットグループメカニズムにより、異なるゾーン上のデータ分布が同構成であることが保証されます。
sysテナントでは、oceanbase.DBA_OB_UNITSビューを使用して、すべてのユニットとそれらが所属するユニットグループを照会できます。例:
obclient> select UNIT_ID,TENANT_ID,UNIT_GROUP_ID,ZONE,SVR_IP,SVR_PORT from DBA_OB_UNITS where TENANT_ID = 1004;
+---------+-----------+---------------+--------------+-------------+----------+
| UNIT_ID | TENANT_ID | UNIT_GROUP_ID | ZONE | SVR_IP | SVR_PORT |
+---------+-----------+---------------+--------------+-------------+----------+
| 1004 | 1004 | 1003 | sa128_obv4_1 | xx.xx.xx.47 | 2882 |
| 1005 | 1004 | 1003 | sa128_obv4_2 | xx.xx.xx.81 | 2882 |
| 1006 | 1004 | 1003 | sa128_obv4_3 | xx.xx.xx.19 | 2882 |
+---------+-----------+---------------+--------------+-------------+----------+
3 rows in set
ログストリームグループの紹介
ログストリームグループという概念は、Primary Zoneが複数のZoneに分散されることに対応するために導入されました。Primary Zoneが単一のZoneの場合、Unit Group内には単一のログストリームを作成するだけで済みます。Primary Zoneが複数のZoneの場合、Unit Group内に複数のログストリームを作成し、サービス能力の水平スケーリングを実現する必要があります。これらのログストリームは同一の分散属性を持ち、それらが共に一つのログストリームグループを形成します。ログストリームグループ内のログストリームの数は、Primary ZoneのZone数と等しくなります。
したがって、一つのログストリームは一つのログストリームグループに属し、変更することはできません。また、ログストリームグループとUnit Groupは一対一で対応しています。ログストリームグループ内のすべてのログストリームは対応するUnit Group上に分散され、ログストリームのリーダーはPrimary Zone上に分散されます。
ログストリームグループ内のログストリームの数は、テナントのPrimary Zone構成の変更に伴い動的に変化し、ログストリームグループのライフサイクルはUnit Groupにバインドされます。
sysテナントでは、oceanbase.CDB_OB_LSビューを使用して、クラスタ内のすべてのテナントのログストリームおよびそれらが属するログストリームグループを確認できます。例えば:
obclient> select TENANT_ID,LS_ID,STATUS,PRIMARY_ZONE,UNIT_GROUP_ID,LS_GROUP_ID from oceanbase.CDB_OB_LS where TENANT_ID=1004;
+-----------+-------+--------+----------------------------------------+---------------+-------------+
| TENANT_ID | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID |
+-----------+-------+--------+----------------------------------------+---------------+-------------+
| 1004 | 1 | NORMAL | sa128_obv4_1;sa128_obv4_2,sa128_obv4_3 | 0 | 0 |
| 1004 | 1001 | NORMAL | sa128_obv4_1;sa128_obv4_2,sa128_obv4_3 | 1003 | 1001 |
+-----------+-------+--------+----------------------------------------+---------------+-------------+
2 rows in set
まとめ
以上の内容から、本節で紹介した多くの細粒度な概念をまとめると以下のようになります:
Unitは物理リソースの抽象化であり、各Unitはノード上の一定の物理リソースを占有します。これにはCPU、メモリ、ストレージ容量などのリソース項目が含まれます。Unitはリソーススケジューリングの基本単位であり、同一Zone内の異なるノード間でUnitの配置を調整することで、ノードのロードバランシングやノードのディザスタリカバリを実現できます。
各テナントは複数のUnitで構成されており、テナントのUnit NumberとPrimary Zoneを設定することで、業務トラフィックを担うUnit集合を定義します。各Unitは1つのノード上に配置されるため、テナント容量の水平スケールアップを容易に実現できます。
ログストリームは、複数のデータパーティションと順序付きRedoLogログストリームを含む一連のデータを定義します。Paxosプロトコルを用いてマルチレプリカ間のログ同期を実現し、レプリカ間のデータ整合性を保証することで、データの高可用性を実現しています。また、ログストリームはトランザクションのコミット単位でもあり、トランザクションの変更が単一のログストリーム内で完了する場合は、1段階の原子コミットを採用できます。一方、トランザクションの変更が複数のログストリームにまたがる場合は、OceanBaseデータベースが最適化した2段階コミットプロトコルを用いて原子コミットを実現します。ログストリームは分散トランザクションの参加者でもあります。ログストリームには位置属性と役割属性があり、ログストリーム内のすべてのデータパーティションはその属性を継承します。
システムは各ZoneのUnitに番号を付け、同じ番号のUnitが1つのUnit Groupを形成します。Unit Groupは一連のログストリームを定義し、これらのログストリームはそのUnit GroupのUnit上にのみ配置されます。
ログストリームグループとUnit Groupは一対一で対応しており、各ログストリームグループ内のログストリームの数はPrimary ZoneのZone数によって決定されます。このため、Primary ZoneのZoneリスト内の各Zoneには、ログストリームグループ内の1つのログストリームのLeaderが配置されることになります。
テナントが
unit_num =2、primary_zone ='Z1,Z2,Z3'と設定されている場合、そのテナントは2つのUnit Group、2つのログストリームグループ、そして6つのログストリームを定義します。以下の図を参照してください。
OceanBaseデータベースは、複数の層面からデータとトラフィックを柔軟に複数のノードに分散させ、UnitはZone内のノード間で移動することで、ノードのロードバランシングとノードのディザスタリカバリを実現できます。