CentOS配置多服务器实现代码同步

发布于 2021-11-24 16:52:04

1. 准备工作:

一、两台服务器【Centos7为例】:192.168.1.10(主服务器,也是代码或文件更新的服务器)192.168.1.11(从同步服务器)#多服务器道理一样

2. 所有服务器安装同步软件rsync

yum install -y rsync

3. 主服务器编辑配置文件:/etc/rsyncd.conf

#rsyncd.conf文件【/root/etc/rsyncd.conf】
motd file = /etc/rsyncd.motd
#设置服务器信息提示文件,在该文件中编写提示信息
transfer logging = yes
#开启rsync数据传输日志功能
log file = /var/log/rsyncd.log
#设置日志文件名,可通过log format参数设置日志格式
pid file = /var/run/rsyncd.pid
#设置rsync进程号保存文件名称
lock file = /var/run/rsync.lock
#设置锁文件名称
port = 21873
#设置服务器监听的端口号,默认是873
address = 192.168.1.10
#设置本服务器所监听网卡接口的ip地址
uid = nobody
#设置进行数据传输时所使用的帐户名或ID号,默认使用nobody,也可改为root
gid = nobody
#设置进行数据传输时所使用的组名或GID号,默认使用nobody,也可改为root
#若为yes, rsync会首先进行chroot设置,将根映射在下面的path参数路径下,对客户端而言,系统的根就是path参数指定的路径。但这样做需要root权限,并且在同步符号连接资料时只会同步名称,不会同步内容。
use chroot = no
read only = yes
#是否允许客户端上传数据,yes表示不允许
max connections = 0
#设置并发连接数,0表示无限制
[common]
#自定义模块名common,rsync通过模块定义同步的目录,可定义多个
comment = web content
#定义注释说明字串
path = /www/wwwroot/www.genewill.com/
#同步目录的真实路径通过path指定
ignore errors
#忽略一些IO错误
exclude = public/uploads/ runtime/ .git/
#exclude指定common目录下某个目录可以不同步数据
auth users = rsyncadmin
#设置允许连接服务器的账户,此账户可以是系统中不存在的用户
secrets file = /etc/rsyncd.secrets
#密码验证文件名,该文件权限要求为只读,建议为600,仅在设置auth users后有效
hosts allow = 192.168.1.11/255.255.255.0
#设置哪些主机可以同步数据,多ip和网段之间使用空格分隔
hosts deny=*
#除了hosts allow定义的主机外,拒绝其他所有
list = no
#客户端请求显示模块列表时,本模块名称是否显示,默认为yes

4. 主服务器:创建同步用户(比如:rsyncadmin),和配置文件rsyncd.secrets

useradd rsyncadmin
passwd rsyncadmin
输入:sync2022
echo 'rsyncadmin:sync2022' > /etc/rsyncd.secrets #写入账户密码到文件
chmod 600 /etc/rsyncd.secrets #更改权限为600
echo "Welcome to sync" > /etc/rsyncd.motd  #欢迎语
chmod a+x /etc/rc.local
echo "/usr/bin/rsync --daemon" >> /etc/rc.local    #开机启动rsync服务
firewall-cmd --zone=public --add-port=21873/tcp --permanent #添加防火墙规则,也可以宝塔添加
firewall-cmd --reload
semanage port -a -t ssh_port_t -p tcp 21873   #SElinux放行端口

5. 从服务器: 添加配置文件:

echo "sync2022" > /etc/rsyncd.secrets #客户端只需要把密码写入文件
chmod 600 /etc/rsyncd.secrets
firewall-cmd --zone=public --add-port=21873/tcp --permanent #添加防火墙规则,也可以宝塔添加
firewall-cmd --reload
semanage port -a -t ssh_port_t -p tcp 21873   #SElinux放行端口

6. 命令行测试同步:(需要通过定时任务定时执行)

BUG?不知道为什么服务端设定忽略目录无效,在客户端添加才有效
rsync -vzrtopg --progress --delete --exclude=".user.ini" --exclude=".git" --exclude="runtime" --password-file=/etc/rsyncd.secrets rsync://rsyncadmin@192.168.1.10:21873/common /www/wwwroot/www.genewill.com 
出现类似提示说明,成功了:
Welcome to sync

receiving incremental file list

sent 1,117 bytes  received 122,759 bytes  82,584.00 bytes/sec
total size is 64,553,354  speedup is 521.11

如果有多个文件夹需要忽略,可以使用文件:

vi /www/wwwroot/ignore.file
.user.ini
runtime
.git
rsync -vzrtopg --progress --delete --exclude-from='/www/wwwroot/ignore.file' --password-file=/etc/rsyncd.secrets rsync://rsyncadmin@192.168.1.10:21873/common /www/wwwroot/www.genewill.com

