【389 Directory Server講座 第5回】マルチマスターレプリケーション構築。可用性99.999%への道と競合解決の仕組み

「認証サーバーが止まりました」=「全社員が仕事できません」

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、ACIによるアクセス制御について学びました。
これでセキュアなディレクトリができましたが、サーバーが「1台」しかない状態は、インフラエンジニアにとって悪夢でしかありません。

認証基盤はシステムの「心臓」です。
Webサーバーが落ちてもWebが見られないだけですが、LDAPサーバーが落ちると、PCへのログイン、メールの送受信、ファイルサーバーへのアクセス、VPN接続……すべてが停止します。
このSPOF(単一障害点)を解消するのが「レプリケーション」です。

コウ君

先生、レプリケーションはOpenLDAPでもやってました!
でも、マスター(書き込み用)とスレーブ(読み取り用)を分けて構成してたら、マスターが死んだときに書き込みができなくなって、手動でスレーブを昇格させる作業で徹夜しました……。
「どっちに書き込んでもOK」みたいな夢のような構成はないんですか?

リナックス先生

コウ君、それこそが389 Directory Serverの真骨頂よ。
389 DSは「マルチマスターレプリケーション (MMR)」を標準でサポートしているの。
4台以上のマスター構成も組めるし、どのサーバーで更新しても、瞬時に他のサーバーへ同期されるわ。
しかも、同時に同じデータを書き換えた時の「競合解決」ロジックが非常に優秀なの。
今回もウィンドウズ先生に、止まらないシステムの極意を教えてもらいましょう!

ウィンドウズ先生

はい、ウィンドウズ先生です。
Active Directoryもマルチマスターですが、389 DSも同様のアーキテクチャを持っています。
OpenLDAPのMirrorMode設定で苦労した方なら、389 DSの「設定のシンプルさ」と「動作の安定性」に驚くはずです。
今回は、単なる設定手順だけでなく、裏側で動いているCSN(Change Sequence Number)の仕組みや、障害発生時の挙動まで、プロとして知っておくべき深層を解説します。

本記事では、レプリケーションの基礎理論、トポロジー設計、dsconf コマンドによる構築手順、そして障害復旧テストまでを徹底解説します。

🐧 389 Directory Server 完全攻略講座 カリキュラム


第1章:レプリケーションの基礎理論と用語定義

構築に入る前に、389 DSにおけるレプリケーションの用語を整理しましょう。
OpenLDAPやデータベース用語とは微妙に異なる部分があります。

3つの役割(ロール)

役割名 機能概要 書き込み
Supplier (Master) データの発生源。更新を受け付け、他のサーバーへ変更を通知する。 可能
Consumer (Slave) データの受信者。Supplierから更新を受け取る。読み取り専用。 不可(ReferralでSupplierへ転送)
Hub Consumerでありながら、さらに下流のConsumerへデータを中継する。 不可

マルチマスターレプリケーション (MMR)

2台以上のサーバーが「Supplier」として互いにデータを同期し合う構成です。
389 DSでは、最大4台までの書き込み可能なSupplierを構成できます(理論上はもっと可能ですが、競合解決のオーバーヘッドのため4台が推奨上限です)。

レプリケーションアグリーメント (Agreement)

「サーバーAからサーバーBへ同期する」という契約のことです。
一方通行の設定なので、双方向(マルチマスター)にする場合は、A→B と B→A の2つのアグリーメントを作成する必要があります。


第2章:競合解決のロジック。CSNとRUVの役割

「2台のサーバーで、同時に同じユーザーの電話番号を変更したらどうなるのか?」
このデータの整合性を保つ仕組みが、389 DSの心臓部です。

CSN (Change Sequence Number)

すべての変更操作(Add, Modify, Delete)には、CSN という一意なIDが付与されます。
CSNは以下の要素で構成されています。

Timestamp + Sequence + ReplicaID + SubSequence

競合が発生した場合、389 DSは「CSNのタイムスタンプが新しい方を勝者とする(Last Write Wins)」というルールで自動解決します。
これにより、管理者が介入することなくデータの収束が行われます。

