一. rsync同步简介
1.1 rsync的意义
解决源网站代码更新而节点服务器进行自动更新,无需人工一个一个
节点站点更新的庞大工作量
1.2 rsync的简介
- Remote Sync:远程同步
- 支持本地复制,或者与其他SSH,rsyncz主机同步
- 官网:http://rsync.samba.org
二. 配置rsync
2.1 配置rsync源
- 建立rsyncd.com配置文件
- 需要手动建立,语法类似于samba配置
- 认证配置auth users,secrets,不加则为匿名
vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
address = 12.0.0.10
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 12.0.0.0/24
[wwwroot]
path = /var/www/html
comment = www.kgc.cn
read only = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
auth users = backuper
secrets file = /etc/rsyncd_users.db
- 独立账号文件
- 采用"用户名:密码" 的记录格式,每行一个用户记录
- 独立的账号数据,不依赖于系统账号
vim /etc/rsyncd_users.db
backuper:abc123
chmod 600 /etc/rsyncd_users.db
- 启动rsync服务
启动服务
rsync --daemon
查看状态c
netstat -ntap | grep rsync
- 通过–daemon独自提供服务
2.2配置rsync同步源(备份源)
- 语法
- rsync [选项] 原始位置 目标位置
原始位置的格式- 格式1: 用户名@主机地址::共享模块名
rsync -avz backuper@12.0.0.12::wwwroot /opt/
- 格式2: rsync://用户名@主机地址/共享模块名
rsync -avz rsync://backuper@12.0.0.12/wwwroot/opt/
- 常用选项
-a:归档模式,递归并保留对象属性
-v:显示同步过程的详细信息
-z:在传输文件时进行压缩(compress)
-H:保留硬链接文件
-A:保留ACL属性信息
–delete:删除目标位置有而原始位置没有的文件
–checksum:根据对象的校验和来决定是否跳过文件 - 免交互设置
- 设置密码文件
vim /etc/server.pass
abc123
chmod 600 /etc/server.pass
- 使用 --password-file=密码文件
rsync -az --delete --password-file=/etc/server.pass backuper@12.0.0.12::wwwroot /opt
三. rsync + inotify 实时同步
3.1 linux内核的inotify机制
- 从版本2.6.13开始提供
- 可以监控文件系统的变化情况,并作出通知响应
- 辅助软件:inotify-tools
3.2 调整inotify内核参数
3.3 安装 rsync-tools辅助工具
- -m,持续进行监控
- -r ,递归监控所有子对象
- -q ,简化输出信息
- -e ,指定要监控哪些事件类型
3.4 通过inotifywait触发rsync同步操作
四. 案例设计
线网环境需要远程同步的原因 1: 内容的一致性 1000 节点 tomcat 网站 (HTML,CSS,JS)
2:网站内容更新 scp 1000次 shell 脚本自动执行、
3: 解决问题:rsync出现 只需要更新一个节点,其他所有节点内容同步
作用:拉取同步
监控:inotify
4.1 rsync + inotify 架构的设计
同步源: 12.0.0.12 搭建rsync,配置/etc/rsyncd.conf 站点目录:/pei
发起源: 12.0.0.28 站点目录:/var/www/html
后端服务器:12.0.0.1 搭建rsync,配置/etc/rsyncd.conf 站点目录:/var/www/html
构建思想:在服务器12.0.0.28中通过监控/pei 站点目录的变化,上传同步信息给12.0.0.12,同时
在12.0.0.12通过监控/var/www/html/ 站点的变化,上传同步信息给12.0.0.1,这样就能构保证三
个服务器的站点目录保持一致,同时可以通过修改12.0.0.28服务器就可以实现所有服务器的站点同步
4.2 同步源 12.0.0.12 服务器的/etc/rsyncd.conf
use chroot = yes
address = 12.0.0.12
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 12.0.0.0/24
[wwwroot]
path = /var/www/html
comment = www.peihua.cn
read only = no
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
auth users = backuper
secrets file = /etc/rsyncd_users.db
注意两个点:1. read only = no 设置成no
2.站点目录/var/www/html/ 的权限设置成777
4.3 后端服务器:12.0.0.1
搭建rsync,配置/etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
address = 12.0.0.1
port 873
hosts allow = 12.0.0.0/24
[wwwroot]
path = /var/www/html
comment = www.kgc.cn
read only = no
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
auth users = backuper
secrets file = /etc/rsyncd_users.db
注意两个点:1. read only = no 设置成no
2.站点目录/var/www/html/ 的权限设置成777
4.4 在12.0.0.28上传同步信息给12.0.0.12的脚本信息为
[root@mysql3 opt]# vim inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /pei/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pss /pei/ backuper@12.0.0.12::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT PILE
do
if [ $(pgrep rsync | wc -l) -le 0 ]
then
$RSYNC_CMD
fi
done
4.5 在12.0.0.12上传同步信息给12.0.0.1的脚本信息为
[root@mysql3 opt]# vim inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pss /var/www/html/ backuper@12.0.0.1::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT PILE
do
if [ $(pgrep rsync | wc -l) -le 1 ]
then
$RSYNC_CMD
fi
done
注意点:因为12.0.0.12服务器中已经开启了rsync服务所以,”pgrep rsync | wc -l ”在没有
改变的转态就已经为1,所以 if [ $(pgrep rsync | wc -l) -le 1 ],如果-le 0 是永远都不会执行