7.2. レプリケーション環境で Directory Server がスキーマ更新を管理する方法
cn=schema ツリー内のディレクトリースキーマを更新すると、Directory Server は変更状態番号 (CSN) を含む変更を /etc/dirsrv/slapd-<instance_name>/schema/99user.ldif ファイルに保存します。
Directory Server は、スキーマの変更を他のレプリカに直接複製しません。スキーマレプリケーションは、ディレクトリーのコンテンツが複製されたツリーで更新されると開始します。たとえば、スキーマを変更した後にユーザーを更新すると、サプライヤーは nsSchemaCSN 属性に格納されている CSN をコンシューマーの CSN と比較します。コンシューマーの nsSchemaCSN 属性の値がサプライヤーの値よりも低い場合、Directory Server はスキーマをコンシューマーに複製します。レプリケーションに成功すると、サプライヤーにあるすべてのオブジェクトクラスと属性タイプはコンシューマーの定義のスーパーセットである必要があります。
例7.1 スキーマのサブセットとスーパーセット
-
server1では、exampleオブジェクトクラスがa1属性、a2属性、およびa3属性を許可します。 -
server2では、exampleオブジェクトクラスがa1属性およびa3属性を許可します。
前の例では、server1 の example オブジェクトクラスのスキーマ定義は、server2 のオブジェクトクラスのスーパーセットです。検証フェーズで、Directory Server がスキーマを複製または受け入れると、サーバーはスーパーセット定義を取得します。たとえば、ローカルスキーマのオブジェクトクラスがサプライヤースキーマのオブジェクトクラスよりも少ない属性を許可していることをコンシューマーが検出すると、Directory Server がローカルスキーマを更新します。
スキーマ定義が正常にレプリケートされた場合、nsSchemaCSN 属性は両サーバーで同一になり、オブジェクトクラスや属性タイプなどのスキーマ定義はレプリケーションセッションの開始時に比較されなくなります。
次のシナリオでは、Directory Server はスキーマを複製しません。
あるホストのスキーマが、別のホストのスキーマのサブセットの場合
たとえば、
server2にあるexampleオブジェクトクラスのスキーマ定義は、server1のオブジェクトクラスのサブセットです。サブセットは、属性 (単一値属性は多値属性のサブセット) および属性の構文に対しても発生する可能性があります。- サプライヤースキーマとコンシューマースキーマの定義をマージする必要がある場合
-
Directory Server がマージするスキーマをサポートしない場合。たとえば、1 台のサーバーのオブジェクトクラスが
a1属性、a2属性、およびa3属性を許可し、別のサーバーのオブジェクトクラスがa1属性、a3属性、およびa4属性を許可する場合、スキーマはサブセットではないので、マージできません。 /etc/dirsrv/slapd-<instance_name>/schema/99user.ldif以外のスキーマファイルを使用する場合Directory Server を使用すると、
/etc/dirsrv/slapd-instance_name/schema/ディレクトリーにスキーマファイルを追加できます。ただし、/etc/dirsrv/slapd-instance_name/schema/99user.ldifファイルの CSN のみが更新されます。このため、他のスキーマファイルはローカルでのみ使用され、レプリケーションパートナーに自動的に転送されません。重要Directory Server がスキーマを自動的にレプリケートできるようにし、スキーマ定義の重複を回避するには、カスタムスキーマを
/etc/dirsrv/slapd-<instance_name>/schema/99user.ldifファイルに保存します。