RUV (Replica Update Vector)

「どのサーバーの変更を、どこまで取り込んだか」を管理する情報です。
Gitのコミットハッシュのようなものです。
レプリケーションが遅延している場合、このRUVを比較することで「サーバーBはサーバーAの5分前の状態だ」といった診断が可能になります。

💡 プロの注意点:時刻同期の重要性
CSNはタイムスタンプベースです。
もしサーバー間の時刻が大幅にずれていると、古い変更が「最新」と誤認され、データが先祖返りする恐れがあります。
NTP (Chrony) の設定は、LDAP構築前に必ず完璧にしておいてください。


第3章:設計フェーズ。トポロジーと可用性レベル

現場でよく使われる構成パターンを紹介します。

パターンA:2ノード・マルチマスター(推奨)

  • 構成: Supplier A ⇔ Supplier B
  • 特徴: シンプルで強力。どちらが落ちても読み書き可能。
  • 用途: 中小規模〜大規模(数万ユーザー程度)まで幅広く対応。

パターンB:マルチマスター + 読み取り専用スレーブ

  • 構成: (Supplier A ⇔ Supplier B) → Consumer C, D, E…
  • 特徴: 書き込み負荷と読み取り負荷を分離。
  • 用途: 全国の拠点に読み取り専用サーバーを配置したい場合など。

今回は、基本かつ最強の「パターンA(2ノード・マルチマスター)」を構築します。


第4章:実践構築(1) 準備とレプリケーション有効化

それでは実際に構築しましょう。
サーバー2台(ldap01, ldap02)に、第2回の要領で389 DSがインストールされ、同じサフィックス(dc=linuxkoubou,dc=com)でインスタンスが作成されている状態からスタートします。

1. 名前解決とポート開放

お互いのFQDNを解決できる必要があります。

# /etc/hosts (両ノード)
192.168.1.11 ldap01.linuxkoubou.com
192.168.1.12 ldap02.linuxkoubou.com

FirewallでLDAPポートを開放します。

firewall-cmd --add-service={ldap,ldaps} --permanent
firewall-cmd --reload

2. レプリケーション管理者ユーザーの作成

レプリケーションの認証に使われる専用ユーザー(Bind DN)を作成します。
cn=Directory Manager を使うこともできますが、セキュリティ上、専用ユーザーを作るのがベストプラクティスです。

# 両ノードで実行
dsconf localhost replication create-manager --name "cn=replication manager,cn=config" --password "ReplPass123!"

3. レプリケーションの有効化

各サーバーを「サプライヤー」として設定し、一意なID(Replica ID)を割り当てます。
Replica IDは重複してはいけません(1〜65535)。

ldap01 (ID: 1) で実行:

dsconf localhost replication enable --role supplier --replica-id 1 --bind-dn "cn=replication manager,cn=config"

ldap02 (ID: 2) で実行:

dsconf localhost replication enable --role supplier --replica-id 2 --bind-dn "cn=replication manager,cn=config"

これで各サーバーは「レプリケーションする準備」が整いました。


第5章:実践構築(2) アグリーメント作成と初期化

準備ができたら、2台を接続(アグリーメント作成)し、データを同期させます。

1. アグリーメントの作成 (ldap01 -> ldap02)

ldap01に対し、「ldap02へデータを送れ」と指示します。

# ldap01で実行
dsconf localhost repl-agmt create --suffix "dc=linuxkoubou,dc=com" \
  --host "ldap02.linuxkoubou.com" --port 389 \
  --conn-transport TCP \
  --bind-dn "cn=replication manager,cn=config" --bind-passwd "ReplPass123!" \
  agmt-to-ldap02

2. アグリーメントの作成 (ldap02 -> ldap01)

逆方向も設定します。

# ldap02で実行
dsconf localhost repl-agmt create --suffix "dc=linuxkoubou,dc=com" \
  --host "ldap01.linuxkoubou.com" --port 389 \
  --conn-transport TCP \
  --bind-dn "cn=replication manager,cn=config" --bind-passwd "ReplPass123!" \
  agmt-to-ldap01

