OceanBaseデータベースでは、リーダーがトランザクション内の読み取りおよび書き込みリクエストを担当するため、各パーティションのリーダーの分布によって、各ノード上でのトラフィックの分布が決定されます。
フローの紹介
データベースシステムは、アプリケーションアーキテクチャにおいてデータストレージとクエリの機能を担っています。アプリケーションの読み書きリクエストをデータベーストラフィックと呼びます。データベーストラフィックは、書き込みトラフィック、強い一貫性のある読み取りトラフィック、弱い一貫性のある読み取りトラフィックに分類されます。書き込みトラフィックと強い一貫性のある読み取りトラフィックはOceanBaseデータベースのリーダーフォロワーによって提供され、弱い一貫性のある読み取りトラフィックはリーダーフォロワーによって提供されます。ODPはデータベーストラフィックのルーティング機能を提供しており、ODPは簡単なSQLパーサーモジュールを実装しており、SQL内のデータベース名、テーブル名、ヒントを解析し、業務SQL、ルーティングルール、およびOBServerノードの状態に基づいて、リクエストを転送するための最適なOBServerノードを選択します。
プライマリゾーンの紹介
トラフィックの分散はプライマリゾーンによって記述されます。プライマリゾーンはリーダーレプリカの優先位置を示しており、リーダーレプリカは業務の強整合性読み書きトラフィックを担っています。つまり、プライマリゾーンがOceanBaseデータベースのトラフィック分散を決定します。あるテーブルt1のprimary_zone="Zone1"と設定されている場合、RootServiceはt1テーブルのリーダーを可能な限りZone1にスケジュールします。
説明
レプリカの記述対象はデータであり、プライマリゾーンの記述対象はデータを格納するコンテナです。そのため、このコンテナ内のデータはコンテナのプライマリゾーン属性で記述されたリーダーの優先位置を継承します。OceanBaseデータベースの現行バージョンでは、テナントレベルのプライマリゾーンのみサポートされています。一方、OceanBaseデータベースV3.xでは、テーブルレベル、DBレベル、Table Groupレベルでもプライマリゾーンの設定が可能です。
プライマリゾーンは実際には複数のゾーンを含むリストです。このリストでは、以下の方法でゾーンに優先順位を設定します:
プライマリゾーンリストに複数のゾーンが含まれる場合、';'で区切られたものは高い優先順位から低い優先順位へと並び替えられ、','で区切られたものは同じ優先順位を持ち、トラフィックが複数のゾーンに分散され、これらのゾーンが同時にサービスを提供することを意味します。
例えば:'hz1,hz2;sh1,sh2;sz1'は、hz1とhz2が同じ優先順位を持ち、かつsh1/sh2やsz1よりも優先順位が高いことを示します。また、sh1とsh2も同じ優先順位を持ち、かつsz1よりも優先順位が高いことを示します。
OceanBaseデータベースの現行バージョンでは、テナントレベルのプライマリゾーンのみサポートされており、テーブルレベル、DBレベル、Table Groupレベルでのプライマリゾーンの設定はサポートされなくなっています。テナント作成時にprimary_zoneが指定されていない場合、デフォルトでRANDOMが入力され、各ゾーンの優先順位が同じであることを意味します。
テナントのプライマリゾーン属性は、システムテナントのoceanbase.DBA_OB_TENANTSビューのPRIMARY_ZONEフィールドで確認できます。例:
obclient> SELECT * FROM oceanbase.DBA_OB_TENANTS limit 10;
クエリ結果は次のとおりです:
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
| TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME | MODIFY_TIME | PRIMARY_ZONE | LOCALITY | PREVIOUS_LOCALITY | COMPATIBILITY_MODE | STATUS | IN_RECYCLEBIN | LOCKED | TENANT_ROLE | SWITCHOVER_STATUS | SWITCHOVER_EPOCH | SYNC_SCN | REPLAYABLE_SCN | READABLE_SCN | RECOVERY_UNTIL_SCN | LOG_MODE | ARBITRATION_SERVICE_STATUS |
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
| 1 | sys | SYS | 2023-05-17 18:10:19.940353 | 2023-05-17 18:10:19.940353 | RANDOM | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | NULL | NULL | NULL | NULL | NOARCHIVELOG | DISABLED |
| 1001 | META$1002 | META | 2023-05-17 18:15:21.455549 | 2023-05-17 18:15:36.639479 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | NULL | NULL | NULL | NULL | NOARCHIVELOG | DISABLED |
| 1002 | mysql001 | USER | 2023-05-17 18:15:21.461276 | 2023-05-17 18:15:36.669988 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | 1684398681521302749 | 1684398681521302749 | 1684398681345969089 | 4611686018427387903 | NOARCHIVELOG | DISABLED |
| 1003 | META$1004 | META | 2023-05-17 18:18:19.927859 | 2023-05-17 18:18:36.443233 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | NULL | NULL | NULL | NULL | NOARCHIVELOG | DISABLED |
| 1004 | oracle001 | USER | 2023-05-17 18:18:19.928914 | 2023-05-17 18:18:36.471606 | zone1 | FULL{1}@zone1 | NULL | ORACLE | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | 1684398681335427475 | 1684398681335427475 | 1684398681144712832 | 4611686018427387903 | NOARCHIVELOG | DISABLED |
| 1005 | META$1006 | META | 2023-05-18 15:48:57.441320 | 2023-05-18 15:49:12.820051 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | NULL | NULL | NULL | NULL | NOARCHIVELOG | DISABLED |
| 1006 | mq_t1 | USER | 2023-05-18 15:48:57.447657 | 2023-05-18 15:49:12.857944 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | 1684398680916392609 | 1684398680916392609 | 1684398680742451346 | 4611686018427387903 | NOARCHIVELOG | DISABLED |
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
7 rows in set
Regionプロパティ
OceanBaseデータベースでは、ゾーンにはRegionプロパティ(DBA_OB_ZONESビューのREGIONフィールド)があり、そのゾーンが属するリージョンを示します。各ゾーンには1つのRegionしか設定できませんが、1つのRegion内には複数のゾーンを含めることができます。プライマリゾーンの設定には、リーダーが好むRegionの位置が暗黙的に含まれています。具体的には、ユーザーがプライマリゾーンを設定する際には、2つの意味合いが含まれます:
指定されたプライマリゾーンは、リーダーが好むゾーンのRegionです。
指定されたプライマリゾーンが属するRegionは、リーダーが好むRegionです。
具体的には、リーダーは最も優先度の高いゾーンに優先的にスケジュールされます。最も優先度の高いゾーン上のレプリカがリーダーになれない場合、同一Region内の他のゾーンがリーダーの位置として優先的に選択されるため、業務アクセスがOceanBaseデータベースをまたぐことができるだけないように保証されます。