场景
近期因公司业务,部署某头部酒业的服务器。沟通得知,服务器网络可能存在不稳定的情况。计划每台服务器均部署文件上传服务和数据库,mysql多主多从实现数据同步。首先需解决文件同步的问题,此处采用rsync + inotify实现文件同步。
服务器如下:
- 192.168.77.2 #02服务器
- 192.168.77.5 #05服务器
- 192.168.77.6 #06服务器
计划在3台服务器上都有文件上传服务,目录为/data/dfs/upload,upload下创建02,05,06目录
02服务器实际上传地址为upload 下的02目录,同时同步05服务器的02目录,同步06服务器的02目录。
05服务器实际上传地址为upload 下的05目录,同时同步02服务器的05目录,同步06服务器的05目录。
06服务器实际上传地址为upload 下的06目录,同时同步02服务器的06目录,同步05服务器的06目录。
通过rsync最终在三台服务器各自访问自己的upload目录,均可访问到图片等文件资源。
以下操作三台服务器均需操作
1.新建rsync用户
useradd rsync_brew
passwd rsync_brew //设置密码(a123456)
2.安装rsync
#安装rsync
yum install -y rsync
3.配置rsync各文件
- rsyncd.conf 为 配置文件
- rsync.pass 访问其他服务器的密码(三台密码都是a123456,一个文件即可)
- rsync.password 本机的rsync用户密码
3.1 rsyncd.conf
此处示例是02服务器,02服务器配置dfs05和dfs06,05服务器配置dfs02和dfs06,06服务器配置dfs02和dfs05
# /etc/rsyncd.conf
fake super = yes
strict modes = no
uid = rsync_brew
gid = rsync_brew
use chroot = no
max connections = 200
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore error
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
read only = no
list = false
hosts allow = 192.168.77.0/24
#hosts allow = 0.0.0.0/32
auth users = rsync_brew
secrets file = /etc/rsync.password
[dfs05]
path = /data/dfs/upload/05
comment = dfs upload 05
[dfs06]
path = /data/dfs/upload/06
comment = dfs upload 06
3.2 rsync.pass
# /etc/rsync.pass
a123456
3.3 rsync.pass授权
chmod 600 /etc/server.pass
3.4 rsync.password
# /etc/rsync.password
rsync_brew:a123456
4.upload目录授权
chown -R rsync_brew /data/dfs/upload
5.启动rsync
#杀死进程
kill $(cat /var/run/rsyncd.pid)
#检查一下服务是否已被终止
netstat -natp | grep rsync
#再次开启服务并检查端口号确认
rsync --daemon
6.安装inotify
6.1 优化内核参数
vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
# 从配置文件/etc/sysctl.conf加载内核参数设置
sysctl -p
6.2 安装inotify
下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
上传至 /opt
#安装gcc gcc-c++
yum install -y gcc gcc-c++
cd /opt
rz
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make -j 4 && make install
6.3 编写shell (/opt/inotify.sh)
监听02服务器的upload/02目录,同步到05服务器的02目录和06服务器的02目录。05和06服务器类似操作,相应修改。password-file指定密码文件,[dfs02]对应05和06服务器上的/etc/rsyncd.conf中的模块名[dfs02]
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /data/dfs/upload/02/"
RSYNC_CMD05="rsync -azlH --delete --password-file=/etc/rsync.pass /data/dfs/upload/02/ rsync_brew@192.168.77.5::dfs02/"
RSYNC_CMD06="rsync -azlH --delete --password-file=/etc/rsync.pass /data/dfs/upload/02/ rsync_brew@192.168.77.6::dfs02/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 2 ] ; then
$RSYNC_CMD05
$RSYNC_CMD06
fi
done
6.4 执行脚本
# 脚本授权
chmod +x /opt/inotify.sh
#设置开机自启动
chmod +x /etc/rc.d/rc.local
echo "/opt/inotify.sh" >> /etc/rc.d/rc.local
#执行脚本
cd /opt
nohup sh -x /opt/inotify.sh &
7 实验
#02服务器
cd /data/dfs/upload/02
touch 02.txt
02服务器如下
05服务器如下
06服务器如下
至此,02、05、06服务器之间实现文件同步。