日本語PDF

データベース・シャーディング

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

シャーディングではグローバル・データ・サービス(GDS)を使用します。GDSは可用性、負荷、ネットワーク待機時間、レプリケーション・ラグなどのパラメータに基づいて、クライアント・リクエストを適切なデータベースにルーティングします。同じグローバル・サービスを提供する複製データベースのセットが、GDSプールです。GDSプールのデータベースは、異なる地域にまたがる複数のデータ・センターにあってもかまいません。共有GDSプールには、共有データベースのシャードとそのレプリカがすべて含まれ、データベース・クライアントには1つの共有データベースとして見えます。

アプリケーションは、1つ以上のシャーディング戦略に基づいてデータがパーティション化される複数のデータベース(シャード)に接続できます。この戦略は、ハッシュ・ベース、範囲ベース、リスト・ベースのいずれかです。データベース操作が必要になるたびに、アプリケーションは接続先のシャードを判断する必要があります。

シャーディング・キーが、1行分のデータが格納されるシャードを決定するパーティション化キーになります。1つの表は、シャーディング・キーを使用してパーティション化できます。

シャード・チャンクのコレクションをスーパー・シャーディング・キーと言い、ここにはスーパー・シャーディング・キー識別子という特定の値を持つチャンクのみが格納されます。スーパー・シャーディング・キーは、複数のデータベース・グループ間にデータを分散させるために使用されます。スーパー・シャーディング・キーを指定すると、ユーザー制御のデータ・パーティション化が可能になります。

ODP.NETシャーディング

バージョン12.2から、ODP.NETもOracle Databaseもシャーディングをサポートします。

注意:

ODP.NET管理対象ドライバおよびODP.NET Coreでは、シャーディングはサポートされていません。

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
  }
}