Oracle Globally Distributed Database
Oracle Globally Distributed Databaseは、独立したデータベース間でデータが水平にパーティション化されるデータ階層アーキテクチャです。このような構成内の各データベースをシャードと呼びます。すべてのシャードが一体的に単一の論理データベースを形成し、これはシャード・データベースと呼ばれます。Oracle Globally Distributed Databaseは、シャード・ナッシング・データベース・アーキテクチャです。物理データベースが独立しており、CPU、メモリー、ストレージ・デバイスを共有しません。ただし、アプリケーション側から見ると、物理データベースのコレクションが1つの論理データベースのように見えます。
Oracle Globally Distributed Databaseではグローバル・データ・サービス(GDS)を使用します。GDSは可用性、負荷、ネットワーク待機時間、レプリケーション・ラグなどのパラメータに基づいて、クライアント・リクエストを適切なデータベースにルーティングします。同じグローバル・サービスを提供する複製データベースのセットが、GDSプールです。GDSプールのデータベースは、異なる地域にまたがる複数のデータ・センターにあってもかまいません。共有GDSプールには、共有データベースのシャードとそのレプリカがすべて含まれ、データベース・クライアントには1つの共有データベースとして見えます。
アプリケーションは、1つ以上のシャーディング戦略に基づいてデータがパーティション化される複数のデータベース(シャード)に接続できます。この戦略は、ハッシュ・ベース、範囲ベース、リスト・ベースのいずれかです。データベース操作が必要になるたびに、アプリケーションは接続先のシャードを判断する必要があります。
シャーディング・キーが、1行分のデータが格納されるシャードを決定するパーティション化キーになります。1つの表は、シャーディング・キーを使用してパーティション化できます。
シャード・チャンクのコレクションをスーパー・シャーディング・キーと言い、ここにはスーパー・シャーディング・キー識別子という特定の値を持つチャンクのみが格納されます。スーパー・シャーディング・キーは、複数のデータベース・グループ間にデータを分散させるために使用されます。スーパー・シャーディング・キーを指定すると、ユーザー制御のデータ・パーティション化が可能になります。
ODP.NETシャーディング
バージョン12.2以降、管理対象外ODP.NETもOracle Databaseもシャーディングをサポートしています。管理対象ODP.NETおよびODP.NET Coreは、バージョン21でシャーディングのサポートを開始しました。3つのプロバイダはいずれも同じシャーディング機能をサポートしていますが、例外として、管理対象外ODP.NETはチャンク移行接続タイムアウト・プロパティをサポートしていません。
ODP.NETアプリケーションは、単一シャードの問合せに対するデータベース接続をオープンする前に、シャーディング・キーとスーパー・シャーディング・キーの情報を提供する必要があります。接続をオープンした後で、これらのシャーディング値を設定または変更することはできません。シャーディング・キー値のいずれかを変更する必要がある場合は、新しい値で新しい接続を作成し、それをオープンする必要があります。
接続をオープンした後でシャーディング・キーを設定した場合、次にOracleConnection.Open()が呼び出されるまで、ODP.NET接続はその新しいシャーディング・キー値を使用しません。
OracleShardingKeyオブジェクトには、1つ以上のキー値が格納されます。複数のキーを設定して複合キーを作成することもできます。ODP.NETは、指定されたシャーディング・キーを識別し、適切なシャードとチャンクに接続します。
シャーディングは、接続プールを使用する場合も接続プールを使用しない場合もサポートされます。ODP.NET接続プールでは、同じ共有プール内の共有GDSデータベースの異なるシャードとチャンクへの接続が保持されます。
シャーディング・キー(SHARD_KEY)とスーパー・シャーディング・キー(GROUP_KEY)は、アプリケーション・コードではなくTNS接続記述子で指定できます。この場合、アプリケーションが使用するシャードに適用される接続記述子は、.NET開発者が選択します。
データベースのシャードおよびチャンク間でデータが分散されても、それはエンド・ユーザーには意識されません。GDS内でチャンクが再シャーディングされるとき、エンド・ユーザーに対する影響はODP.NETによって最小限に抑えられます。
シャード間の問合せを実行するとき、ODP.NETシャードAPIは使用されません。かわりに、アプリケーションはGDSカタログ・サービスに接続するので、すべてのシャード・データベースへのアクセスが可能になります。必要なシャードすべてを反復するSQL問合せが特別に作成されます。たとえば、select count(*) from employeesという非シャード・データベースの問合せは、select sum(c) from (Iterator(select count(*) c from employees(i))というシャード間問合せと等価です。
ODP.NETの単一シャード問合せの例
using System;
using Oracle.DataAccess.Client;
class Sharding
{
static void Main()
{
OracleConnection con = new OracleConnection("user id=hr;password=hr;Data Source=orcl;");
//Setting a shard key
OracleShardingKey shardingKey = new OracleShardingKey(OracleDbType.Int32, 123);
//Setting a second shard key value for a composite key
shardingKey.SetShardingKey(OracleDbType.Varchar2, "gold");
//Creating and setting the super shard key
OracleShardingKey superShardingKey = new OracleShardingKey();
superShardingKey.SetShardingKey(OracleDbType.Int32, 1000);
//Setting super sharding key and sharding key on the connection
con.SetShardingKey(shardingKey, superShardingKey);
con.Open();
//perform SQL query
}
}
デフォルトでは、ODP.NETは読取りおよび書込み権限が使用可能なチャンクがあるシャードへの接続のみを実行します。シャード内の一部のチャンクが読取り専用の場合、接続記述子のCONNECT_DATAセクションでREADONLY_CHUNK_OKがTRUEに設定されていないかぎり、ODP.NETはそのシャードへの接続を実行しません。通常、接続記述子はtnsnames.oraファイルに格納されます。READONLY_CHUNK_OKを有効にすると、読取り/書込み接続と読取り専用接続の両方を実行できることを意味します。読取り専用接続のみが実行されることを指定するわけではありません。
シャードは、チャンクがあるシャードから別のシャードに移行されるとき、通常、シャード間でデータまたはワークロードのバランスを再調整するために読取り専用になります。
接続記述子でREADONLY_CHUNK_OKを使用する例を次に示します。
SHARDDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = myhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = myservicename)
(READONLY_CHUNK_OK=true)
)
)
ODP.NETでは、スーパー・シャーディング・キーは範囲シャーディングまたはリスト・シャーディングを使用できます。複合シャーディングでは、シャーディング・キーでハッシュ・シャーディングを使用する必要があります。次の表に、スーパー・シャーディング・キーではなく、様々なシャーディング・キー・タイプでサポートされる操作を示します。
表3-13 シャーディング・キー・タイプでサポートされる操作
| チャンク・イベント・タイプ | ハッシュ | 範囲 | リスト |
|---|---|---|---|
|
チャンク読取りのみ 管理対象外ODP.NETではサポートされていません |
はい |
はい |
はい |
|
チャンク・アップ |
はい |
はい |
はい |
|
チャンク・ダウン |
はい |
はい |
はい |
|
チャンクの分割 |
はい |
はい |
はい |
|
チャンクの追加 |
いいえ |
はい |
はい |
|
チャンク値の追加 |
いいえ |
いいえ |
はい |
|
チャンクの削除 |
いいえ |
はい |
はい |
|
チャンク値の削除 |
いいえ |
いいえ |
はい |
|
チャンクのマージ |
いいえ |
はい |
はい |
|
チャンクの無効化 |
いいえ |
はい |
はい |
|
パーティションセット分割 管理対象外ODP.NETではサポートされていません |
はい |
いいえ |
いいえ |
|
新規パーティションセット 管理対象外ODP.NETではサポートされていません |
はい |
いいえ |
いいえ |
パーティションセット分割のシャーディング
時間の経過とともに、変化するビジネス・ニーズに対して、リソース使用率を最適化するためにデータ組織を変更する必要があります。同じシャード領域にグループ化された複数のスーパー・シャーディング・キーは、過去の条件で最適だった可能性があります。1つ以上のスーパー・シャーディング・キーを高速マシンなど独自のシャード領域に移動する必要が生じた場合、パーティションセット分割操作によって、停止時間がほとんどない効率的なデータ移動が容易になります。
各チャンクには複数のスーパー・シャーディング・キーのデータが含まれているため、最初に分割操作が実行されます。その後、データが移動されます。この操作は一度に1つのチャンクで実行されます。チャンクを分割する必要がある場合、そのデータは短時間、読取り専用になります。チャンクのシャーディング・キーの範囲は変更されません。
チャンク移行またはパーティションセット分割時にチャンクが使用できない間の接続エラーを制限するために、開発者はChunkMigrationConnectionTimeoutプロパティを設定して、設定時間または操作完了まで(いずれか早い方)待機できます。その後、予想された時間枠内で操作が完了すると、移行または分割が実行されている間、ユーザーは接続タイムアウト・エラーを受け取りません。
開発者にとって重要な利点は、アプリケーションでパーティションセット分割アクティビティを維持および追跡する必要がないことです。ODP.NETは、このアクティビティを自動的に実行し、接続を適切にルーティングします。シャーディング・トポロジを管理し、変更を記録するためのシャード・ルーティング・キャッシュがあります。ODP.NET接続プールは、パーティションセットの分割後も含め、指定のシャーディング・キーおよびスーパー・シャーディング・キーに適切な接続を分配します。
ODP.NETのパーティションセット分割は、リストまたは範囲スーパー・シャーディング・キーのいずれかを使用したハッシュ・シャーディングでのみサポートされます。Oracle Database 23.8以上では、パーティションセット分割のシャーディングがサポートされます。