警告:以下に示すスキームは理想的ではないと考えているため、この記事はモデルとして書かれたのではなく、建設的な批判と改善のための有用なヒントを得ることを目的としています。
Zabbixデータベースをバックアップする必要に直面したとき、私は遠くまで行かず、実績のあるツールmysqldumpを使用することにしました。 redmine、glpi、drupalなどの他のWebサービスのデータベースで使用するとうまく機能しましたが、Zabbixの場合は完全に不適切であることが判明しました。 バックアップが作成され、エラーは発生しませんでしたが、雨の日が来るとバックアップの復元が必要になりました。 ダンプから比較的小さなベースをアンロードするのに約2日かかりました。 当時のデータベースが初期状態だったとすると、将来のダウンタイムは大幅に増加するでしょう。 それはまったく受け入れられませんでした。 その時、私の心はPercona XtraBackupに落ちました。
Percona Xtrabackupは、ブロックせずにMySQLデータベースをバックアップできるオープンソースソフトウェア製品です。 Open Query、mozilla.org、およびFacebookはこのプログラムを使用しているため、これは粗雑な赤い目ではないと結論付けることができます。 私の場合、ディスクサブシステムのパフォーマンスが低いため、zabbixサーバーと一緒にPerconaを使用することはできませんでした。 PerbbaがZabbixがアクティブに書き込んでいるデータを読み取る時間がなかったために、エラーが発生することがありました。 バックアップの作成中に、zabbixサーバーを停止することが決定されました。 今日では1日約6分かかります。 特に重要なトリガーはすべてSNMPトラップに関連付けられていることを考慮すると、zabbix-serverを起動した後もまだ除外されないため、今回は非常に受け入れられます。 おそらくあなたの場合、Zabbixデーモンを停止する必要はなく、ダウンタイムはまったくありません。
それから、私にとって理想的なバックアップはどうあるべきかを考えました。 そして、最高のバックアップは気にしないバックアップであることに気付きましたが、実行されていることは知っています。 私はなんとかこの結果を達成することができました。バックアップについては心配していません。 毎朝指を交差させてサーバーに行くわけではなく、ログ、ファイルサイズ、パーティションの残りスペースを確認しません。 しかし、バックアップが行われていることは知っています。必要な情報をすべて電子メールで取得しているからです。 かなり単純なスクリプトがこれに役立ちます。これを一般に公開したいと思います。 おそらく彼には、私が疑わないいくつかの問題があるのでしょうか?
Zabbixでは、電子メール通知が設定されています。 このために、 ssmtpが使用されます。 インターネットには十分な説明があります。さらに、トピックは完全に異なると考えられているため、これについては説明しません。 Perconaとssmtpを除き、具体的なものは何も使用されていません。tar、gzip、sed、およびfindはすべてのディストリビューションに含まれています。 信頼性のために、バックアップファイルはNFSを介してリモートサーバーに複製されます。
使用されるシステム:
スクリプト自体
#!/bin/bash DAY=`date +%Y%m%d` LOGFILE=/var/log/zabbix_backup.log # E-mail, EMAIL=admin@host.com # logfile mailfile: logrotate MAILFILE=/tmp/mailfile.tmp # BK_GLOBAL=/home/zabbix/backups # BK_DIR=$BK_GLOBAL/Zabbix_$DAY # # set_date set_date () { DT=`date "+%y%m%d %H:%M:%S"` } # mkdir $BK_DIR set_date echo -e "$DT ZABBIX" > $MAILFILE service zabbix-server stop 2>>$MAILFILE innobackupex --user=root --password=qwerty --no-timestamp $BK_DIR/xtra 2>&1 | tee /var/log/innobackupex.log | egrep "ERROR|innobackupex: completed OK" >>$MAILFILE innobackupex --apply-log --use-memory=1000M $BK_DIR/xtra 2>&1 | tee /var/log/innobackupex.log | egrep "ERROR|innobackupex: completed OK" >>$MAILFILE # Percona Xtrabackup : . , tee egrep. service zabbix-server start 2>>$MAILFILE set_date echo -e "$DT " >> $MAILFILE set_date echo -e "$DT " >> $MAILFILE cd $BK_DIR tar -cf $BK_DIR/zabbix_db_$DAY.tar ./xtra 2>>$MAILFILE rm -rf $BK_DIR/xtra cd /usr/share tar -cf $BK_DIR/zabbix_files_$DAY.tar ./zabbix 2>>$MAILFILE cd /etc tar -cf $BK_DIR/zabbix_etc_$DAY.tar ./zabbix 2>>$MAILFILE cd / gzip $BK_DIR/zabbix_db_$DAY.tar 2>>$MAILFILE gzip $BK_DIR/zabbix_files_$DAY.tar 2>>$MAILFILE gzip $BK_DIR/zabbix_etc_$DAY.tar 2>>$MAILFILE set_date echo -e "$DT " >> $MAILFILE rm -f zabbix_db_$DAY.tar rm -f zabbix_files_$DAY.tar rm -f zabbix_etc_$DAY.tar set_date echo -e "$DT NFS-" >> $MAILFILE mount 192.168.1.30:/home/backups /mnt/nfs 2>>$MAILFILE set_date echo -e "$DT " >> $MAILFILE mkdir /mnt/nfs/Zabbix_$DAY cp $BK_DIR/zabbix_db_$DAY.tar.gz /mnt/nfs/Zabbix_$DAY 2>>$MAILFILE cp $BK_DIR/zabbix_files_$DAY.tar.gz /mnt/nfs/Zabbix_$DAY 2>>$MAILFILE cp $BK_DIR/zabbix_etc_$DAY.tar.gz /mnt/nfs/Zabbix_$DAY 2>>$MAILFILE set_date echo -e "$DT " >> $MAILFILE echo -e "$DT " >> $MAILFILE find $BK_GLOBAL/* -type f -ctime +30 -exec rm -rf {} \; 2>>$MAILFILE find /mnt/nfs/* -type f -ctime +30 -exec rm -rf {} \; 2>>$MAILFILE find $BK_GLOBAL/* -type d -name "*" -empty -delete 2>>$MAILFILE find /mnt/nfs/* -type d -name "*" -empty -delete 2>>$MAILFILE set_date echo -e "$DT " >> $MAILFILE echo -e "$DT NFS-\n" >> $MAILFILE umount /mnt/nfs 2>>$MAILFILE cat $MAILFILE >> $LOGFILE sed -i -e "1 s/^/Subject: Zabbix backup log $DAY\n\n/;" $MAILFILE 2>>$LOGFILE sed -i -e "1 s/^/From: zabbixsender@host.com\n/;" $MAILFILE 2>>$LOGFILE sed -i -e "1 s/^/To: $EMAIL\n/;" $MAILFILE 2>>$LOGFILE echo -e "\n $BK_DIR:\n" >> $MAILFILE ls -lh $BK_DIR >> $MAILFILE echo -e "\n :\n" >> $MAILFILE df -h >> $MAILFILE cat $MAILFILE | mail -t 2>>$LOGFILE
/ etc / zabbixおよび/ usr / share / zabbixディレクトリのファイルは、Zabbixで使用される設定および追加のスクリプトを保存するためにコピーされます。
スクリプトによって送信された手紙のテキスト
結果のコピーからデータベースを復元するには、mysqldを停止し、ディレクトリをアーカイブから抽出したディレクトリに置き換え、MySQLデーモンを再起動します。 あなたがこれをするのにどれくらいの時間がかかるかを自分で数えてください。
すべてのシステムのすべての作業バックアップと安定した動作。