1.前言:
rsync(remote sync)是unix及类unix平台下的数据镜像备份软件,它不像FTP那样需要全备份,rsync可以根据数据的变化进行差异备份,第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件,从而减少数据流量,提高工作效率。
2.前期准备:
主机A:192.168.10.10
需要同步代码的主机B:192.168.10.15 与 主机C:192.168.10.20
目的将主机A的代码传到主机B,C上
3.安装rsync(需切换到root用户)
主机A,B,C都应该安装rsync
sudo su
wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz
对于wget方式因为找不到下载路径等原因下载不了的,可用:
yum -y install rsync
tar zxvf rsync-3.0.9.tar.gz
cd rsync-3.0.9
./configure —prefix=/usr/local/rsync
make && make install
4.主机A配置:
安装rsync后,创建配置rsyncd.conf文件,vim /etc/rsyncd.conf
添加内容如下:
- uid = root #连接到此用户被映射为用户root的权限
- gid = root #连接到此用户被映射为用户root的权限
- use chroot = no
- max connections = 20 #最大连接数,**视实际需获取代码的主机数量而定**
- exclude = test_ignore #**相对于path中所定义文件夹的路径,传输时候,不传这些目录;指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中**。
- transfer logging = yes
- timeout = 900 #连接超时时间
- ignore nonreadable = yes
- dont compress = .gz .tgz .zip .z .Z .rpm .deb .bz2 #防止使用这些方式进行压缩
- [test_php_deploy] # **自定义的标签名字,后续在客户端会用上**
- path=/home/vagrant/Code/EccangPlatformSystem/test #**主机B,C需要从主机A同步的文件目录,存在于主机A上**
- comment=test_php_deploy #自定义的标签名字,后续在主机B,C会用上
- ignore errors
- read only=true #为true,则不允许主机B,C上传文件
- write only=false #为false,则允许主机B,C下载文件
- list=false
- hosts allow = 192.168.10.15 192.168.10.20 #用一个主机列表指定哪些主机客户允许连接该模块,可以省略此句,若省略则代表允许所有的地址,安全起见,最好加上
- hosts allow示例:
- - 单个IP地址。例如:192.168.0.1
- - 整个网段。例如:192.168.0.0/24,192.168.0.0/255.255.255.0
- - 可解析的单个主机名。例如:centos,centos.bsmart.cn
- - 域内的所有主机。例如:*.bsmart.cn
- - “ * ”则表示所有。星号表示所有
- - 多个列表项要用空格间隔:192.168.0.1 192.168.0.3 192.168.16.1
- auth user=vagrant #**密码文件的登陆用户名,存在于主机A的用户,如有用多个逗号隔开,并且要求具有对需同步目录下的文件的读和执行权限。**
- secrets file=/usr/local/rsync/rsync.passwd #认证**密码文件**便于自动连接,存放用户名和密码的地方
5.配置主机A的密码
vim /usr/local/rsync/rsync.passwd #主机A新建密码文件
echo “vagrant:vagrant” > /usr/local/rsync/rsync.passwd #密码文件中添加”用户名:密码”
chmod 600 /etc/rsyncd.passwd #在主机A新建后,改变权限,修改密码文件的权限(只能是600)
rsync —daemon #在主机A,以daemon模式运行
service rsyncd start #启动rsyncd服务
kill rsync进程号 #停止rsync服务
ps -ef | grep rsync #查看是否正常启动
netstat -lntup | grep rsync #查看是否正常启动
6.主机B,C配置
先安装rsync;
mkdir /home/vagrant/project/givemecode #创建要同步的代码的保存文件夹
rsync —daemon #开启rsync;
7.测试执行
先在主机A对应的路径/home/vagrant/Code/EccangPlatformSystem/test中创建文件,文件夹:
mkdir a
touch b.txt
mkdir test_ignore#此文件夹不被同步到主机B,C,对应主机A中rsyncd.conf中的exclude参数指定的值。
然后在主机B,C执行:
rsync -vzrtopg vagrant@192.168.10.10::test_php_deploy /home/vagrant/project/givemecode/ —password-file=/usr/local/rsync/rsync.passwd —delete
其中参数说明:
- vagrant为主机A的rsyncd.conf文件中的参数auth user授权用户
- 192.168.10.10为主机A的ip
- test_php_deploy为主机A的rsyncd.conf文件的test_php_deploy模块
- /home/vagrant/project/givemecode/ 为从主机A同步文件到主机B,C的指定目录
- —password-file=/usr/local/rsync/rsync.passwd此密码文件路径为主机A上的密码文件路径
- —delete为删除本地多余的目录文件,也就是与主机A的目录文件匹配后不一样的多余文件。当主机A删除文件后,主机B,C同步文件时,若有此参数,主机B,C也会将相同文件删除。
执行效果,当主机A执行增删改文件时,主机B,C也会执行相同修改,达到同步效果;
8.同步的定时任务,主机B,C执行
vim /usr/local/rsync/rsync.sh
添加内容如下:
- #!/bin/bash
- rsync -vzrtopg vagrant@192.168.10.10::test_php_deploy /home/vagrant/project/givemecode/ --password-file=/usr/local/rsync/rsync.passwd --delete
添加到定时任务:
cd /etc
crontab –e
9.常见异常处理:
9.1若主机B,C同步时报错如下:
@ERROR: Unknown module ‘test_php_deploy’
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
可能是主机A中的rsyncd.conf中配置参数hosts allow未指定该主机B,C的ip