Trong bài viết này chúng tôi đã hướng dẫn bạn cách phục hồi mailstore server trong mô hình multi server khi có 1 mailstore server bị sự cố. Bạn cũng có thể áp dụng quy trình này cho hệ thống single server trong trường hợp server duy nhất bị sự cố và cần phục hồi hệ thống trên một server dự phòng.

Trên server cũ, backup file được lưu trong /opt/zimbra/backup (hoặc vị trí mới tuỳ theo cấu hình của bạn), redolog được lưu trong /opt/zimbra/redolog

1. Bạn đã thiết lập một server mới, cài đặt zimbra với các cấu hình tương tự server cũ: gồm tên server hostname, domain, các password cho admin, postfix, amavis account, tên các system account như admin, antivirus, antispam, galsync account.

Ghi nhận password ldap và mysql để sử dụng khi cần thiết

su - zimbra 
zmlocalconfig -s | grep ldap | grep pass 
zmlocalconfig -s | grep mysql | grep pass

2. Bạn đã tiến hành sao chép dữ liệu backup định kỳ từ server chính sang server dự phòng. Ví dụ:

a. Trên server dự phòng, với quyền root, tạo thư mục:

mkdir /oldbackup
mkdir /oldredolog

Trên server chính, với quyền root tạo ssh-key và copy sang server mới.

ssh-keygen
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Public key được tạo ra và lưu trong ~/.ssh/id_rsa.pub
Copy public key này sang server đích.

ssh-copy-id -i ~/.ssh/id_rsa.pub <ip server mới>

b. Tạo file copybackup.sh và file copyredolog.sh

mkdir /opt/scripts
vi opt/scripts/copybackup.sh
vi opt/scripts/copyredolog.sh
chmod +x /opt/scripts/copybackup.sh
chmod +x /opt/scripts/copyredolog.sh

Thêm nội dung sau.

#!/bin/bash
# Zimbra Backup Script v0.0001
# Requires that you have ssh-keys: https://help.ubuntu.com/community/SSHHowto#Public%20key%20authentication
# This script is intended to run from the crontab as root
# Compiled from different resources by Oliver Bross - oliver@bross.eu

# the destination log file
BACKUPLOG="/var/log/rsync-backup.log"
# the destination directory for local backups
# example : DESTLOCAL=/opt/zimbra-backup/
DESTLOCAL=/opt/zimbra/backup
LOCALEDOLOG=/opt/zimbra/redolog
# the destination for remote backups
# example: DESTREMOTE="zimbrabackp.server.net:/Backup/zextras"
DESTREMOTE=<ip server mới>:/oldbackup
REMOTEREDOLOG=<ip server mới>:/oldredolog

# Outputs the time the backup started, for log/tracking purposes
START=$(date +%s)

echo Remote rSync Backup > $BACKUPLOG
echo >> $BACKUPLOG
echo Time backup started : $(date +%a) $(date +%T). >> $BACKUPLOG

# Let's write few bits into the log file
echo >> $BACKUPLOG
echo Source : $DESTLOCAL >> $BACKUPLOG
echo Destination : $DESTREMOTE >> $BACKUPLOG
echo Backup Log : $BACKUPLOG >> $BACKUPLOG
echo >> $BACKUPLOG

# Am I root or not?
if [ x`whoami` != xroot ]; then
echo Error: Must be run as root user
exit 1
fi
# exit 0

# backup the backup dir to remote.
echo Syncing Backup files started >> $BACKUPLOG
rsync -azrtqHK --delete $DESTLOCAL $DESTREMOTE >> $BACKUPLOG 2>&1
echo Syncing of backup files finished >> $BACKUPLOG
echo "(Any errors would be showsn abowe, if nothing shown, all went accoding to the plan!)" >> $BACKUPLOG
echo >> $BACKUPLOG

## Copy redo log to remote. Bỏ phần copy backup ở trên, thêm phần này vào file copyredolog.sh và cho cronjob chạy mỗi 30 phút.
#echo Syncing Redolog files started >> $BACKUPLOG
#rsync -azrtqHK --delete $LOCALREDOLOG $REMOTEREDOLOG >> $BACKUPLOG 2>&1
#echo Syncing of redolog files finished >> $BACKUPLOG
#echo "(Any errors would be showsn abowe, if nothing shown, all went accoding to the plan!)" >> $BACKUPLOG
#echo >> $BACKUPLOG

# Outputs the time the backup finished
FINISH=$(date +%s)
echo Time backup finished : $(date +%a) $(date +%T). >> $BACKUPLOG

