一、rsync原理
rsync是linux下同步文件的一个高效算法,用于同步两处计算机的文件和目录,并适当利用查询文件中的不同快以减少数据传输。rsync主要特点就是增量传输:
假如我们现在需要同步两个文件保持一致,并且只想传送不同的部分,那么我们就需要对比两边的文件做diff,但是这是在两个不同的机器上,无法做diff。如果我们做diff,就要把一个文件传到另外一台机器上,但是这样以来,我们就传了整个文件,这就我们的初衷相背了。于是我们就像一个办法,让它们两边的文件见不到面,但还能知道它们有什么不同。这就是rsync的算法
二、安装步骤
准备环境:
rsync服务端:192.168.242.176
rsync客户端:192.168.242.177
1.服务端操作
- 检查是否安装xinetd、rsync:
- 修改xinetd配置文件 vim /etc/xinetd.d/rsync(centos7默认没有)
service rsync
{
disable = no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
- 修改配置文件(vim /etc/rsyncd.conf)
[test]
path = /test --本地共享目录
auth user = user1 --指定用户同步
secrets file = /etc/rsyncd.secrets --指定保存用户密码文件
- 启动服务
systemctl restart xinetd
- 创建用户密码文件(与模块中路径一样)
vim /etc/rsyncd.secrets
- 设置安全用户文件的权限,不能被其他人查看
chmod 600 /etc/rsyncd.secrets
- 创建共享目录(与模块中定义的路径一样!!!)
mkdir /test
touch /test/file{1..10}
2.客户机
- 测试检验文件是否存在
二、inotify+rsync架构实现实时同步
环境说明:
要求node1主机上面的/node1目录发生新的创建,移动,以及文件属性信息发生改变,自动同步到node2主机的/node2目录
node1主机:客户机–>192.168.242.177
node2主机:服务端–>192.168.242.176
- 客户机(node1)安装inotify http://mirrors.yangxingzhen.com/inotify-tools/inotify-tools-3.14.tar.gz
- 解压
- 编译
./configure
make&&make install
- 编写脚本
vim /tmp/1.sh
#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,create,move,delete,attrib /node1 |while read events
do
rsync -a --delete /node1 192.168.242.176::test
echo "`date +'%F %T'` 出现事件 $events" >>/tmp/rsync.log 2>&1
done
- 新建node1目录并创建5个文件
- 对服务端修改配置文件
vim /etc/rsync.conf
[test]
path = /node2/
comment=rsync
- 新建node2目录(没有东西)
- 测试(在客户机[node1]端执行脚本并且放在后台执行,并且创建文件,再看tmp下面是否有创建文件后脚本执行报的日志信息)
- 在服务端(node2)检查验证(客户机创建的文件实时同步过来到服务端上面)
三、inotify+sersync实现多台服务器实时同步
inotify+rsync在同步的时候只同步发生变化的文件和目录(对目录数量不大),但是对于数据量大的而言,某些文件会被遗落。
环境部署:
sersync服务端–>192.168.242.178
rsync服务端–>192.168.242.176
rsync客户机–>192.168.242.177
- 部署rsync服务(两端都需要)
vim /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
motd file = /etc/rsyncd.Motd
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
uid = root
gid = root
read only = false
secrets file = /etc/rsyncd.secrets
auth user = wlx
transfer logging=no
list=no
use chroot = no
read only=no
---同步模块
[bbs]
comment = bbs by www
path = /var/www/html/bbs
[blog]
comment = blog by www
path = /var/www/html/blog
- 创建待同步的目录
mkdir -p /var/www/html/bbs /var/www/html/blog
tree /var/www/html
- 查询相关权限认证(若没有权限需配置!!!)
cat /etc/rsyncd.password
ll /etc/rsyncd.password
- 启动raync进程
rsync --daemon
ps -ef|grep rsync
netstat -tunpl|grep :873
- 配置开机自启动
echo "/usr/bin/rsync --daemon">>/etc/rc.local
grep demoan /etc/rc.local
- sersync服务端配置rsync权限—>192.168.242.178
- 分别创建待同步数据
touch /var/www/html/bbs/bbs.log /var/www/html/blog/blog.log
tree /var/www/html/
- 执行同步命令(需要关闭防火墙)
rsync -avz /var/www/html/bbs/ wlx@192.168.242.176::bbs/ --password-file=/etc/rsyncd.secrets
rsync -avz /var/www/html/bbs/ wlx@192.168.242.177::bbs/ --password-file=/etc/rsyncd.secrets
rsync -avz /var/www/html/blog/ wlx@192.168.242.176::blog/ --password-file=/etc/rsyncd.secrets
rsync -avz /var/www/html/blog/ wlx@192.168.242.177::blog/ --password-file=/etc/rsyncd.secrets
- 同步完去两台rsync检验是否同步文件
- 安装sersync软件
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86 /usr/local/sersync
tree /usr/local/sersync/
├── confxml.xml
└── sersync2
规范sersync目录结构(非必须)
cd /usr/local/sersync/ && mkdir conf bin logs
mv confxml.xml ./conf/. && mv sersync2 ./bin/sersync
tree /usr/local/sersync
├── bin
│ └── sersync
├── conf
│ └── confxml.xml
└── logs
- 备份配置文件
/bin/cp conf/confxml.xml conf/confxml.xml.luo.$(date +%F)
- 编辑配置文件
vim /usr/local/sersync/conf/confxml.xml
- 开启sersync守护进程同步数据
echo 'export PATH=/usr/local/sersync/bin:$PATH'>>/etc/profile
tail -1 /etc/profile
source /etc/profile
which sersync
- 启动sersync
sersync -r -d -o /usr/local/sersync/conf/confxml.xml
实验发现在多模块下只同步第一模块,其他模块路径不同步。解决办法就是将config文件中的模块分开放置
cp confxml.xml blog_confxml.xml
cp confxml.xml bbs_confxml.xml
mv confxml.xml ~
- 测试
sersync –d –o /usr/local/serysnc/conf/confxml_bbs.xml
sersync –d –o /usr/local/serysnc/conf/confxml_blog.xml
设置自启 vim /etc/rc.local