Membangun infrastruktur multi-server atau High Availability di Zimbra Collaboration Suite (ZCS) umumnya melibatkan penambahan server LDAP Replica. Peran replica sangat krusial untuk membagi beban query autentikasi akun dan memastikan layanan email tetap berjalan normal saat server LDAP Master mengalami gangguan atau maintenance.
Namun baru-baru ini, saat menyiapkan server LDAP replica baru, saya menemui kendala di mana server replica tidak bisa melakukan sinkronisasi dengan LDAP Master. Layanan zmconfigd di replica gagal mengambil konfigurasi global (gacf), dan log OpenLDAP dipenuhi pesan kegagalan replikasi.
Setelah ditelusuri lebih lanjut, kendala ini sangat mungkin terjadi karena server diinstal menggunakan Zimbra CE (Community Edition) installer. Pada proses instalasi Zimbra CE, installer memasang paket base (misalnya paket zimbra-ldap) yang membawa definisi skema awal. Berbeda dengan server Master yang sudah berjalan dan mendapatkan pembaruan patch berkala, server replica baru belum otomatis ter-patch skemanya secara tuntas (skrip upgrade skema OpenLDAP tidak otomatis tereksekusi begitu instalasi base selesai). Akibatnya, terjadi ketidakcocokan skema (schema mismatch) antara Master dan Replica.
Pada artikel kali ini, saya akan membedah kronologi kendala ini beserta langkah demi langkah solusinya yang sudah teruji.
Gejala Masalah (Symptoms)
Pada server LDAP Replica (dapat dipantau di /var/log/zimbra.log), muncul log error berikut saat slapd mencoba melakukan syncrepl:
slapd[48768]: UNKNOWN attributeDescription "ZIMBRAPURDOMAINDETAILSCOLLECTIONENABLED" inserted. slapd[48768]: UNKNOWN attributeDescription "ZIMBRAEXTERNALEMAILWARNINGMESSAGE" inserted. slapd[48768]: UNKNOWN attributeDescription "ZIMBRAFEATUREEXTERNALEMAILWARNINGENABLED" inserted. slapd[48768]: UNKNOWN attributeDescription "ZIMBRABACKUPDEDUPLICATION" inserted. slapd[48768]: syncrepl_null_callback : error code 0x50 slapd[48768]: syncrepl_entry: rid=100 be_add cn=config,cn=zimbra (80) slapd[48768]: syncrepl_entry: rid=100 be_add cn=config,cn=zimbra failed (80) slapd[48768]: do_syncrepl: rid=100 rc 80 retrying
Dampaknya, service zmconfigd di replica gagal mengambil konfigurasi:
zmconfigd[48801]: gacf (function getglobal at 0x3)(None) 1 com.zimbra.common.service.ServiceException: system failure: unable to get config
Bahkan saat dicoba melakukan ekspor data manual dari Master (ldap.bak) dan diimpor ke Replica menggunakan perintah zmslapadd, proses import terhenti di tengah jalan dengan error:
str2entry: str2ad(zimbraPURDomainDetailsCollectionEnabled): attribute type undefined slapadd: could not parse entry (line=352) Closing DB...
Analisis Penyebab (Root Cause)
Mengapa hal tersebut bisa terjadi? Berikut adalah poin-poin penyebab utamanya:
- Schema Mismatch Akibat Zimbra CE Installer:
Atribut seperti
zimbraFeatureExternalEmailWarningEnableddanzimbraPURDomainDetailsCollectionEnabledadalah atribut yang baru diperkenalkan pada rilis/patch Zimbra terbaru. Server replica baru hasil instalasi Zimbra CE masih memuat skema lama di dalam/opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={4}zimbra.ldif. Ketika replikasi berlangsung, OpenLDAP menolak atribut tersebut karena tidak terdaftar pada kamus skema lokalnya. - Data vs Skema OpenLDAP:
Memindahkan folder database (
mv mdb mdb.bak) hanya membersihkan data store, bukan skema OpenLDAP yang tersimpan di direktoriconfig. Oleh karena itu,slapaddtetap gagal mengenali atribut saat membaca barisdn: cn=config,cn=zimbra. - Jebakan Flag
-wpadazmslapadd:Skrip bawaan Zimbra
/opt/zimbra/libexec/zmslapaddmengeksekusislapadd -w. Opsi-wmemaksa OpenLDAP memperbaruicontextCSN(timestamp sinkronisasi) menggunakan waktu saat perintah dijalankan. Akibatnya, replica memiliki CSN yang lebih baru daripada Master, sehingga Master menolak replikasi dengan error(53) Server is unwilling to perform (consumer state is newer than provider). - Mismatched
zimbra_ldap_password:Saat data Master di-restore, user internal
uid=zimbra,cn=admins,cn=zimbramenggunakan password milik Master. Jikalocalconfig.xmlpada replica masih menggunakan password bawaan instalasi baru,zmconfigdtidak akan bisa melakukan bind ke LDAP lokal.
Langkah-Langkah Penyelesaian
Berikut langkah-langkah teruji untuk menuntaskan kendala ini:
1. Ekspor Database dari LDAP Master
Di server LDAP Master, jalankan perintah sebagai user zimbra:
# su - zimbra # zmlocalconfig -s zimbra_ldap_password zimbra_ldap_password = [PASSWORD_LDAP_MASTER] # /opt/zimbra/libexec/zmslapcat /tmp/ # scp /tmp/ldap.bak root@IP_REPLICA:/tmp/
2. Stop Service pada LDAP Replica
Masuk ke server LDAP Replica dan hentikan semua service Zimbra:
# su - zimbra # zmcontrol stop # ldap stop # exit
3. Update Skema Aktif (cn={4}zimbra.ldif)
Sebagai user root di server replica, perbarui file skema aktif menggunakan file skema patch yang sudah tersedia di direktori instalasi:
# cp -a /opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={4}zimbra.ldif /opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={4}zimbra.ldif.bak
# cp -f /opt/zimbra/common/etc/openldap/zimbra/schema/zimbra.ldif /opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={4}zimbra.ldif
# chown zimbra:zimbra /opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={4}zimbra.ldif
# chmod 600 /opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={4}zimbra.ldif
# sed -i -e '/^dn: cn=zimbra,/ s/dn: cn=zimbra,cn=schema,cn=config/dn: cn={4}zimbra/' -e '/^cn: zimbra/ s/cn: zimbra/cn: {4}zimbra/' /opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={4}zimbra.ldif
Pastikan atribut baru sudah ada dengan perintah grep:
# grep -i zimbraPURDomainDetailsCollectionEnabled /opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={4}zimbra.ldif
4. Bersihkan Database dan Import ldap.bak (Tanpa Flag -w)
Bersihkan database data lama, lalu lakukan import menggunakan binary slapadd secara langsung (jangan menggunakan wrapper zmslapadd agar nilai contextCSN asli milik Master tetap terjaga):
# rm -rf /opt/zimbra/data/ldap/mdb/db/* # chown zimbra:zimbra /tmp/ldap.bak # su - zimbra # /opt/zimbra/common/sbin/slapadd -q -F /opt/zimbra/data/ldap/config -b "" -l /tmp/ldap.bak
Catatan: Pesan slapadd: warning, missing attrs entryUUID,entryCSN from entry dn="" merupakan peringatan normal dan aman untuk diabaikan.
5. Samakan Password LDAP di Localconfig
Masih sebagai user zimbra di replica, perbarui konfigurasi password LDAP lokal agar sesuai dengan password Master:
# zmlocalconfig -f -e zimbra_ldap_password=[PASSWORD_LDAP_MASTER]
6. Jalankan Service & Verifikasi Hasil Replikasi
Jalankan kembali service OpenLDAP dan Zimbra:
# ldap start # zmcontrol start # zmcontrol status
Pastikan service ldap, zmconfigd, dan stats sudah berstatus Running.
Verifikasi Log & Sinkronisasi CSN
Untuk memastikan replikasi berjalan mulus, periksa /var/log/zimbra.log:
# tail -n 50 /var/log/zimbra.log | grep -E "slapd|syncrepl|zmconfigd"
Log yang sukses akan menampilkan proses modify dengan status return code (0) dan zmconfigd berhasil memuat seluruh konfigurasi tanpa error:
slapd[22707]: syncrepl_message_to_op: rid=100 be_modify uid=zimbra,cn=admins,cn=zimbra (0) slapd[22707]: do_syncrep2: rid=100 LDAP_RES_INTERMEDIATE - REFRESH_DELETE zmconfigd[22779]: All configs fetched in 0.36 seconds
Terakhir, kita bisa membandingkan nilai contextCSN antara Master dan Replica:
# su - zimbra # source /opt/zimbra/bin/zmshutil; zmsetvars # ldapsearch -x -H ldap://$(zmhostname):389 -D uid=zimbra,cn=admins,cn=zimbra -w $zimbra_ldap_password -b "" -s base contextCSN
Jika string contextCSN pada Master dan Replica identik hingga satuan mikrodetik, artinya seluruh data sudah tersinkronisasi sempurna secara real-time!
Semoga panduan ini bermanfaat bagi rekan-rekan Sysadmin yang menemui kendala serupa saat menyiapkan LDAP Replica di Zimbra!