rsync + inotify 单向同步数据
实验目的
验证:不同权限用户,不同密码下,单向同步数据
一、环境准备
###########################################
1.1 机器列表
IP USER PASSWD 作用
192.168.199.201 root 1 源服务器(客户端)
192.168.199.202 faye 123 目标服务器(服务端)
192.168.199.203 root 1 目标服务器(服务端)
###########################################
1.2 安装依赖 ,3台机器
yum install -y gcc gcc+
###########################################
root操作,普通用户不行
###########################################
二、192.168.199.202 目标服务器(服务端) 操作
###########################################
2.1 安装 rsync(只需要rsync)
下载包
cd /usr/local/
wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
解压安装
cd /usr/local/
tar zxvf rsync-3.1.2.tar.gz
cd rsync-3.1.2
./configure --prefix=/usr/local/rsync
make && make install
###########################################
2.2 配置rsyncd.conf (常用参数)
PS:注释语句不可以和参数在同一行,不然无法同步数据
vim /usr/local/rsync/rsyncd.conf
### 全局参数 ###
#默认端口
port=873
# rsync启动时欢迎信息页面文件位置(文件内容自定义)
# motd file = /etc/rsyncd.Motd
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
# 支持max connections参数的锁文件
lock file = /var/run/rsync.lock
# 设置rsync运行权限为root
uid = root
# 设置rsync运行权限为root
gid = root
# 默认为true,修改为no,增加对目录文件软连接的备份
use chroot = no
# 最大连接数
max connections = 2000
# 设置超时时间
timeout = 600
### 模块参数,有的也可以写在全局变量中 ###
# 自定义模块名称
[testmodule]
# 本机存放源服务器数据的文件夹,必须存在
path = /data
# 解释用语
comment = sync file from 192.168.199.201:/data
# 设置rsync服务端文件为读写权限
read only = false
# 不显示rsync服务端资源列表
list = no
# 执行数据同步的用户名(必须存在),可以设置多个,用英文状态下逗号隔开
auth users = faye
# 允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts allow = 192.168.199.0/24
# 禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = *
# 用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
secrets file = /usr/local/rsync/rsyncd.secrets
###########################################
2.3 配置密码文件,并修改权限
vim /usr/local/rsync/rsyncd.secrets
#格式:用户名:密码,可以设置多个,每行一个用户名:密码
faye:123
给密码文件赋予600权限,必须600,
目标服务器属主必须为root,源服务器最好属主也是root
chown root.root /usr/local/rsync/rsyncd.secrets
chmod 600 /usr/local/rsync/rsyncd.secrets
###########################################
2.4 新建储存目录(如果不存在)
这个目录是rsyncd.conf
中模块中的path
参数,必须要存在
普通用户faye
要对这个目录有操作权限
mkdir /data
chmod 777 /data
如果目录不存在,大概率会报下面的错误
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]
###########################################
2.5 启动rsyncd,查看rsyncd进程 端口
/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsyncd.conf
ps -ef | grep rsync
netstat -lanp | grep 873
关闭rsync,加 -9 需要删除pid文件
kill PID
开机启动
echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local
###########################################
三、192.168.199.203 目标服务器(服务端) 操作
###########################################
3.1 安装 rsync(只需要rsync)
参考 2.1
###########################################
3.2 配置rsyncd.conf (常用参数)
参考 2.2
修改 auth users = root
###########################################
3.3 配置密码文件,并修改权限
echo "root:1" >>/usr/local/rsync/rsyncd.secrets
chown root.root /usr/local/rsync/rsyncd.secrets
chmod 600 /usr/local/rsync/rsyncd.secrets
###########################################
3.4 新建储存目录(如果不存在)
参考 2.4
###########################################
3.5 启动rsyncd,查看rsyncd进程 端口
参考 2.5
###########################################
四、192.168.199.201 源服务器(客户端) 操作
###########################################
4.1 安装 rsync
参考 2.1
无需配置rsyncd.conf
,因为源服务器的rsync不启动
###########################################
4.2 安装 inotify
下载包
cd /usr/local/
wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
解压安装
cd /usr/local/
tar xzvf inotify-tools-3.13.tar.gz
chown -Rf root:root inotify-tools-3.13
cd inotify-tools-3.13
./configure --prefix=/usr/local/inotify
make && make install
###########################################
4.3 设置环境变量
echo "export PATH=/usr/local/inotify/bin/:$PATH" >>/root/.bash_profile
生效
source /root/.bash_profile
加载库文件
echo '/usr/local/inotify/lib' >> /etc/ld.so.conf
ldconfig
ln -s /usr/local/inotify/include /usr/include/inotify
###########################################
4.4 修改inotify默认参数(inotify默认内核参数值太小)
echo "fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535" >>/etc/sysctl.conf
生效
sysctl -p
4.5 创建脚本,实时触发rsync进行同步
vim /usr/local/inotify/rsync.sh
#!/bin/bash
dstip1=192.168.199.202
dstip2=192.168.199.203
# 对/特别敏感,如果复制整个coco目录,coco后面不加/
srcdir=/home/coco #源服务器同步目录,必须存在
dstdir=testmodule #目标服务器rsync同步目录模块名称
:<<!
excludedir=/usr/local/inotify/exclude.list
不想同步的目录or文件
目录下的a目录和b目录下面的b1目录,exclude.list文件可以这样写
a/
b/b1/
!
user202=faye #目标服务器rsync同步用户名
user203=root
passdir1=/usr/local/rsync/rsyncd.secrets202 #目标服务器rsync同步用户的密码在源服务器的存放路径
passdir2=/usr/local/rsync/rsyncd.secrets203
inotifywait=/usr/local/inotify/bin/inotifywait
$inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $srcdir | while read file
do
# 如果端口不为22的话,可以在`/usr/bin/rsync-vzrtopg`后面添加`-e ssh -p 端口号`进行传输
/usr/bin/rsync -vzrtopg --delete --progress --password-file=$passdir1 $srcdir $user202@$dstip1::$dstdir
# 可家判断语句看是否成功
echo "${file} was rsynced" >>/tmp/rsync.log 2>&1
/usr/bin/rsync -vzrtopg --delete --progress --password-file=$passdir2 $srcdir $user203@$dstip2::$dstdir
echo "${file} was rsynced" >>/tmp/rsync.log 2>&1
done
新建密码文件,只需要填入密码就行
echo "123" >>/usr/local/rsync/rsyncd.secrets202
echo "1" >>/usr/local/rsync/rsyncd.secrets203
chown root.root /usr/local/rsync/rsyncd.secrets{202,203}
chmod 600 /usr/local/rsync/rsyncd.secrets{202,203}
给监控脚本赋予777权限
chmod 777 /usr/local/inotify/rsync.sh
设置开机自动在后台运行脚本
sh /usr/local/inotify/rsync.sh &
4.6 测试
cd /home/coco
touch 1
mkdir haha
查看日志
tailf /tmp/rsync.log
4.7 验证
正常情况下,202和203如下
[faye@node2 coco]$ tree /data
/data
└── coco
├── 1
└── haha
2 directories, 1 file