天天看點

Linux叢集和自動化維2.6.1 備份類腳本

<b>2.6.1 備份類腳本</b>

俗話說得好,備份是救命的稻草。特别是重要的資料和代碼,這些都是公司的重要資産,是以備份是必須的。備份能在我們不慎執行了一些毀滅性的工作之後(比如不小心删除了資料),進行恢複工作。許多有實力的公司在國内好幾個地方都設有災備機房,而且用的都是價格不菲的emc高端存儲。可能會有朋友要問:如果我們沒有存儲怎麼辦?這點可以參考一下筆者公司的備份政策,即:在執行本地備份的同時,讓shell腳本自動上傳資料到另一台ftp備份伺服器中,這種異地備份政策成本比較小,無須存儲,而且安全系統高,相當于雙備份,本地和異地同時出現資料損壞的機率幾乎是不可能的。

此雙備份政策的具體步驟如下。

首先,做好準備工作。先安裝一台centos 6.4 x86_64的備份伺服器,并安裝vsftpd服務,稍微改動一下配置後啟動。另外,關于vsftpd的備份目錄,可以選擇做raid1或raid5的分區或存儲。

vsftpd服務的安裝如下,centos 6.4 x86_64下自帶的yum極為友善。

yum -y install

vsftpd

service vsftpd

start

chkconfig vsftpd

on

vsftpd的配置比較簡單,詳細文法略過,這裡隻給出配置檔案,可以通過組合使用如下指令直接得出vsftpd.conf中有效的檔案内容:

grep -v

"^#" /etc/vsftpd/vsftpd.conf | grep -v '^$'

local_enable=yes

write_enable=yes

local_umask=022

dirmessage_enable=yes

xferlog_enable=yes

connect_from_port_20=yes

xferlog_std_format=yes

listen=yes

chroot_local_user=yes

pam_service_name=vsftpd

userlist_enable=yes

tcp_wrappers=yes

chroot_local_user=yes這條語句需要重點強調一下。它的作用是對使用者登入權限進行限制,即所有本地使用者登入vsftpd伺服器時隻能在自己的家目錄下,這是基于安全的考慮,筆者在編寫腳本的過程中也考慮到了這點,如果大家要移植此腳本到自己的工作環境中,不要忘了這條語句,不然的話異地備份極有可能會失效。

另外,我們在備份伺服器上應該建立備份使用者,例如svn,并為其配置設定密碼,還應該将其家目錄更改為備份目錄,即/data/backup/svn-bakcup,這樣的話更友善備份工作,以下備份腳本依此類推。

1.版本控制軟體svn代碼庫的備份腳本

版本控制軟體svn的重要性在這裡就不再多說了,現在很多公司基本還是利用svn作為送出代碼集中管理的工具,是以做好其備份工作的重要性就不言而喻了。這裡的輪詢周期為30天一次,shell會自動删除30天以前的檔案。在vsftpd伺服器上建立相應的備份使用者svn的腳本内容如下(此腳本在centos

5.8 x86_64下已測試通過):

#!/bin/sh

svndir=/data/svn

svnadmin=/usr/bin/svnadmin

date=`date +%y-%m-%d`

olddate=`date

+%y-%m-%d -d '30 days'`

backdir=/data/backup/svn-backup

[ -d ${backdir}

] || mkdir -p ${backdir}

logfile=${backdir}/svnbak.log

[ -f ${logfile}

] || touch ${logfile}

mkdir

${backdir}/${date}

for project in

myproject official analysis mypharma

do

  cd $svndir

  $svnadmin hotcopy $project  $backdir/$date/$project --clean-logs

  cd $backdir/$date

  tar zcvf ${project}_svn_${date}.tar.gz

$project  &gt; /dev/null

  rm -rf $project

sleep 2

done

host=192.168.2.112

ftp_username=svn

ftp_password=svn101

cd

ftp -i -n -v

&lt;&lt; !

open ${host}

user

${ftp_username} ${ftp_password}

bin

cd ${olddate}

mdelete *

cd ..

rmdir ${olddate}

mkdir ${date}

cd ${date}

