<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Folks,<br>
    Following Willy Offermans' recent response to this thread, I've
    decided to jump in, but wish to quote a bit more of Patrick's
    original message (below), hence the out-of-sequence reply.<br>
    <br>
    I'd like to address Patrick's issues in pretty much the order
    they're presented here.&nbsp; Firstly, however, I would like to echo some
    confusion as to the purpose of cyrdump.&nbsp; It seems to have been
    around since at least 2.2.3, but documentation has appeared only
    fleetingly, and says little about the program:<br>
    <blockquote>
      <pre>NAME
       cyrdump - dump mailboxes to stdout

SYNOPSIS
       cyrdump [-C &lt;configfile&gt;] [-v] [mboxpattern ...]

DESCRIPTION
       A tool for dumping IMAP mailboxes on a server.

       -C &lt;configfile&gt;
              Specify an alternate configuration file ( is used by default)

       -v     Increase program verbosity.
</pre>
    </blockquote>
    Not much help, that.<br>
    <br>
    As for the utility of filesystem snapshots, be they LVM2, ZFS, XFS,
    etc., this of course extends only so far as the stability of the
    underlying data.&nbsp; If your data is in flux at the time of the
    snapshot (unwritten buffers, etc.) then you'll only snapshot an
    incoherent, or "crash-consistent", state.&nbsp; Thus it's important to
    consider the relative cost and consequence of taking the extra steps
    to quiesce the application prior to the snapshot.<br>
    <br>
    We perform ZFS snapshots very frequently, without application
    quiescence, under the belief that even crash-consistent data is
    better than no data, in a DR scenario, and we replicate this data
    across multiple machines and sites, to further improve any potential
    DR outcome.&nbsp; However, we also make "application-consistent" backups,
    which require application quiescence, as Patrick has described.&nbsp; His
    initial suggestion -- stop cyrus, snapshot, restart cyrus -- is
    reasonable, but we feel that the later suggestion -- stop cyrus, tar
    up data, start cyrus -- is not.&nbsp; It takes data offline for too
    long.&nbsp; That's why the snapshot capability is necessary in any truly
    suitable server.<br>
    <br>
    If you, like us, maintain your "config" and spool (and potentially
    meta) data on separate filesystems, you must remember to snapshot
    them all.&nbsp; Also, if you're going to stop and start cyrus like this,
    it pays to remove heavyweight processes (i.e. delprune, checkpoint,
    sqautter) from the START section of cyrus.conf, to prevent extensive
    delays at restart, and let them be performed periodically (in
    EVENTS) instead.<br>
    <br>
    I will say that the ability to quiesce the application without
    halting it would be most desirable.&nbsp; Most databases have supported
    this sort of thing for ages, and it would be great if one could send
    a signal to Cyrus to achieve the same result.&nbsp; One wonders, however,
    if the model of master process (cyrmaster for Debian-based distros)
    with potentially hundreds or thousands of child daemons, would lend
    itself to this.<br>
    <br>
    But snapshots, whatever their consistency or coherence, will always
    be less useful for DR than a replica, and in Cyrus this is not only
    available, but not really that hard to get up and running.&nbsp; The
    differences between the imapd.conf files on a master and replica can
    be this simple, or simpler even, as this example is from a murder
    (from a running pair):<br>
    <blockquote>
      <pre>--- imapd-master.conf        2014-11-24 13:37:45.752639666 -0600
+++ imapd-replica.conf        2014-11-24 13:31:58.702611566 -0600
@@ -1,22 +1,14 @@
 ##
-# These configuration parameters are for the master server
-# in a replication set
-servername: master.example.com
+# These configuration parameters are for the replica server in a
+# replication cluster
+servername: replica.example.com
 
-##
-# Auth credentials
-mupdate_server: mupdate.example.com
-mupdate_username: mupdate
-mupdate_authname: mupdate
-mupdate_password: &lt;password&gt;
-
-##
-# Replication support
-# This is how the BACKEND for this host is defined
-sync_host: replica.example.com
-sync_authname: mailproxy
-sync_password: &lt;password&gt;
-sync_compress: true
-sync_log: true
-sync_repeat_interval: 5
-sync_shutdown_file: /var/run/cyrus/sync_stop
+## Auth credentials
+# The credentials below must match the account listed in lmtp_admins
+# on the backend servers.
+proxy_authname: mailproxy
+proxy_password: &lt;password&gt;
+force_sasl_client_mech: PLAIN
+mupdate_mechs: PLAIN
+mailbox_mechs: PLAIN
+serverlist: master
</pre>
    </blockquote>
    The changes in cyrus.conf are similarly brief:<br>
    <blockquote>
      <pre>--- master/cyrus.conf        2014-11-24 14:01:26.832602819 -0600
+++ replica/cyrus.conf        2014-11-24 14:01:42.212637226 -0600
@@ -15,8 +15,8 @@
         # Master sends mailbox updates to mupdate.
         # Replication client runs on Master.
         # Comment these 2 lines out on replicas
