以前のOpenLDAPの記事では、OpenLDAPの導入から基本設定までを紹介しました。
今回はOpenLDAPの安定運用に欠かせないSYNCレプリケーションを使って行うLDAPサーバ間でのデータの同期方法について紹介したいと思います。
LDAPサーバ間でのデータの同期(SYNCレプリケーション)
OpenLDAPは、複数のLDAPサーバの間でのデータの同期を取る機能をサポートしています。
この機能を使うと、LDAPサーバが突然停止してしまったときに他のLDAPサーバで処理を代替したり、またLDAPクライアント側でLDAPサーバの参照先を分割することで大規模なシステムで一台のLDAPサーバに処理が集中することを防いだりすることができます。この機能をSYNCレプリケーションと呼びます。
SYNCレプリケーションでは、必要に応じてその時点の最新のデータをLDAP Content Synchronization Protocolというプロトコルを利用して複製します。
SYNCレプリケーションでは、データを保持しているサーバをプロバイダ、複製を受けるサーバをコンシューマと呼びます。
SYNCレプリケーションのタイプ
SYNCレプリケーションでは、refreshOnly と refreshAndPersistの2つのレプリケーションのタイプがあります。
どちらのレプリケーションタイプでも、プロバイダとコンシューマは、互いにsid、ridという識別番号を持ちます。
またコンシューマの状態を示すcookieと呼ばれる値を、プロバイダとコンシューマが持っています。この3つの数値を使って、レプリケーションの状態が管理されます。
refreshOnlyタイプでは、コンシューマは定期的にプロバイダへのポーリング(連携動作する際に、送信(あるいは処理)要求がないか確認すること) を行います。
プロバイダは、同期処理が完了すると次の同期処理のためのcookieをコンシューマに渡し、コンシューマが次の同期処理を行うまでの間の変更の履歴をこのcookieに基づいたセッションログとして管理します。コンシューマからの次のポーリングでは、このcookieの値に基づき、前の同期からの変更データが転送されます。セッションログに更新データが保管しきれなくなった場合や、セッションログに保管されていないデータの更新が必要になった場合には、すべてのデータが転送されます。
refreshAndPersistでは、基本的な同期処理の方法はrefreshOnlyと同様ですが、同期処理が完了してもコンシューマとプロバイダとの接続は切断されません。コンシューマ側の同期処理と同期処理の間に、プロバイダがコンシューマの状態を更新すべきと判断すると、プロバイダからコンシューマに更新情報メッセージが送信される場合があります。もし、プロバイダとコンシューマの間の接続が切断されると、コンシューマは次の同期処理のタイミングで再接続します。
タイプの違いについてまとめると下記の通りになります。
- refreshOnly:コンシューマは定期的にプロバイダの389/tcpにTCPセッションを張ることでデータの同期を試みます(ポーリング方式)
- refreshAndPersist:接続の維持が行われるため,コンシューマはプロバイダの389/tcpにセッションを張り続け、更新データの有無をリアルタイムにプロバイダから受け取ることができます(リスニング方式)
極力リアルタイムにレプリケーションを行いたい場合はrefreshAndPersistを選択し、負荷を少なくするために適度なインターバルをもってレプリケーションを行いたい場合には、refreshOnlyをするのが良いでしょう。
プロバイダ側のSYNCレプリケーション設定
SYNCレプリケーションを提供するサーバでは、SYNCレプリケーションに必要なモジュールを読み込み、機能を有効にし、セッションログの管理方法を設定する必要があります。
モジュール読み込みの設定
プロバイダでは、SYNCレプリケーションを管理するモジュールsyncprovを読み込む必要があります。モジュールの読み込みを行うには、cn=module,cn=configというエントリを作成し、読み込むモジュールを定義する必要があります。次は、モジュール管理用エントリを作成するLDIFファイルの例です。
|
モジュール設定用LDIF(syncprov-module.ldif) dn: cn=module,cn=config objectClass: olcModulelist cn: module olcModulePath: /usr/lib64/openldap ① olcModuleLoad: syncprov.la ② |
①で指定しているのは、モジュールが保管されているディレクトリです。CentOSの場合には/usr/lib64/openldapとなります。②は、プロバイダに必要なsyncprovモジュールを読み込むための設定です。ファイルができたら、このエントリを作成します。
|
モジュール設定のエントリの作成 # ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov-module.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=module,cn=config" |
SYNCプロバイダの有効化
レプリケーションを行うデータベースに対して、プロバイダの設定を行います。該当のデータベースの設定エントリの配下に、プロバイダ設定用のエントリを追加します。次は、ユーザ管理用データベースにプロバイダの設定を行うためのエントリを作成するLDIFファイルの例です。
なお、以前の記事でも説明していますが、olcDatabase={2}hdb,cn=config がユーザデータを格納するための設定データが格納されているエントリとなります。
|
ユーザ管理用データベースにプロバイダの設定を行うエントリのLDIF(syncprov.ldif) dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config objectClass: olcOverlayConfig ① objectClass: olcSyncProvConfig ② olcOverlay: syncprov ③ olcSpSessionLog: 100 ④ |
①②のように、syncprovオーバーレイ※1の設定用エントリでは、olcOverlayConfig,olcSyncProvConfigのオブジェクトクラスを使用します。
③のolcOverlayは有効にするオーバーレイの設定で、olcDatabase={1}hdb,cn=configで管理するデータベースに対して、SYNCプロバイダのオーバーレイを有効にすることを意味しています。
④は、SYNCプロバイダのオーバーレイ設定パラメータで、属性値はセッションログの最大保持数です。
※1 オーバーレイとは、OpenLDAPの機能拡張モジュールのことで、syncprovはLDAP Syncレプリケーションにおけるマスタサーバの機能を追加します。
次のように、ldapaddコマンドを使って、このエントリを作成すると、SYNCプロバイダとしての設定が完了します。
|
ユーザデータベースへのSYNCプロバイダの設定 # ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcOverLay=syncprov,olcDatabase={2}hdb,cn=config" |
コンシューマ側のSYNCレプリケーション設定
コンシューマ側では、通常のLDAPサーバとしての設定を行った上で、プロバイダサーバへの接続方法、同期処理、複製するデータに関する設定を行う必要があります。
LDIFファイルの準備
コンシューマ設定は、同期をとるデータベースの設定エントリに、属性を追加することで行います。次は、属性を追加するLDIFファイルの例です。
|
コンシューマのレプリケーション設定用LDIFファイル(syncrepl.ldif) dn: olcDatabase={1}hdb,cn=config changetype: modyfy add: olcSyncRepl oclSyncRepl: rid=1 ① provider=ldap://192.168.0.100:389/ ② bindmethod=simple ③ binddn="cn=Manager,dc=my-domain,dc=com" ④ credentiials=admin ⑤ type=refreshAndPersist ⑥ interval=00:00:05:00 ⑦ serchbase="dc=my-domain,dc=com" ⑧ filter(|(objectClass=organization)(objectClass=organizationRole) (objectClass=organizationalUnit)(objectClass=posiAccount)(objectClass=person) ⑨ scope=sub ⑩ retry="60 10 300 3" ⑪ |
LDIFファイルでは、②~⑪のようにスペースで始まる行を前の行の続きとして扱います。単語の区切りとしてのスペースも必要なため、必ず2つ以上のスペースが必要になりますので注意してください。
プロバイダへの接続の設定
①では、このコンシューマの識別番号(rid)を指定しています。ridは3桁以内の数値(つまり0 ~ 999)でなければなりません。
②~⑤はプロバイダの接続情報です。192.168.0.100がLDAPサーバのIPアドレスとなります。接続に使用するbinddnは読み取り権限があれば良いため、セキュリティを考慮してプロバイダの特権DN(rootdn)ではなく、それ以外のDNを指定することをおすすめします。ここでは、特権DNがManagerなので、別途準備したadminとしています。
同期処理の設定
⑥には、同期レプリケーションのタイプを指定します。refreshOnlyまたはrefreshAndPsersistです。
⑦はrefreshOnlyの場合に同期処理を行う間隔であり、左から日時分秒を指定します。この例では5分に一度の同期をとることを指定しています。
⑧~⑩では同期処理を行うLDAPデータの指定を行います。⑧ではLDAPデータの検索を開始するDNを指定し、⑨はデータ検索用のフィルタです。⑩は検索の対象になるスコープで、sub(サブツリーの下全部)、one(1階層下まで)、base(そのDNのみ)の3つのタイプを指定できます。
⑪は検索に失敗した場合のリトライの設定です。4つの数値は、順にリトライ間隔(秒)、リトライ回数、リトライ回数経過後の再リトライ開始までの間隔(秒)、再リトライの回数の指定です。再リトライの回数を実施しても同期がとれない場合には、同期処理を停止します。
設定の適用
用意したLDIFファイルを使って、データベースの設定を変更することで、設定が適用されます。
|
ユーザデータベースへのSYNCプロバイダの設定 # ldapadd -Y EXTERNAL -H ldapi:/// -f syncrepl.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcDatabase={2}hdb,cn=config" |
レプリケーションの設定は以上となります。
プロバイダ側のデータを更新し、レプリケーションによりコンシューマ側のデータが更新されているか確認してみてください。
クライアントの設定
最後にOpenLDAPサービスを利用するクライアント側の設定について説明します。
|
OpenLDAPクライアント側でプロバイダとコンシューマの両方を参照先として設定する。 # authconfig --ldapserver=192.168.0.100,192.168.0.101 --update or # authconfig --ldapserver=master.server,slave.server --update |
ホスト名もしくはIPアドレスで、OpenLDAPサーバをカンマ区切りで設定します。
上記の設定を行うことにより、プロバイダがダウン時に参照先がコンシューマに切り替わり、LDAP サービスは継続されるようになります。
また、上記のようにプロバイダとコンシューマの両方を参照するのではなく、LDAPクライアント側で参照先のOpenLDAPサーバを分けることで負荷分散させることが可能です。
同期の精度が求められる場合には、更新間隔を短くしてください。
まとめ
いかがでしたでしょうか?
OpenLDAPでは、今回紹介したように較的簡単な手順でレプリケーション設定を行うことが出来ます。
またOpenLDAPのバックアップは、slapcatコマンドを使って行うことが出来ます。
|
ディレクトリ本体と設定(cn=config)をLDIFに出力する。 # /usr/sbin/slapcat > awsldap.ldif # /usr/sbin/slapcat -b cn=config > awsldap-config.ldif |
こちらをCronへ登録するなどすることで、バックアップの自動化も簡単に行えます。
OpenLDAPを利用したシステムが大規模化してきた場合には、バックアップとレプリケーションの両方を組み込んでおくことで、より安全な運用が可能となりますのでぜひお試しください。
それでは。