7. 为了实现即时同步,需要安装inotify-tools

wget -c https://github.com/inotify-tools/inotify-tools/archive/refs/tags/3.21.9.6.tar.gz
tar -xvf 3.21.9.6.tar.gz
cd inotify-tools-3.21.9.6
./autogen.sh
./configure --prefix=/usr/local
make
make install

8. 查看默认参数

1) 查看inotify默认参数

# sysctl -a | grep max_queued_events
fs.inotify.max_queued_events = 16384
# sysctl -a | grep max_user_watches
fs.inotify.max_user_watches = 8192
fs.epoll.max_user_watches = 1673768
# sysctl -a | grep max_user_instances
fs.inotify.max_user_instances = 128 

2) 修改inotify默认参数

sysctl -w fs.inotify.max_user_instances=130
or
vi /etc/sysctl.d/99-sysctl.conf
fs.inotify.max_user_instances=130

3) 参数说明
max_user_instances:每个用户创建inotify实例最大值
max_queued_events:inotify队列最大长度,如果值太小,会出现错误,导致监控文件不准确
max_user_watches:要知道同步的文件包含的目录数,可以用:

# find /www/wwwroot/www.genewill.com/ -type d|wc -l 

统计,必须保证参数值大于统计结果(/home/rain为同步文件目录)

9. 因为只能通过host主机检测文件变化,启动同步,所以需要主服务器为rsync客户端,从服务器为服务端

vi rsyncd.secrets_11 从服务器的密码文件, 如果多个服务器可以设置不同密码
vi /www/wwwroot/ignore.file
.user.ini
runtime
.git
public/uploads

注意SRC要有 / 避免是目录同步,DEST - 从服务器的配置和端口

rsync -vzrtopg --progress --delete --password-file=/etc/rsyncd.secrets_11 --exclude-from='/www/wwwroot/ignore.file' /www/wwwroot/www.genewill.com/ rsync://rsyncadmin@192.168.1.11:21873/common

10. 为了保证能自动运行,可以加入自启动:

vi /www/wwwroot/sync.sh
#!/bin/bash
#
PASSWRODFILE=/etc/rsyncd.secrets_11
EXCLUDEFILE=/www/wwwroot/ignore.file
SRCDIR=/www/wwwroot/www.genewill.com/
DESTHOST=192.168.1.11
DESTCONFIG=rsyncadmin@${DESTHOST}:21873
INOTIFYHOME=/usr/local/inotify/bin

${INOTIFYHOME}/inotifywait -mr --timefmt '%y-%m-%d %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $SRCDIR | while read DATE TIME DIR FILE; do

FILECHANGE=${DIR}${FILE}
echo $FILECHANGE
echo ${TIME} on ${DATE}

/usr/bin/rsync -vzrtopg --progress --delete --password-file=${PASSWRODFILE} --exclude-from=${EXCLUDEFILE} ${SRCDIR} rsync://${DESTCONFIG}/common

echo "${TIME} on ${DATE}, file $FILECHANGE was sync to ${DESTHOST}" >> /var/log/${DATE}_${DESTHOST}_sync.log
done

添加自启动:

chmod +x /www/wwwroot/sync.sh
echo '/www/wwwroot/sync.sh &' >> /etc/rc.local

11. 安装队列(Supervisor管理器)更新脚本后需要注意,需要配置启用php禁用函数, 否则无法启动

/usr/bin/php think queue:listen --tries=5 --queue=host1 -v

proc_open

[RuntimeException]
The Process class relies on proc_open, which is not available on your PHP installation.

12. 配置NFS(nfs server IP: 192.168.1.13):

exportfs参数参考

#服务端
yum install -y nfs-utils
systemctl enable --now nfs-server
mkdir -p /www/wwwroot/www.genewill.com/public/uploads
vi /etc/exports(注意允许网段)
/www/wwwroot/www.genewill.com/public/uploads 192.168.1.0/255.255.255.0(rw,sync,no_all_squash,no_root_squash)
#导出配置:
exportfs -ra
#添加防火墙规则
firewall-cmd --new-zone=nfs --permanent
firewall-cmd --zone=nfs --add-service=nfs --permanent
firewall-cmd --zone=nfs --add-source=192.168.1.0/24 --permanent
firewall-cmd --reload
#客户端验证:
mount -t nfs 192.168.1.13:/www/wwwroot/www.genewill.com/public/uploads /mnt
#配置到fstab,自动mount
echo "192.168.1.13:/www/wwwroot/www.genewill.com/public/uploads /www/wwwroot/www.genewill.com/public/uploads  nfs     defaults 0 0" >> /etc/fstab
0 条评论

发布
问题