mput *

bye

!

2. mysql從資料庫備份腳本

主mysql腳本跟其比較類似,主要是用mysql自帶的指令mysqldump 進行備份的。這裡要說明的是,本地的輪詢周期為20天,vsftpd的輪詢周期為60天,備份後就算是用gzip壓縮,mysql的資料庫還是很大,大家可以根據實際需求來更改這個時間,注意不要讓資料庫撐爆你的備份伺服器。由于是内部開發環境,密碼設定得比較簡單,如果要将其移植到自己的公網伺服器上,就要在安全方面多注意一下了。另外附帶說明的是,--opt隻是一個快捷選項,等同于同時添加

--add-drop-tables  --add-locking  --create-option  --disable-keys  --extended-insert  --lock-tables --quick --set-charset 選項。本選項能讓mysqldump很快地導出資料,并且導出的資料可以很快被導回。該選項預設是開啟的,可以用--skip-opt将其禁用。注意,如果運作mysqldump沒有指定 --quick 或 --opt 選項,則會将整個結果集放在記憶體中。如果導出的是大資料庫則可能會出現問題,腳本内容如下(此腳本在centos 5.8 x86_64下已測試通過):

#!/bin/bash

username=mysqlbackup

password=mysqlbackup

date=`date

+%y-%m-%d`

+%y-%m-%d -d '-20 days'`

ftpolddate=`date

+%y-%m-%d -d '-60 days'`

mysql=/usr/local/mysql/bin/mysql

mysqldump=/usr/local/mysql/bin/mysqldump

mysqladmin=/usr/local/mysql/bin/mysqladmin

socket=/tmp/mysql.sock

backdir=/data/backup/db

[ -d

${backdir}/${date} ] || mkdir ${backdir}/${date}

[ ! -d

${backdir}/${olddate} ] || rm -rf ${backdir}/${olddate}

for dbname in

mysql test report

   ${mysqldump} --opt -u${username}

-p${password} -s${socket} ${dbname} | gzip &gt;

${backdir}/${date}/${dbname}-backup-${date}.sql.gz

   echo "${dbname} has been backup

successful"

   /bin/sleep 5

host=192.168.4.45

ftp_username=dbmysql

ftp_password=dbmysql

cd ${backdir}/${date}

cd ${ftpolddate}

rmdir

${ftpolddate}

3. mysql資料備份至s3檔案系統

這裡先來介紹下亞馬遜的分布式檔案系統s3,s3為開發人員提供了一個高可擴充(scalability)、高持久性(durability)和高可用(availability)的分布式資料存儲服務。它是一個完全針對網際網路的資料存儲服務,借助一個簡單的web服務接口就可以通過網際網路在任何時候通路s3上的資料。當然存放在s3上的資料要可以進行通路控制以保障資料的安全性。這裡所說的通路s3包括讀、寫、删除等多種操作。在腳本的最後,采用aws s3指令中的cp将mysql上傳至s3://example-shar這個bucket上面(s3詳細資料介紹http://aws.amazon.com/cn/s3/),腳本内容如下所示(此腳本在amazon linux ami x86_64下已測試通過):

#

# filename:

backupdatabase.sh

# description:

# backup cms

database and remove backup data before 7 days

# crontab

# 55 23 * * *

/bin/sh /yundisk/cms/crontab/backupdatabase.sh &gt;&gt;

/yundisk/cms/crontab/backupdatabase.log 2&gt;&amp;1

+%y-%m-%d -d '-7 days'`

#mysql=/usr/local/mysql/bin/mysql

#mysqldump=/usr/local/mysql/bin/mysqldump

#mysqladmin=/usr/local/mysql/bin/mysqladmin

backdir=/yundisk/cms/database

mysqldump

--default-character-set=utf8 --no-autocommit --quick --hex-blob

--single-transaction -uroot 

cms_production  | gzip &gt;

${backdir}/${date}/cms-backup-${date}.sql.gz

echo

"database cms_production and bbs has been backup successful"

/bin/sleep 5

aws s3 cp

${backdir}/${date}/* s3://example-share/cms/databackup/