# Lets see how log it all took
echo "Total Backup Time taken : $(( ($FINISH-$START) / 60 )) minutes, $(( ($FINISH-$START) % 60 )) seconds" >> $BACKUPLOG
echo >> $BACKUPLOG

# Email some details over ... well, email the log file :-) . Chua thuc hien duoc tren mailstore server
#( echo "Subject: ZeXtras Remote rSync Backup results"; echo; cat $BACKUPLOG ) | /opt/zimbra/common/sbin/sendmail minhhoang@zimilab.com

# end

Chạy thử:

/opt/scripts/copybackup.sh
/opt/scripts/copyredolog.sh

Nếu ok, cho file này vào crontab

crontab -e
49 1 * * * /opt/scripts/copybackup.sh 2>&1
*/30 * * * * /opt/scripts/copyredolog.sh 2>&1

3. Tắt zimbra trên server mới

zmcontrol stop

4. (Tuỳ chọn) Sao lưu lại file /opt/zimbra/conf/localconfig.xml vì bạn cần sao chép các mật khẩu từ file localconfig.xml của bản full backup từ server cũ và thay thế trong file /opt/zimbra/conf/localconfig.xml nếu bạn dùng các mật khẩu khi cài server dự phòng khác với mật khẩu đã dùng trên server chính.

5. Chuẩn bị thư mục để phục hồi thông tin LDAP.

su - zimbra 
cd /opt/zimbra/data/ldap 
mv config config.old1 
mv mdb mdb.old1 
mv accesslog accesslog.old1
mkdir config 
mkdir -p mdb/db 
mkdir -p accesslog/db 

6. Lấy file dap-config.bak” và”ldap.bak” từ thư mục full backup đã được rsync qua. Các file này có thể ở dạng .gz format nên bạn cần giải nén các file này vào thư mục /tmp. Thay full-xxxx.xxxx.xx bằng tên file thực tế.

tar -xzvf /oldbackup/sessions/full-xxxxxxxx.xxxxxx.xxx/ldap/ -C /tmp
hoặc
tar -xzvf /oldbackup/sessions/incr-xxxxxxxx.xxxxxx.xxx/ldap/ -C /tmp

7. Import LDAP data (nếu bạn chưa thực hiện).

su - zimbra
zmrestoreldap -lb <full-xxxxx.xxxxx.xx> -t /oldbackup

8. Re-initialize MySQL database (bước này sẽ làm sạch các thông tin MySQL cũ và khởi tạo database mới).

su - zimbra 
mv /opt/zimbra/db/data /opt/zimbra/db/data_new 
source ~/bin/zmshutil ; zmsetvars
/opt/zimbra/libexec/zmmyinit --sql_root_pw $mysql_root_password 
exit 

9. Nếu trên server cũ dùng HSM thì trên server mới bạn cũng cần cấu hình HSM giống như vậy (có cùng folder, mount point), ví dụ:

[Run as ROOT]
mkdir /opt/zimbra/hsm
mount /dev/<volume_name> /opt/zimbra/hsm 
chown zimbra:zimbra /opt/zimbra/hsm 

10. Tiến hành quá trình offline restore dùng bản full backup. Thay <full backup> bằng tên file full backup gần nhất theo thực tế.

su - zimbra
ldap start
zmconvertctl start 
cd /tmp ; nohup zmrestoreoffline -sys -a all --ignoreRedoErrors -c -lb <full backup> -t /oldbackup/

11. Tiến hành phục hồi redolog để cập nhật dữ liệu đến thời điểm hiện tại, với quyền zimbra cần play redo log theo thứ tự ví dụ như sau (thay tên các file theo thực tế):

zmplayredo --logfiles /oldbackup/redolog_old_server/archive/redo-20190522.193050.975-seq762.log
zmplayredo --logfiles /oldbackup/redolog_old_server/archive/redo-20190522.172507.329-seq761.log
zmplayredo --logfiles /oldbackup/redolog_old_server/archive/redo-20190523.102828.964-seq763.log
zmplayredo --logfiles /oldbackup/redolog_old_server/archive/redo-20190528.193039.638-seq764.log
zmplayredo --logfiles /oldbackup/redolog_old_server/archive/redo-20190529.193042.617-seq765.log
zmplayredo --logfiles /oldbackup/redolog_old_server/archive/redo-20190529.214208.456-seq766.log
zmplayredo --logfiles /oldbackup/redolog_old_server/redo.log

12. Sau khi hoàn thành, kiểm tra tất cả các dịch vụ và điều chỉnh các DNS record trỏ về server mới (nếu dùng khác IP WAN thì cần trỏ PTR).

13. Triển khai lại SSL cert trên server mới này.