how many users can Cyrus server support? -- is 5.5 msg/sec sl ow?
Jeremy Rumpf
jrumpf at heavyload.net
Sat Sep 28 00:09:57 EDT 2002
>
> I had an eye on Su's postings the last days because of own interest in
> getting performance messurement data examples. I then started to do my
> own tests because I just wanted to see how my installation performs and
> was surprised that I got a much better performance without knowing that
> much about filesystems and BerkleyDB than he actually does. Maybe
> someone can handle me a script or something that shows me how you
> messure things so that I can be shure that I do the same messurements
> than you all do! Would be great to see how other people are testing
> theire email performance...
>
> ---Christian---
Perhaps the best thing to do for folks setting up cyrus high end mail systems
would be to describe our own setups and let folks (like Su) look them over to
see what they can pick off for his own setup.
The stuff I'm currently working on is based on Linux, so most of my setup is
linux centric, but the generic basics would apply to most systems. My system
would look roughtly as follows (pardon if my ascii art sucks):
+------------+ +------------+ +------------+ +------------+
| mta server | | mta server | | imap proxy | | imap proxy |
| postfix | | postfix | | perdition | | perdition |
+------------+ +------------+ +------------+ +------------+
| | \ | \ | \
| | \ | \ | \
\ / \ \ \ / \
\ / \ \ \ / \
\ / \ \ \ / \
----------- \ ----------- \
/ \ \ / \ \ +----------+
/ \ \----/--------------------------| ldap dir |
+------------+ +------------+ / | openldap |
| imap server| | imap server| / +----------+
| cyrus |--| cyrus |-------
+------------+ +------------+
Optimization for the mta servers is as follows:
Two sets of disk mirrors at RAID 0
First set is the system disks
Second set is the postfix mail queues
Use a nice hardware RAID controller with
a fat slice of cache (128MB cache on an
Mylex ExtremeRaid here). Set the cache to
run in writeback mode.
Setup the mail queus on ext3 fs with full
journaling data=journal (note there are
some details Stephen Tweedie is working on
with regards to data=journal, they've been
fixed but in patches, not mainline yet)
Create the ext3 journal on a separate set
of disks, specifically allocate a partition
to hold the journal (I put the journal on a
dedication partition on the system disks as
their load normally isn't all that
high). Make the journal HUGE, ie 250 + MB.
Mount the mail queues with the noatime mount
option. Also mount /var/log with noatime.
chattr -S /var/log and the mail queues.
Disable syncronous logging in syslogd or
use network syslogging to another host.
Consider using tmpfs for lmtpd temp directory
(I haven't done this yet, but I really like
the idea).
Bump the number of open file descriptors
available to the system to something like
16k - 32k.
Use direct TCP lmtp delivery to the cyrus
backends.
Optimization for the cyrus servers is as follows:
All the same optimizations for the mta's.
Don't run a specific mta on the backend
(use TCP lmtp). Note: I do run an mta
but it's only used for local system
mail and notifications, not for cyrus
delivery.
Allocate multiple cyrus partitions. Keep
each partition on it's own RAID 0 disk set.
Keep the partitions on a single disk pair
(don't stripe 6 drives together, break them
up into 3 two disk stripe sets, one set for each
partition). Maximize the number of independent
spindles. Allocate the journals on separate
disks.
chattr -S the mail partitions (I do keep the
mailboxes.db, etc, in the conf dir syncronous)
Disable duplicate delivery suppression.
Theory of operation:
Operation of the system hinges on LDAP. LDAP is used by postfix
for all the mail routing (to get the message to the
correct cyrus backend). It's also used for authentication
(saslauthd). It's also used by the perdition proxies to
determine the correct cyrus backend to route connections
to.
An LDAP entry looks as follows:
dn: cn=john.doe,ou=real,ou=addresses,ou=mail,dc=somecompany,dc=com
sn: Doe
givenName: John
userPassword: {MD5}+/xxxxxxxxxxxxDZgg==
description: mail user account
uid: john.doe at doeworld.com
cn: john.doe
mail: john.doe at doeworld.com
mail: jdoe at doeworld.com
mail: supafreeza at doeworld.com
mailLocalAddress: john.doe at mail-store1.somecompany.com
smtpauthAccess: enabled
popimapAccess: enabled
smtprouteAccess: enabled
I have postfix transport maps for all the cyrus backends in
postfix (mail-store1, mail-store2, .....) to route the messages
via ltmp to the correct backend. There's an LDAP virtual map on
the postfix mtas that looks like this:
virtual_maps = ldap:ldapvirtual, hash:/etc/postfix/virtual
ldapvirtual_server_host = ldap1.somecompany.com
ldapvirtual_server_port = 389
ldapvirtual_search_base = ou=addresses,ou=mail,dc=somecompany,dc=com
ldapvirtual_timeout = 20
ldapvirtual_query_filter = (&(mail=%s)(smtprouteAccess=enabled))
ldapvirtual_result_attribute = mailLocalAddress, mailRoutingAddress
ldapvirtual_scope = sub
ldapvirtual_bind = yes
ldapvirtual_bind_dn = cn=mailro,dc=somecompany,dc=com
ldapvirtual_bind_pw = xxxxxxx
Then, when a message arrives for john.doe at doeworld.com or
supafreeza at doeworld.com the virtual map rewrites the
_envelope_ address (the original To: address is preserved)
to john.doe at mail-store1.somecompany.com. From there lmtp
delivery kicks it to mail-store1 which has a mailbox for
user/john.doe (unix separator).
If the user connects to perdition to check his mail. He logs in
as the user john.doe at doeworld.com (aka the uid). Perdition does
an LDAP query to resolve the true mail backend. Specifically it
uses the mailLocalAddress with the mailbox being the username
and the domain being the host. Something like
<username>@<mail backend>. It then connects to the correct mail
backend (mail-store1.somecompany.com in this case) as the
user john.doe. Note: There _is_ a mailbox john.doe on
mail-store1, which is legal.
Cyrus then attemps to authenticate the user john.doe against
LDAP via saslauthd. Saslauthd is setup as:
ldap_servers: ldap://ldap1.somecompany.com/
ldap_bind_dn: cn=mailro,dc=somecompany,dc=com
ldap_bind_pw: xxxxxxx
ldap_timeout: 20
ldap_scope: one
ldap_search_base: ou=real,ou=addresses,ou=mail,dc=somecompany,dc=com
ldap_auth_method: bind
ldap_filter: (&(cn=%u)(popimapAccess=enabled))
ldap_debug: 2
ldap_verbose: on
ldap_ssl: no
ldap_start_tls: no
Saslauthd resolves the user via the cn attribute (hence why it is
john.doe) and uses the userPassword attribute for the password.
Postfix is also tweaked to allow SMTP AUTH access as well, using
a running instance of saslauthd on the mtas for password
resolution. The SMTP AUTH username is the same john.doe at doeworld.com
(the uid attribute). Access to SMTP AUTH is also controlled via
the smtpauthAccess attribute.
Of course, since saslauthd is in use (thus requiring plain text
passwords everywhere), IMAP connections to the perdition
proxies as well as the SMTP AUTH connections to the mtas are
protected via SSL/TLS.
Management of the system is performed via a custom MySQL database
backend fronted by some perl scripts. The perl scripts can put
entries into LDAP as well as connect to cyrus (via the cyradm module)
to create the required mailboxes.
From this setup, the cyrus backends are horizontally scaleable
(just add more backends) and the postfix mtas are horizontally
scaleable (add more if load demands it). Mtas, proxies, etc,
are either load balanced via round robin DNS or some hardware
based solution.
Whew, okay, I'm done typing for now. Hope this helps :)
Cheers,
Jeremy
More information about the Info-cyrus
mailing list