rsync 远程同步
正确有效的备份方案是保障系统及数据安全的重要手段,在服务器中通常会结合计划任务,shell脚本来执行本地备份。
rsync(Remote Sync,远程同步)是一个开源的快速安全高效的异地备份工具,可以在不同的主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,
采用优化的同步算法,传输前执行压缩。适合异地备份,镜像服务等应用,是一种常用的文件备份工具。
官方站点:http://rsync.samba.org
维护人员:Waync Davison
版本:3.0.9
负责发起rsync同步操作的客户机称为发起端
负责响应来自客户机的rsync同步操作的服务器称为备份源
下载:在下行同步中,备份源负责提供文档的原始位置,发起端应对文件具有读取权限
上传:在上行同步中,备份源负责提供文档的目标位置,发起端应对文件具有写入权限
rsync 两种源模式:
SSH备份源
rsync备份源
配置SSH备份源
优点:远程连接安全,增强备份的保密性,容易实现。
配置过程:
a、确认备份源文件夹位置
b、准备备份操作用户
案例:
A机器的网站目录/var/www/html作为备份源
用户rget做下行(下载)备份
用户rput做上行(上传)备份
A机器为rsync服务端 IP:192.168.200.128
B机器为rsync客户端 IP:192.168.200.129
A机器上的操作:192.168.200.128:
yum -y install httpd
rpm -q rsync
rsync-3.0.6-9.el6_4.1.x86_64
useradd rget
echo "123456" |passwd --stdin rget
useradd rput
echo "123456" |passwd --stdin rput
vi /etc/ssh/sshd_config
122 UseDNS no
#110 AllowUsers rget rput
关闭UseDNS加速SSH登录
限定登录用户
service sshd restart
调整/var/www/html目录权限,使rget用户有读取权限,rput用户有写入权限,建议将目录的属主修改为备份用户,另外需要为web服务的运行用户指定额外的权限,
cd /var/www/html
mkdir upload
chown -R rput:rput /var/www/html/
setfacl -R -m user:apache:rwx /var/www/html/upload
getfacl /var/www/html/upload
acl访问控制机制参数详解
setfacl 设置acl权限
getfacl 查看acl权限
-R 递归
-m 制定权限
-x 个别删除
-b 全部删除
* 下面两行不需要执行,作为了解
setfacl -R -b /var/www/html 表示删除所有ACL属性
setfacl -R -x user:apache /var/www/html/upload 只删除某一项
---------------------------------------------
凡是以后在/var/www/html/upload/新建立的文档,apache用于都具有rwx权限
setfacl -m default:user:apache:rwx /var/www/html/upload
getfacl /var/www/html/upload |grep default
配置rsync备份源
rsync 不仅用作远程同步发起端(客户端),也可以作为守护进程(服务端),为其他客户机提供备份源。
1、建立/etc/rsyncd.conf配置文件
2、为备份账户创建数据文件
3、启动rsync服务进程
1、建立/etc/rsyncd.conf配置文件,以源目录 /var/www/html/,备份帐号 backuper作为事例:
[root@rsync-master html]# vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
address = 192.168.200.128
port = 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.200.0/24
[wwwroot]
path = /var/www/html
comment = Document Root os www.crushlinux.com
read only = yes
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper
secrets file = /etc/rsyncd_users.db
uid = nobody //用户名
gid = nobody //组名
use chroot = yes //禁锢在源目录
address = 192.168.200.128 //监听地址
port = 873 //监听端口
log file = /var/log/rsyncd.log //日志文件位置
pid file = /var/run/rsyncd.pid //存放进程ID文件位置
hosts allow = 192.168.200.0/24 //允许访问的客户端地址
[wwwroot] //共享模块名称
path = /var/www/html //源目录的实际路径
comment = Document Root os www.crushlinux.com //描述信息
read only = yes //是否为只读
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z //同步时不再压缩的文件类型
auth users = backuper //备份授权用户
secrets file = /etc/rsyncd_users.db //存放账户信息的数据文件
对于rsync的备份源最好仅允许以只读的方式做下行同步
若需要做上行同步时,建议用SSH备份源
下行同步可采用匿名的方式,只要去掉auth users 、secrets file 配置记录即可
2、为备份账户创建数据文件,以冒号分割,密码信息在文件中以明文方式存放,为避免信息泄漏,需要调整权限
[root@rsync-master ~]# vim /etc/rsyncd_users.db
backuper:pwd123
chmod 600 /etc/rsyncd_users.db
备份用户backuper也需要对/var/www/html/有相应的读取权限
ll /var/www/html/
drwxrwxr-x+ 2 rput rput 4096 1月 18 23:06 upload
3、启动服务,运行参数为"--daemon",关闭rsync可采用kill命令
rsync --daemon
netstat -anpt |grep rsync
关闭服务
kill $(cat /var/run/rsyncd.pid)
4、异地备份的特殊性,不需要全天不间断运行,配置成只有客户机连接的时候才启动(交给xinetd管理)
[root@rsync-master ~]# vim /etc/xinetd.d/rsync
6 disable = no #将原有的yes改成no
11 server_args = --daemon #确认有--daemon选项即可
yum -y install xinetd
service xinetd start
使用rsync备份工具(在客户机,发起端执行)
本地备份:备份源和发起端可以是一台机器
rsync /etc/fstab /opt/
rsync -rl /etc/fstab /boot/grub/ /opt/
rsync的常用格式:
rsync [选项] 原始位置 目标位置
-r:递归模式,包含目录及子目录中所有文件
-l:对于符号链接文件仍然复制为符号链接文件
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户使用)
-o:保留文件的属主标记(仅超级用户使用)
-D:保留设备文件及其他特殊文件
-a:归档模式,递归并保留对象属性,等同于 -rlptgoD
-v:显示同步过程的详细(verbose)信息
-z:在传输文件时进行压缩(compress)
-H:保留硬连接文件
-A:保留ACL属性信息
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据对象的校验和来决定是否跳过文件
异地备份:B机器上的操作:192.168.200.129:
配置源的表示方法:
rsync命令需要指定备份源服务器中的资源位置
下行备份操作:备份源对应 “原始位置”
上行备份操作:备份源对应 “目标位置”
SSH备份源表示为:
用户名@主机地址:目标路径,用一个冒号分割
访问SSH备份源,下载到本地/opt目录
rsync -avz [email protected]:/var/www/html/ /opt/
rsync备份源表示为:
用户名@主机地址::共享模块名称
rsync://用户名@主机地址/共享模块名称
rsync -avz [email protected]::wwwroot /root
rsync -avz rsync://[email protected]/wwwroot /root
1、下行同步ssh备份源
将服务器A的/var/www/html 文件夹与B本地/wwwroot文件夹同步(保持文件权限属性,
软硬连接,ACL属性,删除/wwwroot中多余文件,传输过程进行加密)
mkdir -p /wwwroot
rsync -avzH --delete [email protected]:/var/www/html/ /wwwroot
ls /wwwroot/
对于同一项远程同步任务,再次执行时,自动做增量更新,同名的文件将不再重复复制
A机器上的操作:192.168.200.128:
cd /var/www/html/
rm -rf index.html upload/
for i in {1..10}; do touch $i.txt; done
B机器上的操作:192.168.200.129:
rsync -avzH --delete [email protected]:/var/www/html/ /wwwroot
ls /wwwroot/
2、下行同步rsync备份源
当备份源为rsync服务器时,只要将同步操作中的原始位置修改为规范格式,其他操作基本一样
将备份源服务器中的 wwwroot 下载到本地的 /myweb目录
B机器上的操作:192.168.200.129:
mkdir /myweb
rsync -avzH --delete [email protected]::wwwroot /myweb
ls /myweb
3、上行同步ssh备份源
将客户机中的文件上传到备份源服务器的/var/www/html目录下,由于用户是rput并非root用户,因此 -g -o 等选项无法使用
cd /root
rsync -rlvz --delete install.log [email protected]:/var/www/html
编写rsync备份脚本:
生产环境中的备份工作通常是按计划重复执行的,结合shell和crond服务来完成
1、ssh备份源的无交互验证,由于脚本根据crond时间来执行,用户没办法按时根据提示输入密码
B机器上的操作:192.168.200.129:创建密钥对,将公钥文件发给A服务器中的备份用户,实现无交互登录
创建密钥对:
ssh-keygen -t rsa
复制密钥对:
ssh-copy-id [email protected]
ssh-copy-id [email protected]
连接测试:
rsync -avzH --delete [email protected]:/var/www/html/ /wwwroot
2、rsync备份源的无交互验证,可以使用export RSYNC_PASSWORD保存密码,脚本执行时,可以自动读取该变量的值,在需要时发送给rsync服务器来进行燕子
export RSYNC_PASSWORD=pwd123
rsync -avzH --delete [email protected]::wwwroot /wwwroot/
相对于 SSH 源的免交互措施来说,使用变量存放密码显得不够安全,因此可在脚本中使用,并将脚本的权限严格控制,避免密码泄漏。
vi rsync_get_wwwroot.sh
-------------------------------------
#!/bin/bash
CMD="/usr/bin/rsync"
RSYNC_USER="backuper"
export RSYNC_PASSWORD="pwd123"
ARGS="-az --delete"
SRC="192.168.200.128::wwwroot"
DST="/wwwroot"
mkdir -p $DST
$CMD $ARGS $RSYNC_USER@$SRC $DST
------------------------------------
chmod 700 rsync_get_wwwroot.sh
crontab -e
30 20 * * * /root/rsync_get_wwwroot.sh
service crond restart
chkconfig crond on
rsync+inotify实时同步 (B机器上的操作)
Linux 从2.6.13版内核开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件的存取,删除,移动,修改等。利用这个机制,可以实现文件异动警告,增量备份,针对目录或文件的变化及时做出响应。
rsync+inotify 可以实现触发式备份,只要原始位置的文档发生变化,则立即启动增量备份,否则处于静默等待状态,避免了按固定周期备份时存在的延迟性,周期过密等问题。
inotify 主要做本机监控,在触发式备份应用中更适合上行同步
inotify机制提供了三个调控参数:
max_queued_events //表示监控事件队列
max_user_instances //最多监控实例数
max_user_watches //每个实例最多监控文件数
cat /proc/sys/fs/inotify/max_queued_events //表示监控事件队列(16384)
16384
cat /proc/sys/fs/inotify/max_user_instances //最多监控实例数(128)
128
cat /proc/sys/fs/inotify/max_user_watches //每个实例最多监控文件数(8192)
8192
当要监控的目录,文件数量较多或者变化频繁时,建议加大这三个参数的值
vi /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
sysctl -p
安装 inotify-tools 主要提供inotifywait,inotifywatch等工具,用来监控,汇总改动情况
官方站点:http://inotify-tools.sourceforge.net
tar xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure && make && make install
以监控网站目录/var/www/html为例,执行inotifywait命令后,在另外一个终端中改动/var/www/html目录下的内容
mkdir /var/www/html -p
inotifywait -mrq -e modify,create,move,delete /var/www/html/
-e 指定要监控的事件
-m 表示持续监控
-r 表示递归整个目录
-q 简化输出信息
另一个终端:在/var/www/html/目录下添加文件、移动文件、跟踪屏幕输出结果
mkdir /var/www/html/a
mkdir /var/www/html/b
mv /var/www/html/b /var/www/html/bb
rm -rf /var/www/html/a
[root@rsync-client ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html/
fy,create,move,delete /var/www/html/
/var/www/html/ CREATE,ISDIR a
/var/www/html/ CREATE,ISDIR b
/var/www/html/ MOVED_FROM,ISDIR b
/var/www/html/ MOVED_TO,ISDIR bb
/var/www/html/ DELETE,ISDIR a
inotifywait 可监控modify(修改),create(创建),move(移动),delete(删除),attrid(属性更改)等各种事件,一有变动立即输出结果,inotifywait可用于收集系统变动情况,并在运行结束后输出汇总的变化情况。
编写触发式同步脚本
inotifywait 输出的监控结果中,每行记录中包括目录,事件,文件,据此可以识别变动情况,只要检测到变动时执行rsync上行同步操作即可。
注意:当更新较频繁时,避免并发执行rsync备份,若rsync进程已经存在则忽略本次同步,或者根据rsync进程数量来决定是否同步
vi inotify_rsync.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,attrib,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete /var/www/html/ [email protected]:/var/www/html"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ]
then
$RSYNC_CMD
fi
done
chmod +x inotify_rsync.sh
bash inotify_rsync.sh
echo "/bin/bash /root/inotify_rsync.sh" /etc/rc.local
脚本用来测试本机/var/www/html目录的变动,一旦有更新立刻出发rsync同步操作,上传至服务器192.168.200.128的/var/www/html目录,用户验证采用SSH方式。
1、使用rsync工具执行一次上行同步
2、在本机运行inotify_rsync.sh脚本
3、在本机的/var/www/html目录下,执行创建,删除,修改等操作
4、查看服务器中的/var/www/html目录中的变化