背景
新公司需要我做代码发布的活, 一开始觉得没什么, 不就是把文件丢上去重启一下服务就好了嘛. 结果每天发布的次数可以达到十几次. 像 nodejs 的, 有 3 台服务器, 每次都要传 3 次, 然后做 3 次重启操作. 大好的青春不能浪费在这上面, 于是动了文件同步的心思.
网上说当同步的目录数据量不大时, 建议使用 Rsync+Inotify-tools; 当数据量很大(几百 G 甚至 1T 以上), 文件很多时, 建议使用 Rsync+sersync. 于是直接上 Rsync+sersync
简介
1. 什么是 Rsync?
Rsync(Remote Synchronize)是一款开源的, 快速的, 多功能的, 可以实现全量及增量的本地或远程数据同步备份的优秀工具, 并且支持多种操作系统平台运行.
官网文档: https://rsync.samba.org/ftp/rsync/rsync.html
2.Rsync 简介
Rsync 具有本地与远程两台主机之间的数据快速复制同步镜像, 远程备份等功能, 该功能类似 scp, 但是优于 scp 功能, 还具有本地不同分区目录之间全量及增量复制数据.
Rsync 同步数据镜像时, 通过 "quick check" 算法, 仅同步大小或最后修改时间发生变化的文件或目录, 当然也可以根据权限, 属主等属性变化的同步, 所以可以实现快速同步.
rsync 具有如下的基本特性:
可以镜像保存整个目录树和文件系统
可以很容易做到保持原来文件的权限, 时间, 软硬链接等
无须特殊权限即可安装
优化的流程, 文件传输效率高
可以使用 rsh,ssh 方式来传输文件, 当然也可以通过直接的 socket 连接
支持匿名传输, 以方便进行网站镜象
3.Rsync 命令格式
本地: rsync [OPTION...] SRC... [DEST]
通过 shell 远程访问:
拉取: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推送: rsync [OPTION...] SRC... [USER@]HOST:DEST
通过 rsync 守护进程访问:
拉取: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推送: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
4. 什么 Sersync?
sersync 是基于 Inotify 开发的, 类似于 Inotify-tools 的工具;
sersync 可以记录下被监听目录中发生变化的 (包括增加, 删除, 修改) 具体某一个文件或某一个目录的名字;
rsync 在同步的时候, 只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的, rsync 在遍历查找比对文件时, 速度很快), 因此, 效率很高;
注: 当同步的目录数据量不大时, 建议使用 Rsync+Inotify-tools; 当数据量很大(几百 G 甚至 1T 以上), 文件很多时, 建议使用 Rsync+sersync.
Rsync 安装及配置
环境
ip | 系统版本 | 关系 |
---|---|---|
192.168.153.12 | CentOS6.9 | 源服务器 |
192.168.153.13 | CentOS6.9 | 目标服务器 |
目的
把 192.168.153.12 这台源服务器上的 / home/nodejs / 目录实时同步到 192.168.153.13 目标服务器上的 /home/nodejs .
具体操作
前提: 两台机器都要关闭 selinux,iptables.
在目标服务器 192.168.153.13 上操作.
- # 安装 rsync,xinetd.CentOS 下使用 xinetd 管理 rsync
- yum install rsync xinetd -y
- # 编辑 rsync 文件, 设置 rsync 开机启动
- vim /etc/xinetd.d/rsync
disable = no 改为 disable = yes
- # 启动 xinetd 服务的同时, rsync 也启动了.
- /etc/init.d/xinetd start
- chkconfig xinetd on
- # 创建测试文件夹
- mkdir -p /home/nodejs
- # 创建 rsync 配置文件
- vim /etc/rsyncd.conf
- # 日志文件
- log file = /var/log/rsyncd.log
- #pid 文件
- pidfile = /var/run/rsyncd.pid
- # 锁文件
- lock file = /var/run/rsync.lock
- # 密码文件
- secrets file = /etc/rsync.pass
- # 自定义一个名称, 认证模块名
- [nodejs]
- # 要同步的目录
- path = /home/nodejs/
- # 注释, 要与自定义名称一致
- comment = nodejs
- # 设置 rsync 运行权限
- uid = root
- gid = root
- # 默认端口
- port=873
- # 如果 "use chroot" 指定为 true, 那么 rsync 在传输文件以前首先 chroot 到 path 参数所指定的目录下. 这样做的原因是实现额外的安全防护, 但是缺点是需要以 root 权限, 并且不能备份指向外部的符号连接所指向的目录文件. 默认情况下 chroot 值为 true. 但是这个一般不需要, 我选择 no 或 false
- use chroot = no
- # 是否允许可读可写
- read only = no
- # 是否允许列表
- list = no
- # 最大连接数
- max connections = 200
- # 超时时间
- timeout = 600
- # 认证的用户名
- auth users = xx
- # 允许访问的 ip, 可填写 192.168.153.0/24
- hosts allow = 192.168.153.12
- # 默认的, 不要动了.
- hosts deny = 0.0.0.0/32
- # 创建用户认证文件
- vim /etc/rsync.pass
- # 格式, 用户名: 密码 , 可以设置多个, 每行一个
- xx:abc123
- # 设置文件权限
- chmod 600 /etc/rsyncd.conf
- chmod 600 /etc/rsync.pass
- # 启动 rsync
- /etc/init.d/xinetd restart
在源服务器 192.168.153.12 上操作
- # 安装 rsync,xinetd.CentOS 下使用 xinetd 管理 rsync
- yum install rsync xinetd -y
- # 编辑 rsync 文件, 设置 rsync 开机启动
- vim /etc/xinetd.d/rsync
disable = no 改为 disable = yes
- # 启动 xinetd 服务的同时, rsync 也启动了.
- /etc/init.d/xinetd start
- chkconfig xinetd on
- # 创建测试文件夹
- mkdir -p /home/nodejs
- # 创建密码认证文件
- vim /etc/passwd.txt
- # 源服务器就只设置密码, 不需要填用户
- abc123
- # 设置权限
- chmod 600 /etc/passwd.txt
- # 测试源服务器 192.168.153.12 到目标服务器 192.168.153.13 的数据同步
- # 在 / home/nodejs / 目录下准备这些文件
- [root@cs6 nodejs]# ls
xxx0 xxx1 xxx2 yy0 yy1 yy2
- rsync -avH --port=873 --progress --delete /home/nodejs/ xx@192.168.153.13::nodejs --password-file=/etc/passwd.txt
- # 然后到目标服务器 192.168.153.13 /home/nodejs 目录下查看是否同步了这些文件夹, 如果有, rsync 同步完成.
sersync 安装及配置
在源服务器上操作.
- # 查看服务器内核是否支持 inotify, 其实这一步可以省略, 基本没有不通过的
- ll /proc/sys/fs/inotify
- total 0
- -rw-r--r-- 1 root root 0 May 23 16:11 max_queued_events
- -rw-r--r-- 1 root root 0 May 23 16:11 max_user_instances
- -rw-r--r-- 1 root root 0 May 23 16:11 max_user_watches
- # 修改 inotify 参数, 默认内核参数值太小
- vim /etc/sysctl.conf
- #inotify
- fs.inotify.max_queued_events=99999999
- fs.inotify.max_user_watches=99999999
- fs.inotify.max_user_instances=65535
参数说明:
max_queued_events:
inotify 队列最大长度, 如果值太小, 会出现 "** Event Queue Overflow **" 错误, 导致监控文件不准确
max_user_watches:
要同步的文件包含多少目录, 可以用: find /home/www.osyunwei.com -type d | wc -l 统计, 必须保证 max_user_watches 值大于统计结果(这里 / home/www.osyunwei.com 为同步文件目录)
max_user_instances:
每个用户创建 inotify 实例最大值
# 安装 sersync
http://sersync.sourceforge.net/ 软件官网
下载需要 ×××, 我给上传到百度云了, 欢迎下载.
链接: https://pan.baidu.com/s/1-NcvYkyWBb7k3Gln8KZxlA 密码: ovd9
把 sersync2.5.4_64bit_binary_stable_final.tar.gz 上传到 /usr/src / 目录下.
- cd /usr/src/
- tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
- mv GNU-Linux-x86//usr/local/sersync
- # 配置 sersync
- cd /usr/local/sersync/
- [root@cs6 sersync]# ls
- confxml.xml sersync2
- # 编辑 xml 文件, 先备份
- cp confxml.xml{,.bak20180523}
- vim confxml.xml
- 24 <sersync>
- 25 <localpath watch="/home/nodejs/">
- 26 <remote ip="192.168.153.13" name="nodejs"/>
- 32 <auth start="true" users="xx" passwordfile="/etc/passwd.txt"/>
- 38 <crontab start="true" schedule="600"><!--600mins-->
参数说明:
- localpath wath="/home/nodejs" #源服务器同步目录
- <remote ip="192.168.153.13" name="nodejs"/> # 目标服务器 ip, 同步模块
- <auth start="true" users="xx" passwordfile="/etc/passwd.txt"/> # users="xx" #使用 xx 去同步
- passwordfile="/etc/passwd.txt" #使用的目标服务器密码文件为
- start="true" schedule="600"
设置为 true, 每隔 600 分钟全盘同步一次
- # 设置开机启动
- vim /etc/rc.d/rc.local
- /usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
- # 添加监控脚本
- vim /home/check_sersync.sh
- #!/bin/bash
- sersync="/usr/local/sersync/sersync2"
- confxml="/usr/local/sersync/confxml.xml"
- status=$(ps aux|grep 'sersync2'|grep -v grep|wc -l)
- if [[ $status -eq 0 ]]; then
$sersync -d -r -o $confxml &
- else
- exit 0;
- fi
- # 添加执行权限
- chmod +x /home/check_sersync.sh
- # 设置定时任务
- crontab -e
- # 每隔两分钟执行一次
- */2 * * * */bin/bash /home/check_sersync.sh> /dev/null 2>&1
- # 重启定时任务
- /etc/init.d/crond restart
测试同步
在源服务器上 /home/nodejs/ 下放置一个 redis 的安装包及解压包.
- ls -l
- total 1628
- drwxrwxr-x 6 root root 4096 Dec 18 2015 redis-3.0.6
- -rw-r--r-- 1 root root 1372648 May 8 17:52 redis-3.0.6.tar.gz
等两分钟以后去目标服务器 /home/nodejs 下查看文件是否正常同步.
正常同步, 说明配置成功了.
来源: http://blog.51cto.com/fsckyl/2119704