3. 初期化(Total Initialization)

アグリーメントを作っただけではデータは同期されません。
最初に一度だけ、片方のデータでもう片方を上書きする「初期化」が必要です。
ここでは ldap01 を正として、ldap02 を初期化します。

# ldap01で実行
dsconf localhost repl-agmt init --suffix "dc=linuxkoubou,dc=com" agmt-to-ldap02

コマンドを実行すると、ldap01の全データがldap02へ転送されます。
ステータスを確認してみましょう。

dsconf localhost repl-agmt status --suffix "dc=linuxkoubou,dc=com" agmt-to-ldap02

Status: 0 (Replica acquired successfully: Total update succeeded) と表示されれば完了です。


第6章:トラブルシューティングと監視

「レプリケーションが動かない!」という時、見るべきポイントは決まっています。

1. ステータスコードの確認

先ほどの repl-agmt status コマンドでエラーコードを確認します。

  • Error -1 (Can’t contact LDAP server): 通信エラー。相手のFirewall、ポート番号、名前解決を確認。
  • Error 49 (Invalid credentials): 認証エラー。cn=replication manager のパスワードが間違っている。

2. ログの確認

389 DSのエラーログは非常に詳細です。
/var/log/dirsrv/slapd-localhost/errorstail -f しながら初期化を実行すると、原因が一目瞭然です。

3. コンフリクトエントリの確認

競合解決の結果、敗北したデータは消えるわけではなく、「コンフリクトエントリ(dnに特定のUUIDが付く)」として隠し保存される場合があります。
これが増えすぎるとパフォーマンスに影響するため、定期的にチェックします。

ldapsearch -D "cn=Directory Manager" -W -b "dc=linuxkoubou,dc=com" "nsds5ReplConflict=*"

第7章:障害試験。マスターを停止してみる

構築したら、必ず「壊すテスト」をしましょう。

試験シナリオ

  1. ldap01を停止する: systemctl stop dirsrv@localhost
  2. ldap02で更新する: dsidm localhost user create... でユーザーを追加。
  3. ldap01を復旧する: systemctl start dirsrv@localhost
  4. 同期確認: 数秒後、ldap01にもユーザーが追加されているか確認。

これが成功すれば、あなたの構築したシステムは「片肺運転」に耐えうる堅牢なシステムであると証明されます。

💡 プロのノウハウ:ロードバランサー (LB)
マルチマスター構成では、クライアントがどのサーバーに接続するかを制御するために、ロードバランサー(HAProxyやF5など)またはDNSラウンドロビンを使用します。
ただし、アプリケーションによっては「書き込み直後に読み込むとデータがない(同期遅延)」問題が起きるため、LBの設定で「特定ユーザーは同じサーバーに維持する(スティッキーセッション)」等の工夫が必要になる場合があります。


まとめ:可用性は設計と訓練から生まれる

お疲れ様でした!
第5回は、389 DSのマルチマスターレプリケーション構築について解説しました。

今回の重要ポイント:

  • 389 DSはマルチマスター構成(MMR)が標準であり、設定も容易。
  • CSNによる競合解決ロジックにより、データの整合性が保たれる。
  • アグリーメントは双方向に張る必要がある。
  • 時刻同期(NTP)はレプリケーションの命綱である。
ウィンドウズ先生

これで、ハードウェア障害が起きても止まらない認証基盤が完成しました。
しかし、可用性が高くても、通信が「平文」ではセキュリティ的に失格です。
次回は、LDAP通信を暗号化し、盗聴リスクから守るためのTLS/SSL化について学びましょう。

次回、第6回は「セキュリティ強化。自己署名証明書の撤廃とTLS完全化」です。
インストール時に作成された自己署名証明書を、Let’s Encryptなどの信頼できる証明書に入れ替え、平文通信(ポート389)を完全に無効化する手順を解説します。お楽しみに!

▼ HA構成を実験する ▼

複数台サーバーで検証
「おすすめVPS」

おすすめVPSを見る

可用性設計のエキスパートへ
「ITエンジニア転職」

転職エージェントを見る

コメント