[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: Syncrepl: full sync vs. delta

Quanah Gibson-Mount wrote:
 I recently had to process some 40,000+ modifications through my set
 of directory servers.  Initially, I tested my changes through my dev
 boxes (2.3/HEAD using syncrepl).  This run took approximately 2
 hours, but the slaves were modified essentially as the master was.
 This length of time concerned me somewhat going forward, but on my
 production boxes (slurpd master->slave) it took only 45 minutes.

 I discussed this time disparity with Howard, and he made some
 modifications to syncrepl (full sync mode) that allowed the master to
 take the changes in around 16 minutes.

This is actually the change that Ralf Haferkamp asked for in ITS#3671, to always queue the psearch responses so that the original operation never has to wait for them. Now, for each active psearch a task is submitted to the runqueue to send out the responses. *

 However, the slaves still took several hours to catch up on these
 modifications, which meant they were out of sync for long periods of
 time.  Howard and I then discussed putting together the syncrepl
 delta method, using the accesslog backend (as previously discussed on
 -devel).  This worked (after some bugs in accesslog were fixed),
 where it took 37 minutes to push the updates through the master.  2
 of the 3 replica's finished within a few seconds of the master, and
 the 3rd slave finished within 5 minutes of the master.

There's obviously a reduction in network traffic from using the accesslog format, but I think the major bottleneck before was the slaves fully re-indexing all of the modified entries. By processing only the deltas, much less re-indexing work was needed, which allowed the slaves to keep up better with the master.

Of course, the update time on the master slowed down from 16 minutes to 37 minutes because it had to write to the accesslog db. (But compared to the 45 minutes on the production systems running OpenLDAP 2.2, this is still pretty good. Especially considering that 2.2 is just fopen'ing a flat text file and appending records to it, vs all of the work that accesslog on top of back-bdb does.)

 However, the problem with the way we currently have to set up
 delta-syncrepl (via accesslog) is that there is no way for a slave to
 become fully refreshed if its contextCSN is out of date.  It looks
 like this would take an extension to the syncrepl protocol for this
 to be done properly.  Objections? comments?

I wouldn't say "no way" (since I already outlined a way to do it) but it is certainly clunky. I believe it would be cleaner if the peristent log was an integral feature of the sync provider, and it would be more efficient if a delta mode was an integral part of the syncrepl protocol.

There's an obvious problem with the current implementation - it's using the ChangeSequenceNumbers as if they were CommitSequenceNumbers, and that can cause a problem during Refresh phase if a write op completed out of order.

I believe the only reason a write in back-bdb/hdb would complete out of order is because the transaction was randomly selected to resolve a deadlock, so it had to abort and retry, and some newer op managed to complete in the intervening time. I think there are two possible solutions here:
1) get a new CSN whenever a write op needs to abort and retry.
2) change the deadlock detector strategy to always select the youngest transaction to abort.

I'm not sure that (2) is sufficient by itself, but (1) ought to be.

* The cn=Runqueue,cn=Threads,cn=Monitor entry in back-monitor lets you see what tasks are currently executing on the runqueue. Perhaps we should extend this to also show the idle tasks, and maybe provide a trigger to force an idle task to start executing immediately. Of course at present I can't think of any tasks that would need to be kicked manually...
-- Howard Chu
Chief Architect, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc
OpenLDAP Core Team http://www.openldap.org/project/