背景:
两台亚马逊服务器之间需要数据同步,只要传一台机器上,就可以自动同步到其他机器上。
安装Rsync:
CentOS 6.7自动就带有Rsync,不需要安装。
##实例分析
这里假设有两台服务器:A和B。其中A是主web服务器(155.28.81.0),B服务器是从服务器(155.28.82.0)。我们要将A服务器的/home/test/备份到B服务器的/home/test/目录下。
##服务器A 配置
####服务器A编译安装
rsync的编译安装非常简单,只需要以下简单的几步:
[root@www ~]# cd /usr/local/src/ [root@www src]# wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz [root@www src]# tar zxvf rsync-3.0.9.tar.gz [root@www src]# cd rsync-3.0.9 [root@www rsync-3.0.9]# ./configure --prefix=/usr/local/rsync/ [root@www rsync-3.0.9]# make [root@www rsync-3.0.9]# make install
但是需要注意的是必须在服务器A和B上都安装rsync,其中A服务器上是以服务端模式(被动)运行rsync,而B上则以客户端模式(主动)运行rsync。这样在web服务器A上运行rsync守护进程,在B上定时运行客户程序来备份web服务器A上需要备份的内容。
####建立用户与密码认证文件
[root@www rsync-3.0.9]# echo "backup:bk_passwd" > /usr/local/rsync/rsyncd.passwd
请记住,在server端建立的密码文件,包含用户名与密码,而在client端建立的密码文件只有密码,没有用户名。
####设置权限为只读
[root@www rsync-3.0.9]# cd /usr/local/rsync [root@www rsync]# chmod 600 rsyncd.passwd
否则可能会报错:
@ERROR: auth failed on module ***
rsync error: error starting client-server protocol (code 5) at main.c(1503)
####建立rsync配置文件
[root@www rsync]# vi /usr/local/rsync/rsyncd.conf uid = root gid = root use chroot = no max connections = 4 strict modes = yes hosts allow = 121.42.46.213 #可以空格,允许多个 port = 873 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [test] path = /home/test ignore errors read only = true list = false auth users = backup secrets file = /usr/local/rsync/rsyncd.passwd
####以守护进程方式启动rsync服务器
[root@www rsync]# rsync --daemon --config=/usr/local/rsync/rsyncd.conf
rsync默认服务端口为873,服务器在该端口接收客户的匿名或者认证方式的备份请求。
####如果要让服务设置为自启动,可以加入rc.local
编辑/etc/rc.d/rc.local,在最后添加:
/usr/local/rsync/bin/rsync --daemon --config=/etc/rsyncd.conf
##客户端B 配置
编译安装同上,一般错误都会发生在服务器B
####建立访问服务端A的密码认证文件
[root@www rsync]# echo "bk_passwd" > /usr/local/rsync/rsync.passwd
####设置权限为只读
[root@www rsync]# chmod 0600 rsync.passwd
####在rsync安装之后,运行以下指令同步备份
[root@www rsync]# rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd backup@115.28.81.0::test /home/test
其中地址backup@115.28.81.0::test,backup为服务器A用户,115.28.81.0为服务器A IP地址或者域名,test为服务器A配置模块。
上面这个命令行中-vzrtopg里的v是verbose,z是压缩,r是recursive,topg都是保持文件原有属性如属主、时间的参数,--progress是指显示出详细的进度情况,--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。--password-file=/usr/local/rsync/rsync.passwd来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有root可读。
这里将备份的内容存放在备份机的/home/test/目录下。
####安装inotify
[root@www rsync]# cd /usr/local/src/ [root@www src]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz [root@www src]# tar zxvf inotify-tools-3.14.tar.gz [root@www src]# cd inotify-tools-3.14 [root@www inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify [root@www inotify-tools-3.14]# make [root@www inotify-tools-3.14]# make install
Rsync同步脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#!/bin/bash
#variables
current_date=$(
date
+%Y%m%d_%H%M%S)
source_path=
/home/www/
log_file=
/usr/local/rsync/rsync_client
.log
#rsync configuration
rsync_server=115.28.81.0
rsync_module=www
rsync_user=backup
rsync_pwd=
/usr/local/rsync/rsync
.
passwd
INOTIFY_EXCLUDE=
'(.*/*\.log|.*/*\.swp)$'
INOTIFY_EXCLUDE_LIST=
'/usr/local/inotify/inotify_exclude.lst'
RSYNC_EXCLUDE=
'/etc/rsync_exclude.list'
#rsync client pwd check
if
[ ! -e ${rsync_pwd} ];
then
echo
-e
"rsync client passwod file ${rsync_pwd} does not exist!"
exit
0
fi
#inotify_function
#This function is used to monitor folder(/home/www) files, but exclude subfolders(storage,bootstrape/cache).
inotify_fun(){
/usr/local/inotify/bin/inotifywait
-mrq --timefmt
'%Y/%m/%d-%H:%M:%S'
--
format
'%T %w %f'
\
--exclude ${INOTIFY_EXCLUDE} --fromfile ${INOTIFY_EXCLUDE_LIST} -e modify,delete,create,move,attrib ${source_path} \
|
while
read
file
do
/usr/bin/rsync
-auvrtzopgP --exclude-from=${RSYNC_EXCLUDE} --progress --bwlimit=500 --password-
file
=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server}::${rsync_module}
done
}
#inotify log
inotify_fun >> ${log_file} 2>&1
|
其中INOTIFY_EXCLUDE_LIST='/usr/local/inotify/inotify_exclude.lst'如下:
1
2
3
4
5
|
[ec2-user@ip-172-31-7-248
rsync
]$
cat
/usr/local/inotify/inotify_exclude
.lst
/home/www
@
/home/www/www
.xxx.com
/storage
@
/home/www/www
.xxx.com
/bootstrap/cache
@
/home/www/xxx
.com
/storage
|
RSYNC_EXCLUDE='/etc/rsync_exclude.list'
1
2
3
4
|
[ec2-user@ip-172-31-7-248
rsync
]$
cat
/etc/rsync_exclude
.list
www.xxx.com
/storage
www.xxx.com
/bootstrap/cache
xxx.com
/storage
|
参考:
http://fanrong33.com/archives/89.html