一、 rsync简介
remote synchronize,rsync是一款开源的、快速的、多功能的、可实现全量或增量的本地或远程数据同步备份的优秀工具。Rsync软件适用于unix/linux/windows等多种操作系统平。官方网站:http://www.samba.org/ftp/rsync/rsync.html
一个rsync相当于scp,cp,rm,而且还优于他们每一个命令
二、 特性
支持拷贝特殊文件如链接文件,设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar 的排除功能。
可以做到保持源文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变
可以实现增量同步,即只同步发生变化的数据,因此数据传输效率很高,tar -N。
可以使用rcp,rsh,ssh 等方式来配合传输文件(Rsync 本身不对数据加密)
可以通过socket(进程方式)传输文件和数据(服务器和客户端)
支持匿名或认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份及镜像
三、 rsync工作场景说明
NFS文件的一主一备环境,有些项目和网站限定了不能做NFS的DRBD双机方案,所以可以考虑用rsync作一个冗余NFS机器出来(--delete参数使用时应该谨慎)
rsync+inotify实时同步系统,有些网站由于网络环境的制约,比如机器是随着网站规模的不断扩大才逐渐增多的进入IDC托管机房的,机器比较分散,而暂时又不能停掉业务整合服务器之前,这之前的方案可以考虑采用rsync+inotify或sersync
线上的SVN与线上机器的代码之前的同步,像我们的SVN服务器的代码量还是比较大的,而且代码更新比较频繁,所以我们只会能过rsync结合自己开发的程序同步少量稳定的代码到线上
四、 rsync工作方式
1. Local(此时类似于cp、mv命令的功能)。
rsync [OPTION...] SRC... [DEST]
rsync -avz /etc/hosts /tmp =====cp
rsync -avz --delete /data/ /tmp/ =====mv
2. remote shell(此时类似于scp命令的功能)。
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
rsync -avzP -e "ssh -p 22" /tmp/ [email protected]:/tmp
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
rsync -avzP -e "ssh -p 22" [email protected]:/tmp/ /tmp
3. rsync daemon:以守护进程(socket)的方式传输数据(这个是rsync自身的重要的功能)。
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
n rsync常用参数说明
-v, --verbose 详细模式输出
-z, --compress 对备份的文件在传输时进行压缩处理
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl
-r, --recursive 对子目录以递归模式处理
-t, --times 保持文件时间信息
-o, --owner 保持文件属主信息
-p, --perms 保持文件权限
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-l, --links 保留软链结
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--exclude=PATTERN 指定排除不需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--bwlimit=RATE 指定传输速率
--delete 无差异同步(谨慎使用,尽量不用)
推:本地有,远端有;本地没有,删除远端独有(需要备份远端数据)
拉:远端有,本地有;远端没有,删除本地独有(需要备份本地数据)
五、 快速部署代码
cat >/etc/rsyncd.conf<<EOF
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
#port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.80.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = backup server by oldboy
path = /backup
#exclude = test/test.php
EOF
rsync --daemon
netstat -lntup|grep rsync
useradd rsync -s /sbin/nologin -M
mkdir /backup
chown -R rsync /backup
echo "rsync_backup:oldboy" >/etc/rsync.password
chmod 600 /etc/rsync.password
echo "rsync --daemon" >>/etc/rc.local
tail -1 /etc/rc.local
客户端操作
echo "oldboy" >/etc/rsync.password
chmod 600 /etc/rsync.password
cat /etc/rsync.password
ls -ld /etc/rsync.password
推:rsync -avz /tmp/ [email protected]::backup --password-file=/etc/rsync.password
拉:rsync -avz [email protected]::backup /tmp/ --password-file=/etc/rsync.password
六、 详细说明:rsync的安装与配置(即工作方式3:rsync daemon)
1. 服务端操作
n 安装rsync(默认已安装,在备份服务器上操作)
[root@liwenbin ~]# rpm -aq rsync
rsync-3.0.6-12.el6.x86_64
n rsync配置文件
rsync服务器主要有三个配置文件:rsyncd.conf,rsyncd.secrets和rsyncd.motd,而rsync安装后并没有自动创建相关配置文件,因此我们还需手动创建
cat /etc/rsyncd.conf
uid = rsync # 备份以什么身份进行,用户ID
gid = rsync # 备份以什么身份进行,组ID
#注意这个用户ID和组ID,如果要方便的话,可以设置成root,这样rsync几乎就可以读取任何文件和目录了,但是也带来安全隐患。建议设置成只能读取你要备份的目录和文件即可。
use chroot = no
max connections = 2000 #最大连接数,0代表没有限制
#port = 873 #默认端口873
pid file = /var/run/rsyncd.pid #运行进程的ID写到哪里
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log #日志记录文件
ignore errors # 忽略一些无关的IO错误
read only = false # 设置为非只读,即可以传至服务器的相应目录。
list = false # 不允许列文件
hosts allow = 192.168.80.0/24 #允许连接服务器的主机IP地址,如果多个ip则用空格隔开
hosts deny = 0.0.0.0/32 #禁止连接服务器的主机IP地址,也可为*,表示所有。
auth users = rsync_backup # 认证的用户名,如果没有这行,则表明是匿名
secrets file = /etc/rsync.password # 认证文件名,用来存放密码
[backup]
comment = backup server by oldboy
path = /backup # 需要备份的目录
#exclude = test/ test.php #设置不同步的目录或文件用空格隔开
n 启动rsync进程
[root@liwenbin ~]# rsync --daemon
[root@liwenbin ~]# ps -ef|grep rsync|egrep -v grep
root 1956 1 0 19:21 ? 00:00:00 rsync �daemon
[root@liwenbin ~]# netstat -lntup|grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1956/rsync
tcp 0 0 :::873 :::* LISTEN 1956/rsync
[root@liwenbin ~]# ss -lntup|grep rsync
tcp LISTEN 0 5 :::873 :::* users:(("rsync",1956,5))
tcp LISTEN 0 5 *:873 *:* users:(("rsync",1956,3))
[root@liwenbin ~]# lsof -i :873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 1956 root 3u IPv4 12983 0t0 TCP *:rsync (LISTEN)
rsync 1956 root 5u IPv6 12984 0t0 TCP *:rsync (LISTEN)
n 杀进程
pkill rsync
killall rsync #需要连续杀
kill `cat /var/run/rsyncd.pid ` #杀进程号
n 仅允许通过某个IP地址访问
rsync --daemon --address=192.168.80.100
n 创建用户
[root@liwenbin ~]# useradd rsync -s /sbin/nologin �M
n 创建备份目录并授权
[root@liwenbin ~]# mkdir /backup
[root@liwenbin ~]# chown -R rsync /backup
n 创建、编辑并授权密码文件
[root@liwenbin ~]#echo "rsync_backup:oldboy" >/etc/rsync.password
[root@liwenbin ~]# chmod 600 /etc/rsync.password
n 加入开机自启动
[root@liwenbin ~]# echo "rsync --daemon" >>/etc/rc.local
[root@liwenbin ~]# tail -1 /etc/rc.local
2. 客户端操作
n 创建、编辑并授权密码文件
echo "oldboy" >/etc/rsync.password
chmod 600 /etc/rsync.password
cat /etc/rsync.password
ls -ld /etc/rsync.password
n 数据备份
推:rsync -avz /tmp/ [email protected]::backup --password-file=/etc/rsync.password
拉:rsync -avz [email protected]::backup /tmp/ --password-file=/etc/rsync.password
注意:推拉都是客户端操作
3. 进程管理
n 杀进程
pkill rsync
killall rsync #需要连续杀
kill -HUP `cat /var/run/rsyncd.pid ` #平滑杀死
kill -USR2 `cat /var/run/rsyncd.pid #平滑杀死
kill `cat /var/run/rsyncd.pid ` #杀进程号
kill -9 rsync #强制杀死(建议禁止使用)
n 安全优化选项
rsync --daemon --address=192.168.80.100 #仅允许通过服务端某个IP地址同步
七、 rsync排错思路
1. rsync服务端排错思路
1) 查看rsync服务配置文件路径是否正确,正确的默认路径为/etc/rsyncd.conf
2) 查看配置文件里host allow,host deny,允许的ip网段是否是允许客户端访问的ip网段
3) 查看配置文件中path参数里的路径是否存在,权限是否正确(正常应为配置文件中的UID参数对应的属和组)
4) 查看rsync服务是否启动,查看命令为:ps -ef|grep rsync。端口是否存在netstat -lnt|grep 873
5) 查看iptables防火墙和selinux是否开启允许rsync服务通过,也可考虑交闭
6) 查看服务端rsync配置的密码文件是否为600权限,密码文件格式是否正确
7) 如果是推送数据,要查看下,配置rsyncd.conf文件中用户是否对模块下目录有可读写的权限
2. Rsync客户端排错思路
8) 查看客户端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,注意:仅需要有密码,并且和服务端的密码一致。
9) 用telnet连接rsync服务器ip地址873端口,查看服务是否启动(可测试服务端防火墙是否阻档)。telnet 192.168.1.111 873
10) 客户端执行命令是rsync �avzrtopgP [email protected]::dingjian/test/ /test/ --password-file=/etc/rsync.password
注:若地址中使用两个分号“::”,将直接使用rsyncd的用户认证方式;
若地址中使用一个“:”号,将启用ssh模式进行用户验证,需要服务端开启sshd服务;
七、 rsync优缺点
1. rsync优点
增量备份同步,支持socket(daemon),集中备份
2. rsync缺点
1) 大量小文件同步的时候,比对时间较长,有的时候,rsync进程停止
解决:a.打包成一个文件同步;
b.drbd(文件系统同步,复制block)
2) 同步大文件,10G这样的大文件有时也会出问题,中断。未完成同步前,是隐藏文件,同步完成后改为正常文件
八、 部署rsync脚本
#!/bin/sh
#time:2015-12-4
#auther:liwenibn
#function:quick install rsync
#qq:1935845114
################################
#define
CHECK=` rpm -aq rsync | wc -l `
HOSTIP="192.168.80.0/24"
PASSWORD="123456"
USER="rsync_user"
SYS_USER="rsync"
PWD_FILE=/etc/rsync.password
DATADIR=/data/www
#examine
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
if [ "$CHECK" -eq 1 ]
then
action "rsync is installed" /bin/true && exit 1
else
action "rsync is not installed"
echo "Yum install rsync..."
yum install rsync -y
[ $? -eq 0 ] && action "rsync is installed" /bin/true
fi
rm -f /etc/rsyncd.conf && cat >>/etc/rsyncd.conf<<EOF
uid = $SYS_USER
gid = $SYS_USER
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[www]
path = $DATADIR
ignore errors
read only = true
list = false
hosts allow = $HOSTIP
hosts deny = 0.0.0.0/32
auth users = backup
secrets file = $PWD_FILE
EOF
if [ ! -d $DATADIR ]
then
mkdir -p $DATADIR
fi
action "$datadir exist" /bin/true
if [ ! -f $PWD_FILE ]
then
echo "$USER:$PASSWORD" > $PWD_FILE && chmod 600 $PWD_FILE
fi
action "$PWD_FILE exist" /bin/true
rsync --daemon
[ $? -eq 0 ] && action "rsync configure successful" /bin/true
exit