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

添加内容如下:



1. uid = root #连接到此用户被映射为用户root的权限
2. gid = root #连接到此用户被映射为用户root的权限
3. use chroot = no
4. max connections = 20 #最大连接数,**视实际需获取代码的主机数量而定**
5. exclude = test_ignore #**相对于path中所定义文件夹的路径,传输时候,不传这些目录;指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中**。
6. transfer logging = yes
7. timeout = 900 #连接超时时间
8. ignore nonreadable = yes
9. dont compress = .gz .tgz .zip .z .Z .rpm .deb .bz2 #防止使用这些方式进行压缩
10. [test_php_deploy] # **自定义的标签名字,后续在客户端会用上**
11. path=/home/vagrant/Code/EccangPlatformSystem/test #**主机B,C需要从主机A同步的文件目录,存在于主机A上**
12. comment=test_php_deploy #自定义的标签名字,后续在主机B,C会用上
13. ignore errors
14. read only=true #为true,则不允许主机B,C上传文件
15. write only=false #为false,则允许主机B,C下载文件
16. list=false
17. hosts allow = 192.168.10.15 192.168.10.20 #用一个主机列表指定哪些主机客户允许连接该模块,可以省略此句,若省略则代表允许所有的地址,安全起见,最好加上
18. hosts allow示例:
19. - 单个IP地址。例如:192.168.0.1
20. - 整个网段。例如:192.168.0.0/24,192.168.0.0/255.255.255.0
21. - 可解析的单个主机名。例如:centos,centos.bsmart.cn
22. - 域内的所有主机。例如:*.bsmart.cn
23. - “ * ”则表示所有。星号表示所有
24. - 多个列表项要用空格间隔:192.168.0.1 192.168.0.3 192.168.16.1
25. auth user=vagrant #**密码文件的登陆用户名,存在于主机A的用户,如有用多个逗号隔开,并且要求具有对需同步目录下的文件的读和执行权限。**
26. 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

添加内容如下:

1. #!/bin/bash
2. 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