这个方案通过 Nginx 作为负载均衡器,Rsync 结合 Inotify 实现多服务器间的文件同步,确保后端服务器的内容一致性。
在负载均衡服务器上配置 Nginx:
http {
upstream backend {
# 配置后端服务器
server backend1.example.com weight=5;
server backend2.example.com;
server backend3.example.com;
# 负载均衡策略
# least_conn; # 最少连接
# ip_hash; # IP哈希
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
在主服务器上配置文件同步:
# CentOS/RHEL
yum install rsync inotify-tools -y
# Ubuntu/Debian
apt-get install rsync inotify-tools -y
编辑 /etc/rsyncd.conf
:
uid = root
gid = root
use chroot = no
max connections = 10
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[webdata]
path = /path/to/webroot
comment = Web Content
read only = no
hosts allow = 192.168.1.0/24
hosts deny = *
list = yes
auth users = rsyncuser
secrets file = /etc/rsyncd.secrets
创建认证文件 /etc/rsyncd.secrets
:
rsyncuser:password123
设置权限:
chmod 600 /etc/rsyncd.secrets
启动 Rsync 服务:
rsync --daemon
创建同步脚本 /usr/local/bin/inotify_rsync.sh
:
#!/bin/bash
# 定义变量
SRC="/path/to/webroot/"
DEST="rsyncuser@backend1.example.com::webdata"
# 可以添加多个目标服务器
DEST2="rsyncuser@backend2.example.com::webdata"
DEST3="rsyncuser@backend3.example.com::webdata"
# 设置密码文件
PASSFILE="/etc/rsyncd.secrets"
# 确保inotifywait可用
if ! which inotifywait &>/dev/null; then
echo "inotifywait command not found!"
echo "Please install inotify-tools first."
exit 1
fi
# 监控事件
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e' \
-e modify,delete,create,attrib,move ${SRC} | while read DATE TIME FILEPATH EVENT
do
# 同步到所有目标服务器
rsync -avz --delete --password-file=${PASSFILE} ${SRC} ${DEST}
rsync -avz --delete --password-file=${PASSFILE} ${SRC} ${DEST2}
rsync -avz --delete --password-file=${PASSFILE} ${SRC} ${DEST3}
# 记录日志
echo "At ${TIME} on ${DATE}, file ${FILEPATH} was ${EVENT}" >> /var/log/inotify_rsync.log
done
设置脚本可执行:
chmod +x /usr/local/bin/inotify_rsync.sh
在每个后端服务器上配置 Rsync 客户端:
# CentOS/RHEL
yum install rsync -y
# Ubuntu/Debian
apt-get install rsync -y
echo "password123" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
crontab -e
添加以下内容(每小时同步一次):
0 * * * * rsync -avz --delete --password-file=/etc/rsyncd.secrets rsyncuser@master.example.com::webdata /path/to/webroot/
在主服务器上启动监控脚本:
nohup /usr/local/bin/inotify_rsync.sh > /dev/null 2>&1 &
或者创建 systemd 服务:
# /etc/systemd/system/inotify_rsync.service
[Unit]
Description=Inotify Rsync Service
After=network.target
[Service]
ExecStart=/usr/local/bin/inotify_rsync.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target
然后启用服务:
systemctl daemon-reload
systemctl enable inotify_rsync
systemctl start inotify_rsync
/var/log/inotify_rsync.log
和 /var/log/rsyncd.log
确认同步状态--bwlimit
参数限制同步带宽--exclude
参数排除不需要同步的文件这个方案实现了基于文件内容同步的负载均衡系统,适用于需要多台服务器内容一致的应用场景。