Branch: http://svn.collab.net/repos/svn/branches/dav-mirror/
Purpose: This branch is meant to introduce a master/slave server
replication model for Subversion ra_dav transactions.
All clients interact with a slave server, but the slave transparently
passes all of the write-oriented activites to the master (rewriting the
content as necessary). The slaves are essentially read-only, but they
do have a complete copy of the repository locally. This serves to
alleviate read traffic from the master server which may be desirable
in certain circumstances.
This model has several advantages to using a straight HTTP DAV-aware
caching proxy, in that it can respond to all requests without seeing them
first.
Requirements: httpd 2.1 with mod_proxy enabled
(several fixes to mod_proxy were committed for this patch that
have not been backported to the 2.0 branch of httpd. Just use
HEAD of the httpd-2.0 repository.)
Issues/Thoughts:
- The master maybe should update the slaves using a DAV commit of its own.
(essentially replay the commit once it is approved). This requires
a way to inject commits/user to the slave. But, this would eliminate the
reliance on post-commit hooks.
- Alternatively, slaves could pull updates rather than being pushed out by
the master. How would this work? Separate process on client?
- This isn't multi-master replication. The slave won't accept commits
on its own. If the master can't be contacted for a write operation, it
will return a proxy error. (Multi-master == distributed repositories.)
- Remove the location_filter for the header. I believe mod_proxy does this
for us already. We may just be duplicating things. We will still have
to rewrite the bodies of the requests/responses though.
- Determine a better way to handle the MERGE call. It's the only operation
that doesn't occur on the activity URL.
- Cross fingers and see what people think of it.
Usage:
You must use the dav-mirror branch described above.
Each slave has:
<Location /repos/slave>
DAV svn
SVNPath /my/local/copy/of/repos
SVNMasterURI http://master.example.com/repos/master
</Location>
The master must have a post-commit hook that updates the slaves. An
example that does this using 'svnadmin dump'/'svnadmin load' and ssh is
provided here:
#!/bin/sh
REPOS="$1"
REV="$2"
SLAVE_HOST=slave.example.com
SLAVE_PATH=/my/local/copy/of/repos
svnadmin dump --incremental -r$2 $1 > /tmp/$2.dump
scp /tmp/$2.dump $SLAVE_HOST:$SLAVE_PATH
ssh $SLAVE_HOST "svnadmin load $SLAVE_PATH < $SLAVE_PATH/$2.dump"
ssh $SLAVE_HOST "rm $SLAVE_PATH/$2.dump"
rm /tmp/$2.dump