> Anyone aware of a particularly good discussion of building a farm of
> vpopmail "compliant" front-end machines for user access to a central
> file server via NFS on linux?  I'm concerned that I haven't thought
> through issues in how to properly account for webmail/IMAP, MySQL for
> storing smtp-auth IPs for relay control, and a few other topics.
> Googling hasn't yielded much but a few threads from the *BSD folks.
I was involved in setting up/administering a rather large cluster when I
was consulting for a mid-sized college, which is probably bigger than you
want to get into, but I'll share a few items:

> My tentative thinking is 2+ front end machines that draw from a
> common/identical configuration that provide the client interfaces via:
> - SMTPd, smtp-auth, pop3d, send, IMAPd, anti-virus, anti-spam, webmail
> (apache + squirrelmail)
> - CHKUSER talking to the backend server
> - Local /var/qmail/ (typical) install for queue, bin, supervise,
> etc...   possibly taken from the central, backend server via nightly
> rsync where needed.
> - NFS client communication to the central backend server
> A single, large server provides the "backend" services to these machines
> for:
> - MySQL server (for smtp-auth tracking, squirrelmail prefs/abook/sigs,
> users, domains)
> - NFS Service providing Client-mounted folder(s) for the domains' email.
We had local installs of qmail/vpopmail/etc. on all of the front-end
servers, and then nfs-mounted certain shared things from the back-end
instead of the local folders.  Originally we nfs-mounted them directly,
but network problems with nested NFS mounts led us to mount them in a
separate tree and use symlinks - e.g. /var/qmail/control was symlinked
/mnt/qmail-control, which in turn nfs-mounted
backend:/export/qmail/control.  We imported the following from the
back-end server:
  /var/vpopmail/domains/<primary domain>/<hash dirs>

Let me explain the last bit - we hosted several domains on the cluster,
but only the primary one was big, so we left the rest on a single
centralized FS.  We then created each hash dir (0-9,A-Z,a-z) as a separate
FS and exported them individually - the speed of not having anywhere near
as many emails on each FS made up for the NFS overhead.  It originally was
all one FS, then we went to multiple FSs on a single server, and
eventually we migrated to 4 back-end servers each exporting a quarter of
the hash dirs.  We also installed vpopmail and POP/IMAP servers on the
back end, and used perdition on the front ends to have the POP/IMAP
connections go directly to the correct back-end server whenever possible. 
We kept one server with all the NFS mounts as a fallback for POP/IMAP, but
it was rarely used.  One other thing we did was a perl script with a DB
back end indicating which NFS mount came from where - it allowed us to do
some shuffling as needed, and also got around the problem of trying to
mount the NFS shares before the network ports had come up, something that
happens a lot with certain combinations of NICs and switches...

For inbound mail we still needed the NFS mounts, although I was working on
and eventually testing a method of doing distributed SMTP as well, using
the front-end systems as a queue and figuring out how to send it to the
correct back-end, also running qmail/vpopmail.  As far as I know if never
left testing after I moved on, but it worked AFAIK.

For the SQL, we used one of the back-ends as a master and all of the other
systems (front- and back-end) as slaves, then had vpopmail do all reads
from the local system and write to the master, which then sent updates. 
IIRC there was a weekly script early sunday morning that tarred up the
master DB and refreshed the slaves to clean up the binlogs as well.

Other than webmail, every front-end system could do anything, and we
routinely would change the DNS entries to have different servers provide
different services so we could take systems offline for maintenance or
clear out large queues.  Webmail was only on a couple of systems, one live
and one for testing.  If you're going to use webmail, a caching IMAP proxy
is a must - it boosts webmail performance by a ton.

Oh, put your NFS traffic on a separate physical network from your public
communications - we used a second interface running at gigabit speed on
RFC1918 address space for the front-end to back-end communications, which
helped a lot when the public connections were being stressed.

> Any special compile/configuration suggestions to support this that I
> wouldn't normally use on a single-box solution?  Should the client
> machines be logging to their local drives, to an NFS mounted drive, or
> log over the network (like syslog-ng, even possible with multilog???) to
> any particular host?
We logged locally - we were looking at a way to get everything aggregated
as well, but never really found a good answer.  In any case, I wrote a
patch to qmail that adds the machine name to the received header
("Received by qmail _on <hostname>_") to make tracing mails easier - I
don't think I've ever publicly released it, but I'm currently working on
releasing a large patch cluster including it, and I plan on putting the
individual patches up as well - email me if you want/need it before I get
around to putting the cluster up...

> Any administrative issues that grow through this distributed model?  I'm
> thinking about whether vqadmin or qmailadmin will continue to function
> correctly when run from any of the "farm" machines?  Would I just allow
> one "admin" machine for vqadmin/qmailadmin to prevent issues?
If you use a SQL back-end for vpopmail and have vpopmail installed and
properly configured on whatever machine you use the admin tool on, you
should be fine.  Just make sure you have write-access to the NFS-mounted
directories (via no_root_squash) or you'll be in for a world of hurt :) 
Also, the /service directories were handled locally - it was safer to copy
updated run files (many of which needed to be customized for individual
machines) across the cluster than try to run them from NFS.

> Any risks of data collision/overlap or other issues that might surface
> with this multi-server model?  Central MySQL should solve most of this,
> right?
> THANKS!!!!!
> D.

None that I've seen, except if you need individualized control files on
separate machines.  The one that I remember most was the outgoingip
control file (if you use that patch), which we solved by making
/var/qmail/control/outgoingip (on the NFS mount) a symlink for
/etc/qmail/outgoingip, and then having separate files on the local server
with the correct address in each.  I know there were a few more, but I
don't remember what.

One last suggestions - we used identical machines with hardware RAID
mirroring for the front-end systems.  If we ever needed to add a machine
to the cluster, it was as simple as pull one drive from the mirror set
(replacing it immediately with a spare - the rebuild of a 36GB U320 SCSI
drive took ~6 hours), and pop it into a new system along with a
replacement drive to rebuild on.  Keep the network unplugged the first
time you boot it, change all of the hostname and IP references (and purge
the queue if you need to - VERY important to avoid duplicate
deliveries!!!), and then bring it back up.  Instant mail server, just add
platters :)

Joshua Megerman
SJGames MIB #5273 - OGRE AI Testing Division
You can't win; You can't break even; You can't even quit the game.
  - Layman's translation of the Laws of Thermodynamics

Reply via email to