openldap-2.4版本主从配置
PS:最近在搞ldap,当正在进行主从配置的时候,发现装的2.4.23版本的竟然没有slurpd这个守护进程的开启命令。然后上网搜了一下,原来2.4版本以后对主从、主主等模式做了大的改进。然后翻看官方的文档,将这些记录了下来。当然此文带有严重的本人理解色彩,所以如果出错,请见谅!能指出最好。
OpenLdap v2.3之前的同步复制缺点:
slurpd守护进程是以推模式操作 : 主服务器推送变更的数据到从服务器 (不可靠) |
对replog中的记录的次序极为敏感 |
很容易失去同步, 这时需要手工干预来从主目录重新同步从服务器数据库 |
如果一个从服务器长时间停机,replog可能变得太大以至于slurpd无法处理 |
只工作在推模式(也可以设置为拉模式,但是这种感觉类似于将master上的数据做了一个快捷连接到slave上) |
需要停止和重新启动主服务器来增加从服务器 |
只支持单一主服务器复制(1台主对多从) |
OpenLDAP v2.4之后的同步功能:
PS:新版最大的功能就是实现了双向复制,即双主、多主模式,无论哪一台master宕机,都不会影响使用。
新版主从配置有五中方式,这里只讲述最基本也是最简单的Syncrepl主从配置、MirrorMode镜像模式N-Way Multi-Master(多主)三种方式。
Syncrepl |
该方式是slave服务器以拉的方式同步master的用户数据 该方式缺点:当你修改一个条目中的一个属性值(or大批量的万级别的某1属性值),它不是简单的同步过来这些属性,而是把修改的条目一起同步更新来。 |
Delta-syncrepl |
比上一条多了个功能:基于日志同步: 你在master每更改1条记录,肯定会产生1条日志,那么slave会通过你的master日志进行相应的修改,这就克服了上一条的缺点。 |
N-Way Multi-Master | 多主方式同步LDAP信息 |
MirrorMode |
该方式是服务器互相推送信息的方式同步用户数据 MirrorMode只支持2个主master(2个主master可以+N个slave),但是你如果非得加了3 、4 台master后,那么其余的都只能从前2台master上获取数据,而不能将本身的数据推送过去。 如果你有类似需求,也可以使用这个方式。(比如,你企业分散点多,然后不希望都具有修改功能,可以使用它) |
Syncrepl Proxy |
代理同步。 意思是将主master隐藏起来,而代理机上边通过Syncrepl从master主机以拉的方式同步master用户数据,当代理主机发生改变时,代理主机的LDAP又以推的方式将数据更新到下属的slave LDAP服务器上。slave LDAP 只有对代理LDAP服务器的读权限。 |
OpenLDAP v2.4 同步功能例子:
①、Syncrepl
由于syncrepl为拉取模式(到master拉数据),所以配置文件配置slave端的slapd.conf文件即可。初始化操作2种,1、通过配置文件,当开启syncrepl引擎后会到master拉数据;2、从主服务器备份数据,复制到slave。当从备份数据初始化的时候,不必担心数据老,因为syncrepl会自动进行校验,然后进行相应的修改、同步。(当复制一个大规模的“条录”,建议从备份初始化)
1、配置master端LDAP
上文说了,有五种同步模式,所以需要首先定义一种,另外还需要定义 contextCSN(应该是做同步状态比对) 和session log。 下面是一个例子:
database bdb suffix dc=Example,dc=com rootdn dc=Example,dc=com directory /var/ldap/db index objectclass,entryCSN,entryUUID eq overlay syncprov syncprov-checkpoint 100 10 #contextCSN syncprov-sessionlog 100 #session log
2、配置slave端LDAP
database hdb suffix dc=Example,dc=com rootdn dc=Example,dc=com directory /var/ldap/db index objectclass,entryCSN,entryUUID eq syncrepl rid=123 provider=ldap://provider.example.com:389 type=refreshOnly interval=01:00:00:00 searchbase="dc=example,dc=com" filter="(objectClass=organizationalPerson)" scope=sub attrs="cn,sn,ou,telephoneNumber,title,l" schemachecking=off bindmethod=simple binddn="cn=syncuser,dc=example,dc=com" credentials=secret
在这个例子中,slave会连接到ldap://provider.example.com:389进行同步,他将使用simple认证(passwd secret)来验证并捆绑cn=syncuser,dc=example,dc=com。
PS:注意slave是使用读写权限到master中进行同步的!
master 的 slapd服务不需要重启。contextCSN会根据需要自动生成。它可能最初包含在LDIF文件中,在变成的情况下产生,或者在slave第一次连接master进行同步的时候产生。如果LDIF文件在被加载时不包含contextCSN时,-w 应与slapadd一起使用,以使它产生。这样会使slave第一次进行同步的反应更快。
该cookie是一个逗号分隔的name = value的列表。 目前支持的syncrepl的cookie字段arecsn=<csn> andrid=<rid>。<csn>代表slave的当前同步状态。 <rid>本地识别客户服务器中的用户复本。它用来匹配cookie与slapd.conf中定义的标示符。该<rid>必须有不超过3位小数。 在命令行中的cookie将覆盖存储在使用者副本数据库同步的cookie。
②、Delta-syncrepl
1、配置master端LDAP
更改master的slapd.conf:(轻忽复制粘贴,比对配置进行相应添加)
# Give the replica DN unlimited read access. This ACL needs to be # merged with other ACL statements, and/or moved within the scope # of a database. The "by * break" portion causes evaluation of # subsequent rules. See slapd.access(5) for details. access to * by dn.base="cn=replicator,dc=symas,dc=com" read by * break # Set the module path location modulepath /opt/symas/lib/openldap # Load the hdb backend moduleload back_hdb.la # Load the accesslog overlay moduleload accesslog.la #Load the syncprov overlay moduleload syncprov.la # Accesslog database definitions database hdb suffix cn=accesslog directory /db/accesslog rootdn cn=accesslog index default eq index entryCSN,objectClass,reqEnd,reqResult,reqStart overlay syncprov syncprov-nopresent TRUE syncprov-reloadhint TRUE # Let the replica DN have limitless searches limits dn.exact="cn=replicator,dc=symas,dc=com" time.soft=unlimited time.hard=unlimited size.soft # Primary database definitions database hdb suffix "dc=symas,dc=com" rootdn "cn=manager,dc=symas,dc=com" ## Whatever other configuration options are desired # syncprov specific indexing index entryCSN eq index entryUUID eq # syncrepl Provider for primary db overlay syncprov syncprov-checkpoint 1000 60 # accesslog overlay definitions for primary db overlay accesslog logdb cn=accesslog logops writes logsuccess TRUE # scan the accesslog DB every day, and purge entries older than 7 days logpurge 07+00:00 01+00:00 # Let the replica DN have limitless searches limits dn.exact="cn=replicator,dc=symas,dc=com" time.soft=unlimited time.hard=unlimited site
2、slave配置
# Replica database configuration database hdb suffix "dc=symas,dc=com" rootdn "cn=manager,dc=symas,dc=com" ## Whatever other configuration bits for the replica, like indexing ## that you want # syncrepl specific indices index entryUUID eq # syncrepl directives syncrepl rid=0 provider=ldap://ldapmaster.symas.com:389 bindmethod=simple binddn="cn=replicator,dc=symas,dc=com" credentials=secret searchbase="dc=symas,dc=com" logbase="cn=accesslog" logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=on type=refreshAndPersist retry="60 +" syncdata=accesslog # Refer updates to the master updateref ldap://ldapmaster.symas.com
上述配置是假定你已经在你的数据库中定义一个复制的标识(绑定master),此外,所有的数据库(primary, replica, and the accesslog storage database)还应该适当调整,以满足您的需求(DB_CONFIG文件)。
③N-Way Multi-Master
对于下面的例子中,我们将使用3个主节点。
配置数据库信息如下:
dn: cn=config objectClass: olcGlobal cn: config olcServerID: 1 dn: olcDatabase={0}config,cn=config objectClass: olcDatabaseConfig olcDatabase: {0}config olcRootPW: secret
第2、3台LDAPserver区别olcServerID :
dn: cn=config objectClass: olcGlobal cn: config olcServerID: 2 dn: olcDatabase={0}config,cn=config objectClass: olcDatabaseConfig olcDatabase: {0}config olcRootPW: secret
以下的配置设置syncrepl(3台master都需要配置,用来互相同步)
dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulePath: /usr/local/libexec/openldap olcModuleLoad: syncprov.la
现在我们启动第一个master节点(替换掉以下配置中的$URL1/$URL2/* 为实际的ldap urls)
dn: cn=config changetype: modify replace: olcServerID olcServerID: 1 $URI1 olcServerID: 2 $URI2 olcServerID: 3 $URI3 dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov dn: olcDatabase={0}config,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple credentials=secret searchbase="cn=config" type=refreshAndPersist retry="5 5 300 5" timeout=1 olcSyncRepl: rid=002 provider=$URI2 binddn="cn=config" bindmethod=simple credentials=secret searchbase="cn=config" type=refreshAndPersist retry="5 5 300 5" timeout=1 olcSyncRepl: rid=003 provider=$URI3 binddn="cn=config" bindmethod=simple credentials=secret searchbase="cn=config" type=refreshAndPersist retry="5 5 300 5" timeout=1 - add: olcMirrorMode olcMirrorMode: TRUE
现在启动了Master,并且在LDIF中配置了第一、第二消费,它会复制cn=config。你现在已经有了N路-多主机的数据库配置。
我们接下来还需要复制数据,不仅仅是配置信息,所以添加到主机(所有的消费队列/mater会同步这个配置)。此外,还需要替换掉所有的${}为你适当的环境配置信息。
dn: olcDatabase={1}$BACKEND,cn=config objectClass: olcDatabaseConfig objectClass: olc${BACKEND}Config olcDatabase: {1}$BACKEND olcSuffix: $BASEDN olcDbDirectory: ./db olcRootDN: $MANAGERDN olcRootPW: $PASSWD olcLimits: dn.exact="$MANAGERDN" time.soft=unlimited time.hard=unlimited size.soft=unlimit olcSyncRepl: rid=004 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly interval=00:00:00:10 retry="5 5 300 5" timeout=1 olcSyncRepl: rid=005 provider=$URI2 binddn="$MANAGERDN" bindmethod=simple credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly interval=00:00:00:10 retry="5 5 300 5" timeout=1 olcSyncRepl: rid=006 provider=$URI3 binddn="$MANAGERDN" bindmethod=simple credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly interval=00:00:00:10 retry="5 5 300 5" timeout=1 olcMirrorMode: TRUE dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov
注意:你的所有master时钟必须同步!
注意:正如slapd-config中,URLs配置( inolcSyncRepl)必须是从哪些URLs复制数据的地址。这些必须与slapd端口监听的地址一样。否则slapd可能会尝试从自身复制,造成循环。
④、MirrorMode
第一个步骤是配置syncrepl
MirrorMode node 1:
# Global section serverID 1 # database section # syncrepl directive syncrepl rid=001 provider=ldap://ldap-sid2.example.com bindmethod=simple binddn="cn=mirrormode,dc=example,dc=com" credentials=mirrormode searchbase="dc=example,dc=com" schemachecking=on type=refreshAndPersist retry="60 +" mirrormode on
MirrorMode node 2:
# Global section serverID 2 # database section # syncrepl directive syncrepl rid=001 provider=ldap://ldap-sid1.example.com bindmethod=simple binddn="cn=mirrormode,dc=example,dc=com" credentials=mirrormode searchbase="dc=example,dc=com" schemachecking=on type=refreshAndPersist retry="60 +" mirrormode on
原理很简单,每个MirrorMode节点的设置完全一样,不同之处在于serverID都是独一无二的,每个消费者指向到其他服务器。
故障转移配置
通常这样有2中选择:1.硬件代理/负载平衡或专用的代理软件;2.使用备用LDAP代理作为syncrepl提供商。
图片挂了,我不知道为什么,有时间我把图片改一个链接吧
普通消费者配置
slave的配置相同,它可以配置成常规的syncrepl模式,也可以是delta-syncrepl模式。(如上的例子)
优点
现在,您将有一个目录的架构,提供了所有的单主复制的一致性保证,同时也提供了多主机复制的高可用性。
⑤、Syncrepl Proxy
(由于字数限制,这一种会再写一篇)
预告:(2中模式)
基于推的方式
基于拉的方式
openldap-2.4新主从配置详细介绍(1)