应用场景:
公司后端有两台nginx服务器,因还在测试阶段。故开发经常需要更新web程序,而每次更新都需要上传两次。现在两台web服务器还好。如果以后随着业务量的增长,4、5台的时候还需要挨个上传就有点苦逼了。故我打算使用rsync+inotify组合来实现服务器的数据时时同步。
rsync介绍:
rsync是linux/UNIX系统下的文件同步和数据传输工具,采用rsync算法使一个客户机和远程文件服务器之间的文件同步。通过rsync可以将同一个服务器的数据从一个分区备份到另一个分区,也可以将本地系统的数据通过网络传输方式备份到任何一个远程主机上,rsync可以在中断之后恢复传输,只传输源文件和目标文件之间不一致的部分,可以执行完整备份或增量备份。rsync有shell(本地模式)、远程shell、查询(列表,与ls命令实现的功能类似)、和服务器模式。
rsync的功能特性:
可以镜像保存整个目录树和文件系统。
可以增量同步数据,文件传输效率高,因此同步时间很短
可以保持原有文件的权限、时间等属性
加密传输数据,保证数据的安全性
可以使用rcp、ssh等方式来传输文件,也可以直接通过Socket连接传输文件
支持匿名传输
一、rsync的安装:
我需要两台web服务器之间的数据时时同步,10.171.22.124向10.172.186.241同步。因此,124称为客户端,241称为服务端。
1.1 服务端安装:
使用yum安装和源码安装都可,我选择源码。
cd /usr/local/src
wget https://download.samba.org/pub/rsync/src/rsync-3.0.4.tar.gz
tar -zxvf rsync-3.0.4.tar.gz
cd rsync-3.0.4
./configure --prefix=/usr/local/rsync
make && make install
mkdir /etc/rsyncd
touch /etc/rsyncd/rsyncd.conf #rsync安装之后要手动创建配置文件和验证密码文件
touch /etc/rsyncd/rsyncd.secrets
chmod 600 /etc/rsyncd/rsyncd.conf #密码文件的权限要设置成600,如果不设置成600,那么客户端连接验证密码时将会提示验证失败。这里一定要注意。到这里安装完成。下面是配置。
1.2 配置服务端:
vim /etc/rsyncd/rsyncd.conf #编辑rsync主配置文件
pid file = /var/run/rsyncd.pid
uid = root
gid = root
use chroot = yes ##是否限制在指定目录,为了安装,一般需要启用
read only = no
hosts allow = 10.171.22.124
max connections = 5
log file = /var/log/rsync.log
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[web1]
path = /data/wwwroot
list=yes
ignore errors
auth users = webuser
secrets file = /etc/rsyncd/rsyncd.secrets
comment = web home
vim /etc/rsyncd/rsyncd.secrets #编辑密码文件
webuser:123456 #服务端的密码文件格式是用户名:密码
加入开机启动
echo "/usr/local/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf" >>/etc/rc.local
1.3 创建同步用的帐号并设置密码
useradd webuser
passwd webuser
1.4 启动rsync
/usr/local/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
ps -elf |grep rsync #验证是否启动成功
5 S root 15707 1 0 80 0 - 26905 poll_s 11:06 ? 00:00:00 rsync --daemon --config=/etc/rsyncd/rsyncd.conf
至此,服务端的配置就结束了。下面安装配置客户端
传统的rsync是通过crontab定时执行rsync命令来进行同步的,这样就不能保证数据的实时性,因此,必须借助inotify这个软件来监控客户端上的文件变化,只要inotify监测到了客户端文件的变化,那么就执行rsync来进行同步。
一、安装rsync与inotify-tools
rsync和服务端的安装一样,这里就不写了。直接安装inotify并配置。只不过rsync不需要写配置文件了。因为inotify是通过脚本来调用rsync命令连接到服务端同步。由于inotify的特性需要linux内核的支持,在安装inotify-tools前要先确认linux系统内核是否是2.6.13版本以上。
uname -r #显示核心版本号
ls -l /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Jun 30 12:41 max_queued_events
-rw-r--r-- 1 root root 0 Jun 30 12:41 max_user_instances
-rw-r--r-- 1 root root 0 Jun 30 12:41 max_user_watches
#有上面这三项输出则表示当前内核支持inotify
tar -zxvf
wget http://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz
tar -zxvf inotify-tools-3.13.tar.gz
cd inotify-tools-3.13
./configure
make && make install
#安装完成后会在/usr/local/bin目录下生成inotifywait和inotifywatch两个命令。inotifywait可以监控任何文件和目录设置,并且可以递归的监控整个目录树,inotifywatch用于收集被监控的文件系统的统计数据。比如每个inotify事件发生多少次等信息。
ls -l /usr/local/bin/inotify*
-rwxr-xr-x 1 root root 38598 Jul 2 17:48 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 40361 Jul 2 17:48 /usr/local/bin/inotifywatch
安装完成
二、配置inotify
2.1编辑密码文件
vim /etc/rsyncd/rsync.secrets #输入服务端同步的用户密码即可。
chmod 600 /etc/rsyncd/rsync.secrets #设置权限
2.2
编辑脚本文件
vim /data/wwwroot/inotifyscript.sh #脚本放到要同步的目录下。
#!/bin/bash
host=10.172.186.241
src=/data/wwwroot/
dst=web1
user=webuser
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.secrets $src $user@$host::$dst
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
下面对脚本内容简单讲解
host是服务端的IP地址,如果有多个,依次写上。
src是客户端要同步给服务端的目录。
dfs是服务端rsyncd.conf中配置的web1段。
user是服务端rsyncd.conf中配置的同步用户
--timefmt指定时间的输出格式。
--format指定变化文件的详细信息。
这个脚本的作用就是通过inotify监控文件目录的变化,发现文件有变化,进而出发rsync进行同步操作。
2.2 给脚本可执行的权限并加入开机启动
chmod +x /data/wwwroot/inotifyscript.sh
echo "/data/wwwroot/inotifyscript.sh $" >>/etc/rc.local
至此,inotify就配置好了。现在可以进行同步验证了。你可以分别创建文件和目录,修改文件内容、属性权限等。然后观察服务端目录下的文件是否同步。
转载于:https://blog.51cto.com/gouyc/1670589