实现两个Linux服务器文件实时同步 rsync - Choyeon(初雨博客)

/ 0评 / 0

安装 rsync

```shell
# CentOS
yum install rsync xinetd
# Ubuntu
sudo apt-get install rsync xinetd

<!--more-->


### 配置rsync

目录位置 /etc/rsyncd.conf

uid = root # 指定用户
gid = root # 指定用户
use chroot = no
max connections = 5
timeout = 600 # 超时时间
pid file = /var/run/rsyncd.pid
lockfile = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[backup]
path = /home/sync
ignore errors = yes
read only = no # 可读
write only = no # 可写
hosts allow = 192.168.1.21 # 制定客户端IP
hosts deny = *
list = yes
auth users = user # 指定用户
secrets file = /etc/user.passwd # 密码存储位置

### 增加密码文件和设置权限

创建配置中的密码文件,并增加权限:
echo "backup:87654321" > /etc/backup.passwd
chmod 600 /etc/backup.passwd

### 启动rsync

shell
rsync --daemon # --daemon表示后台执行,客户端开启rsync不需要--daemon选项

echo "/usr/bin/rsync --daemon" >> /etc/rc.local #开机启动rsync服务

没有防火墙会报错 但是不影响 所在服务器例如阿里云腾讯云也要放行 873 端口

firewall-cmd --permanent --add-port=873/tcp #添加防火墙规则,允许873端口的数据访问

### 配置客户端

设置密码并设置权限

shell
echo "yuzhen123"> /tmp/rsync.password
chmod 600 /tmp/rsync.password

配置操作

shell
yum -y install rsync

rsync -aivrtL --password-file=/tmp/rsync.password /usr/local/sync_data user@192.168.1.21::backup

参数说明

v:显示详细信息

z:传输过程中对数据进行压缩

r:递归

t:保留修改时间属性

o:保留文件所有者属性

p:保留文件权限属性

g:保留文件所属组属性

a:归档模式,主要保留文件属性,等同于-rlptgoD

--progress:显示数据传输的进度信息

--password-file=FILE:指定密码文件,将密码写入文件,实现非交互式数据同步,这个文件名也需要修改权限为600

--delete:删除那些仅在目标路径中存在的文件(源路径中不存在),在脚本中的数据同步经常加上此参数

--list-only:仅列出服务器模块列表,需要rsync服务器设置 list=true

### 实时同步环境

#### 数据实时同步:

环境:Rsync + Inotify-tools。
下载安装

shell
wget https://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
tar -zxvf inotify-tools-3.13.tar.gz
mkdir /usr/local/inotify
cd inotify-tools-3.13
./configure --prefix=/usr/local/inotify/
make && make install

#### 设置环境

shell
vim /etc/profile # zsh为 zshrc
在末尾增加一行:
export PATH=$PATH:/usr/local/inotify/bin
使配置生效:
source /etc/profile

shell

echo '/usr/local/inotify/lib' >> /etc/ld.so.conf --加载库文件
ldconfig
ln -s /usr/local/inotify/include /usr/include/inotify

#### 测试脚本:

创建shell文件:

shell
vim /test.sh

输入以下内容:

bash

!/bin/bash

src=/usr/local/sync_data/
user=backup
host1=192.168.1.22
dst1=backup
passpath=/tmp/rsync.password # 密码存放位置

/usr/local/inotify/bin/inotifywait \
-mrq --timefmt '%d/%m/%y' \
--format '%T %w%f%e' \
-e modify,delete,create,attrib \
/usr/local/nginx/html/hello/ | while read files
do
rsync -vzrtopg --delete --progress --password-file=$passpath $src $user@$host1::$dst1
echo "${files} was rsyncd" >>/tmp/rsync.log 2>&1
echo '自动同步成功'
done

#### 设置自动运行

shell
chmod 755 sync.sh
/root/home/sync.sh & echo 'nohup /root/home/sync.sh' >> /etc/rc.local --设置开机自启

---

shell
 常见错误:    

    问题一:
      rsync: failed to set times on “directory” Operation not permitted (1)
      解决:
        请检查/etc/rsyncd.conf这个配置文件是否正确。

    问题二:

      @ERROR: auth failed on module 模块名
      rsync error: error starting client-server protocol (code 5) at main.c(1657) [Receiver=3.1.3]
      原因:
        服务器端该模块(模块名)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。
        提供正确的用户名密码解决此问题。

    问题三:

      inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object

      [root@db zzh]# ll /proc/sys/fs/inotify (如果有下列三项则支持inotifytools)
      total 0
      -rw-r--r-- 1 root root 0 Sep 20 16:52 max_queued_events
      -rw-r--r-- 1 root root 0 Sep 20 16:52 max_user_instances
      -rw-r--r-- 1 root root 0 Sep 20 16:52 max_user_watches

      解决:
      [root@db zzh]# ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0

    问题四:

      wile read 命令未找到

      解决:

        检出sh文件,或重新编写。

rsync配置文件说明:

uid = root #--rsync运行权限为root
gid = root #--rsync运行权限为root
use chroot = no #--是否让进程离开工作目录
max connections = 5 #--最大并发连接数,0为不限制
timeout = 600 #--超时时间
pid file = /var/run/rsyncd.pid #--指定rsync的pid存放路径
lockfile = /var/run/rsyncd.lock #--指定rsync的锁文件存放路径
log file = /var/log/rsyncd.log #--指定rsync的日志存放路径
[web1] #--模块名称
path = /data/ #--该模块存放文件的基础路径
ignore errors = yes #--忽略一些无关的I/O错误
read only = no #--客户端可以上传
write only = no #--客户端可以下载
hosts allow = * #--允许连接的客户端主机ip
hosts deny = * #--黑名单,*表示任何主机
list = yes
auth users = user #--认证此模块的用户名
secrets file = /etc/user.passwd #--指定存放“用户名:密码”格式的文件
```

发表评论

邮箱地址不会被公开。 必填项已用*标注