Replication: "cross-updates" of mail meta-data
Hello
I have a two-server dovecot setup using replication. Each server runs two dovecot instances, one for director and another for the backend. Initially I set up a single server, got it all working, then rsync'd the data and index partitions to the new one and started the clusters (I used rsync as a way to speed-up dovecot's initial replication). Both servers listen on a virtual IP addresses load-balanced by IPVS as well as their own IP addresses.
When I started dovecot in the second server, users started reporting that some of their messages were missing. I noticed that while the mail data seemed to be up to date in server1, it wasn't in server2; however, the indexes were being updated in server2 but not in server1. For example, "doveadm quota get -u some-user" would report the wrong value in server1 and the right value in server2, while a "du" would show that only server1 actually had the most up-to-date data.
At the moment I had to take down server2, because as soon as dovecot is running in it, users start reporting missing messages again. To solve that problem, a "doveadm force-resync" in server1 isn't enough. I either rsync the index files from server2 or remove the indexes in server1 before the force-resync, which then works.
Has anyone ever saw anything similar to this? Any help would be much appreciated.
I'm running Ubuntu 14.04 with dovecot 2.2.15 with the configurations below:
=== Backend instance ===
# dovecot -n # 2.2.15: /etc/dovecot/dovecot.conf # OS: Linux 3.16.0-37-generic x86_64 Ubuntu 14.04.2 LTS auth_master_user_separator = * auth_mechanisms = plain login auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@= auth_worker_max_count = 10 disable_plaintext_auth = no doveadm_password = secret doveadm_port = 12345 listen = server1.mydomain.com mail_fsync = never mail_gid = dovemail mail_plugins = " notify replication quota" mail_uid = dovemail managesieve_sieve_capability = fileinto reject envelope vacation subaddress comparator-i;ascii-numeric relational regex copy include vacation-seconds imapflags notify namespace { inbox = yes location = mailbox SPAM { auto = subscribe } prefix = separator = / type = private } passdb { args = /etc/dovecot/dovecot-sql.conf.ext driver = sql } passdb { args = /etc/dovecot/dovecot-sql-master.conf.ext driver = sql master = yes pass = yes } plugin { mail_replica = tcp:192.168.0.2:12345 # server2's replication IP quota = dict:User quota::file:/var/lib/imap/user/%2.256RHn/%n/dovecot-quota quota_rule = *:storage=1GB sieve = /var/lib/imap/sieve/%2.256RHn/%n/dovecot.sieve sieve_dir = /var/lib/imap/sieve/%2.256RHn/%n sieve_extensions = comparator-i;ascii-numeric copy envelope fileinto imapflags include notify regex reject relational subaddress vacation-seconds sieve_max_redirects = 20 sieve_max_script_size = 512KB sieve_quota_max_scripts = 2 sieve_vacation_min_period = 1 sieve_vacation_send_from_recipient = yes } protocols = imap pop3 lmtp sieve replication_dsync_parameters = -f -d -N -l 30 -U service aggregator { fifo_listener replication-notify-fifo { group = dovemail mode = 0666 user = dovemail } unix_listener replication-notify { group = dovemail mode = 0666 user = dovemail } } service auth-worker { user = $default_internal_user } service auth { client_limit = 10240 process_limit = 1 process_min_avail = 1 } service doveadm { inet_listener { address = 192.168.0.1 port = 12345 } vsz_limit = 1 G } service imap { process_limit = 8192 process_min_avail = 10 } service lmtp { inet_listener { address = lmtpcluster.internal.mydomain.com, server1.internal.mydomain.com port = 1124 } process_limit = 512 process_min_avail = 10 } service managesieve-login { inet_listener sieve { address = lmtpcluster.internal.mydomain.com, server1.internal.mydomain.com port = 4190 } } service managesieve { process_limit = 20 process_min_avail = 10 } service pop3 { process_limit = 512 process_min_avail = 10 } service replicator { process_min_avail = 1 unix_listener replicator-doveadm { group = dovemail mode = 0666 user = dovemail } } ssl_cert =
=== Director instance ===
# dovecot -n -c /etc/dovecot_director/dovecot_director.conf # 2.2.15: /etc/dovecot_director/dovecot_director.conf # OS: Linux 3.16.0-37-generic x86_64 Ubuntu 14.04.2 LTS auth_master_user_separator = * auth_mechanisms = plain login auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@= auth_worker_max_count = 10 base_dir = /var/run/dovecot_director director_mail_servers = server1.internal.mydomain.com server2.internal.mydomain.com director_servers = A.B.C.1 A.B.C.2 # server1 and server2 external IP addresses disable_plaintext_auth = no instance_name = dovecot_director listen = lmtpcluster.mydomain.com, server1.mydomain.com lmtp_proxy = yes login_greeting = IMAP/POP3 server mail_fsync = never mail_gid = dovemail mail_plugins = " quota" mail_uid = dovemail managesieve_notify_capability = mailto managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date ihave passdb { args = /etc/dovecot_director/dovecot_director-sql.conf.ext driver = sql } passdb { args = /etc/dovecot_director/dovecot_director-sql-master.conf.ext driver = sql master = yes pass = yes } protocols = imap pop3 lmtp service auth-worker { user = $default_internal_user } service auth { client_limit = 10240 process_limit = 1 process_min_avail = 1 } service director { fifo_listener login/proxy-notify { mode = 0666 } inet_listener { address = A.B.C.1 port = 7777 } unix_listener director-userdb { mode = 0600 } unix_listener login/director { mode = 0666 } } service imap-login { executable = imap-login director idle_kill = 10 secs inet_listener imap { port = 143 } process_limit = 400 process_min_avail = 10 service_count = 0 vsz_limit = 512 M } service lmtp { inet_listener lmtp { address = lmtpcluster.internal.mydomain.com, server1.internal.mydomain.com port = 24 } process_limit = 512 } service pop3-login { executable = pop3-login director idle_kill = 10 secs inet_listener pop3 { port = 110 } process_limit = 256 } ssl_cert =
Thanks in advance, Andre
participants (1)
-
Andre Nathan