データベース・シャーディング
シャーディングは、独立したデータベース間でデータが水平にパーティション化されるデータ階層アーキテクチャです。このような構成内の各データベースをシャードと呼びます。すべてのシャードが一体的に単一の論理データベースを形成し、これはシャード・データベースと呼ばれます。シャーディングは、シェアード・ナッシング型のデータベース・アーキテクチャです。物理データベースが独立しており、CPU、メモリー、ストレージ・デバイスを共有しません。ただし、アプリケーション側から見ると、物理データベースのコレクションが1つの論理データベースのように見えます。
シャーディングではグローバル・データ・サービス(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) ) )