mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-30 13:30:57 +08:00
Moved to servers/slurpd/NOTES
This commit is contained in:
parent
c43ad3b62f
commit
944f6a9903
@ -1,67 +0,0 @@
|
||||
Written by Ganesan Rajagopal <rganesan@debian.org> and placed in the public
|
||||
domain.
|
||||
|
||||
Replication in OpenLDAP
|
||||
-----------------------
|
||||
|
||||
Please read "Section 10. Replication with slurpd" in the OpenLDAP guide for
|
||||
an overview and configuration of single-master replication. This document
|
||||
describes the internals of the replication mechanism.
|
||||
|
||||
slapd/repl.c contains routines add_replica_info() and
|
||||
add_replica_suffix(). add_replica_info() adds a new host to the list of
|
||||
replicas for a backend. add_replica_info() returns a number for the
|
||||
replica. add_replica_suffix() must then be called with the replica number to
|
||||
add a suffix that is hosted on this replica. add_replica_info() and add_replica_suffix() do not lock the
|
||||
replog_mutex.
|
||||
|
||||
Replicas are specified in the slapd.conf file. When slapd/config.c sees a
|
||||
"replica" line in slapd.conf, it calls add_replica_info() with the host
|
||||
specified in the "host=" directive and then calls add_replica_suffix() with
|
||||
the replica number and and the suffix specified in the "suffix="
|
||||
directive.
|
||||
|
||||
slapd writes out a replication log file containing LDIF change records for
|
||||
each configured replica for a suffix. The change records are generated for
|
||||
add, modify, delete and modrdn operations. A function called replog() is
|
||||
called at the end of the routines do_add (slapd/add.c),
|
||||
do_modify(slapd/modify.c), do_delete(slapd/delete.c) and
|
||||
do_modrdn(slapd/modrnd.c) to write out the change records.
|
||||
|
||||
In master/slave replication, updates are not allowed on slave
|
||||
replicas. Therefore replog() is not called if the suffix is configured with
|
||||
a updatedn (which indicates that this is a slave replica), instead a
|
||||
referral is returned back to the client. If multi-master replication is
|
||||
enabled, replog() is always called whenever any of the above updates happen
|
||||
unless the dn which is making the change is the updatedn. When the dn making
|
||||
the change is the same as the updatedn, it is assumed that this entry is
|
||||
being replicated by a slurpd instance on another host. (Note: For this
|
||||
reason, the updatedn must not be a "regular" admin/user object in
|
||||
multi-master replication).
|
||||
|
||||
The function replog() in slapd/repl.c generates the actual change
|
||||
records. Each change record is preceded by the list of replicas to which
|
||||
this change record needs to be replicated, the time when this change
|
||||
happened and the dn this change applies to. The pseudo code for replog() is
|
||||
follows
|
||||
|
||||
1. Check that a replog exists.
|
||||
2. Lock the replog mutex.
|
||||
3. Open and lock the replog file.
|
||||
4. Normalize the dn for the entry and write out a "replica:" entry for each
|
||||
replica with a matching suffix.
|
||||
5. Write out the the timestamp and the dn for the entry.
|
||||
6. Depending on the type of change, write out an appropriate changetype
|
||||
record.
|
||||
7. Close the replication log
|
||||
8. Unlock the replog mutex
|
||||
|
||||
slurpd has a file manager routine (function fm()) which watches for any
|
||||
change in the replication log. Whenever fm() detects a change in the
|
||||
replication log it locks the log, appends the records to slurpd's private
|
||||
copy of the replication log and truncates the log. See the slurpd/DESIGN
|
||||
file for a description of how slurpd works.
|
||||
|
||||
slapd can be configured to write out a replication log even if no replicas
|
||||
are configured. In this case the administrator has to truncate the
|
||||
replication log manually (under a lock!).
|
Loading…
Reference in New Issue
Block a user