-        #mupdatepush                cmd="/usr/sbin/cyrus ctl_mboxlist -m"
-        #syncclient                cmd="/usr/lib/cyrus/bin/sync_client -r"
+        mupdatepush                cmd="/usr/sbin/cyrus ctl_mboxlist -m"
+        syncclient                cmd="/usr/lib/cyrus/bin/sync_client -r"
 
         # this is recommended if using duplicate delivery suppression
         #delprune        cmd="/usr/sbin/cyrus expire -E 3 -D 60 -X 60" at=0400
@@ -55,7 +55,7 @@
         ##
         # Synchronization for remote replication.
         # Comment this out on Master, uncomment on replicas
-        syncserver       cmd="/usr/lib/cyrus/bin/sync_server" listen="csync"
+        #syncserver       cmd="/usr/lib/cyrus/bin/sync_server" listen="csync"
 
         # Experimental httpd for caldav
         httpd                cmd="httpd" listen=8080 prefork=1 maxchild=20
</pre>
    </blockquote>
    It's just not that hard to implement, and for the security and
    safety it provides is well worth it.<br>
    <br>
    Note that if you're using a murder, the server name must be
    preserved between the two hosts, in the event of a fail-over, and
    only the master should communicate with the mupdate server (as shown
    in my example).&nbsp; If you're not using a murder, then most of these
    differences go away (all the mupdate stuff).&nbsp; Of course, you'll need
    to switch DNS or have some other way of dealing with fail-over on
    layer 3.<br>
    <br>
    We put all common configuration into /etc/imapd.conf, and then use
    the @include directive to include the appropriate file fragment,
    either imapd-master.conf or imapd-replica.conf.&nbsp; For the cyrus.conf,
    it's just a couple of line edits -- commenting and uncommenting --
    so we do that by hand.&nbsp; You've got to intervene to update the DNS,
    in any event, so this much more is trivial.<br>
    <br>
    Lastly, as to the use of imapsync to achieve user, mailbox or server
    replication, and the authentication requirements thereof, I would
    suggest reading the README file for that application, which includes
    this:<br>
    <pre>    You may authenticate as one user (typically an admin user), but be
    authorized as someone else, which means you don't need to know every
    user's personal password. Specify --authuser1 "adminuser" to enable this
    on host1.
</pre>
    So your command line is much like Patrick's example, but with
    '--user1 &lt;user&gt; --authuser1 &lt;proxyuser&gt; --user2
    &lt;user&gt;...'<br>
    Of course you must create a proxy user, and Cyrus supports this with
    the 'proxyserver' directive in imapd.conf (man imapd.conf for
    details), i.e.: 'proxyservers:&nbsp;&nbsp;&nbsp; proxyuser'.<br>
    <br>
    However, I must be honest and point out that if you're going to go
    to the trouble of figuring out how to use imapsync (and possibly pay
    for it, to boot) you may as well just set up a replica.&nbsp; As I've
    shown, above, it's just not that hard.<br>
    <br>
    Cheers,<br>
    &nbsp;&nbsp;&nbsp; -nic<br>
    <br>
    <div class="moz-cite-prefix">On 12/15/2014 05:01 PM, Patrick Goetz
      wrote:<br>
    </div>
    <blockquote cite="mid:548F6845.1000101@mail.utexas.edu" type="cite">
      <pre wrap="">This still leaves the question of how best to back up a cyrus mailstore.

Bron mentioned that most people are using LVM snapshots.  I don't see 
how using btrfs/LVM/ZFS snapshots can save you from a race condition 
between when the cyrus user directory is updated and when mailboxes.db 
is updated.  The only way I would trust this is by doing this:

    1. Stop cyrus
    2. Snapshot
    3. Restart cyrus


cyrdump:  near as I can tell the only useful purpose this serves is to 
assemble all email messages into a single "mbox" file (can anyone 
confirm this)?

ctl_mboxlist: this seems useful for making a human readable copy of the 
mailboxes.db file, but I'm not sure how this could be useful for 
disaster recovery, given the previously mentioned issue about keeping 
the mailboxes.db file synchronized with the contents of the user dir.

So, given a simple mail server (i.e. no murder + replication), and when 
using a filesystem (e.g. ext4 or XFS) which doesn't do snapshots, it 
would appear that the only safe way to backup up a cyrus mailstore is to 
either using something like imapsync, or

    1. Stop cyrus
    2. tar cvf /some/safe/place/user.tar {default-partion}
    3. tar cvf /some/safe/place/cyrusdb.tar {configdirectory}
    4. Restart cyrus

The way I've used imapsync in the past required copying mail folders per 
authenticated user account; i.e. something like

imapsync --host1 my_host1 --authmech1 LOGIN --user1 my_user1 --password1 
xxxxx --host2 my_host2 --authmech2 PLAIN --user2 my_user2 --password2 xxxxx

which in particular means knowing everyone's passwords.  This is 
entirely unworkable for larger sites, and I'm not sure if there is a 
trick for getting around this.</pre>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
Nic Bernstein                             <a class="moz-txt-link-abbreviated" href="mailto:nic@onlight.com">nic@onlight.com</a>
Onlight, Inc.                             <a class="moz-txt-link-abbreviated" href="http://www.onlight.com">www.onlight.com</a>
219 N. Milwaukee St., Suite 2a            v. 414.272.4477
Milwaukee, Wisconsin  53202
</pre>
  </body>
</html>