实现方法
inotify + rsync:实现数据同步需要自行编写脚本组合inotify和rsync
sersync:在inotify+rsync软件基础上进行开发的,功能更强大
工作原理
利用监控服务inotify,监控同步数据服务器目录中信息的变化,发现数据变化,就利用rsync服务推送到备份服务器
inotify
异步的文件系统事件监控机制。linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件。
一个动作不等于只发生一个事件。
[root@wenzi ~]$grep -i inotify /boot/config-4.18.0-193.el8.x86_64
CONFIG_INOTIFY_USER=y
软件
- inotify-tools
- sersync
- lrsyncd
查看内核是否支持inotify
[root@wenzi ~]$ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Feb 3 16:41 max_queued_events
-rw-r--r-- 1 root root 0 Feb 3 16:41 max_user_instances
-rw-r--r-- 1 root root 0 Feb 3 16:41 max_user_watches
[root@wenzi ~]$cat /proc/sys/fs/inotify/max_queued_events
16384
[root@wenzi ~]$cat /proc/sys/fs/inotify/max_user_instances
128
[root@wenzi ~]$cat /proc/sys/fs/inotify/max_user_watches
8192
max_queued_events
inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误。建议调大,如 327679
max_user_instances
每个用户创建 inotify实例最大值,默认值:128
max_user_watches
可以监视的文件的总数量(inotifywait 单进程)。建议调大,如 100000
[root@data-centos8 ~]#vim /etc/sysctl.conf
fs.inotify.max_queued_events=66666
fs.inotify.max_user_watches=100000
[root@centos8 ~]#sysctl -p
fs.inotify.max_queued_events = 66666
fs.inotify.max_user_watches = 100000
[root@centos8 ~]#cat /proc/sys/fs/inotify/*
66666
128
100000
inotify-tools工具
需要安装epel源
主要工具
notifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,
常用于实时同步的目录监控
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
命令
inotifywait 选项 文件
选项
-m, --monitor 始终保持事件监听
-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive 递归监控目录数据信息变化
-q, --quiet 输出少量事件信息
--exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
--excludei <pattern> 和exclude相似,不区分大小写
-o, --outfile <file> 打印事件到文件中,相当于标准正确输出,注意:使用绝对路径
-s, --syslogOutput 发送错误到syslog相当于标准错误输出
--timefmt <fmt> 指定时间输出格式。
--format <fmt> 指定的输出格式;即实际监控输出内容。
-e 指定监听指定的事件,如果省略,表示所有事件都进行监听。
其中 --timefmt 时间格式:man 3 strfime
如 --timefmt "%Y-%m-%d %H:%M:%S"
%Y 年份信息,包含世纪信息
%y 年份信息,不包括世纪信息
%m 显示月份,范围 01-12
%d 每月的第几天,范围是 01-31
%H 小时信息,使用 24小时制,范围 00-23
%M 分钟,范围 00-59
%S 秒,范例 0-60
其中 --format 时间格式:
如 --format "%T %w%f event: %;e"
%T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
%w 事件出现时,监控文件或目录的名称信息,相当于dirname
%f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename
%e 显示发生的事件信息,不同的事件默认用逗号分隔
%Xe 显示发生的事件信息,不同的事件指定用X进行分隔
其中 -e 选项指定的事件类型。
如 -e create,delete,attrib,move,close_write
create 文件或目录创建
delete 文件或目录被删除
modify 文件或目录内容被写入
attrib 文件或目录属性改变
close_write 文件或目录关闭,在写入模式打开之后关闭的
close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
close 文件或目录关闭,不管读或是写模式
open 文件或目录被打开
lsdir 浏览目录内容
moved_to 文件或目录被移动到监控的目录中
moved_from 文件或目录从监控的目录中被移动
move 文件或目录不管移动到或是移出监控目录都触发事件
access 文件或目录内容被读取
delete_self 文件或目录被删除,目录本身被删除
unmount 取消挂载
示例
监控一次性事件
inotifywait /data/www
Setting up watches.
Watches established.
/data/www/ CREATE f1.txt
持续前台监控
inotifywait -mrq /data/www --exclude=".*\.swx|\.swp"
/data/www/ OPEN f1.txt
/data/www/ ACCESS f1.txt
/data/www/ CLOSE_NOWRITE,CLOSE f1.txt
持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --
format "%T %w%f event: %e"
持续前台监控特定事件
inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event:
%;e" -e create,delete,moved_to,moved_from,close_write,attrib
rsync
rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时数据同步。
服务器软件包:rsync(Ubuntu20.04),rsync-daemon(CentOS 8)
服务文件:/usr/lib/systemd/system/rsyncd.service
配置文件:/etc/rsyncd.conf
端口:873/tcp
命令
本地传输
rsync [OPTION]... SRC [SRC]... DEST
远程传输通过ssh协议
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC [DEST]
远程传输通过rsync协议
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
选项
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显
示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导
致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象
-z :传输时进行压缩提高效率
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,
包括它们的属性。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会
影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1
目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--
max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行
的,所以它是在 :exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell
认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增
量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如
果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示
例。
--remove-source-files:要求删除源端已经成功传输的文件
--bwlimit=RATE 指定限速,单位默为为MB/s
示例
inotify + rsync + shell 脚本实现实时数据同步
IP | 系统 | 作用 | 同步目录 |
192.168.28.30 | CentOS8 | data server数据服务器 | /data/www |
192.168.28.31 | CentOS8 | backup server备份服务器/rsyncd服务器 | /data/backup |
实现rsync服务
--------------------------------192.168.28.31
安装rsync-daemon,此程序提供service文件
[root@wenzi ~]$yum -y install rsync-daemon
修改配置文件
[root@wenzi ~]$vim /etc/rsyncd.conf
[root@wenzi ~]$cat /etc/rsyncd.conf
uid = root 指定访问的用户以什么身份访问共享目录,类似NFS的映射
gid = root 指定访问的用户以什么用户组访问共享目录
max connections = 0 同时连接的最大数量。0表示没有限制
ignore errors 在传输过程中,即使出现错误,rsync也不会停止传输
exclude = lost+found/ 排除此目录
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no 增加安全,避免DNS欺骗
hosts allow = 192.168.28.0/24 允许访问此rsync服务的IP地址范围
[backup] 模块名,若有重名,则偏后的生效
path = /data/backup 要同步的目录
comment = This is backup dir 描述
read only = no 默认是yes,只读;改为允许写
auth users = wenzi 访问时认证的用户
secrets file = /etc/rsync.pas 保存访问的用户名和密码,一行一个
创建密码文件,修改密码文件权限,保证安全。 密码文件后缀必须为 .pas
[root@wenzi ~]$echo "wenzi:123456" > /etc/rsync.pas
[root@wenzi ~]$chmod 600 /etc/rsync.pas
创建相关目录
[root@wenzi ~]$mkdir -p /data/backup
重启服务
[root@wenzi ~]$systemctl restart rsyncd.service
向同步的目录中新增测试文件
[root@wenzi ~]$echo "aaa" > /data/backup/a.txt
--------------------------------192.168.28.30
创建密码文件
[root@wenzi ~]$echo "123456" > /etc/rsync.pas
[root@wenzi ~]$chmod 600 /etc/rsync.pas
查看远程rsync服务器的模块信息
[root@wenzi ~]$rsync rsync://wenzi@192.168.28.31/backup
Password:
drwxr-xr-x 19 2024/02/04 18:20:47 .
-rw-r--r-- 4 2024/02/04 18:20:47 a.txt
交互式验证查看具体模块内的文件
[root@wenzi ~]$rsync rsync://wenzi@192.168.28.31/backup
Password:
drwxr-xr-x 19 2024/02/04 18:20:47 .
-rw-r--r-- 4 2024/02/04 18:20:47 a.txt
非交互式查看
[root@wenzi ~]$rsync --password-file=/etc/rsync.pas rsync://wenzi@192.168.28.31/backup
drwxr-xr-x 19 2024/02/04 18:20:47 .
-rw-r--r-- 4 2024/02/04 18:20:47 a.txt
将远程共享目录内容同步到本机客户端
创建本机的同步目录 /data/www
[root@wenzi ~]$mkdir -p /data/www
前面的是src,后面的是dest,以src为主,--delete选项表示对比后多则删,少则补
[root@wenzi ~]$rsync -avz --delete --password-file=/etc/rsync.pas rsync://wenzi@192.168.28.31/backup /data/www/
receiving incremental file list
./
a.txt
sent 46 bytes received 111 bytes 314.00 bytes/sec
total size is 4 speedup is 0.03
[root@wenzi ~]$ll /data/www/
total 4
-rw-r--r-- 1 root root 4 Feb 4 18:20 a.txt
少则补,所以此时是将rsync服务器的/data/backup/a.txt同步至本机,而不是把远程的a.txt删除了
配合shell脚本实现实时同步
执行脚本前必须保证双方数据已同步,脚本用于同步后续的变化
------------------------------------192.168.28.30
[root@wenzi ~]$cat inotify_rsync.sh
#!/bin/bash
#********************************************************************
#FileName: inotify_rsync.sh
#Version: 1.0
#Date: 2024-02-04
#Author: wenzi
#Description: This is description
#********************************************************************
SRC='/data/www/'
DEST='wenzi@192.168.28.31::backup'
#Ubuntu20.04不支持 --password-file=/etc/rsync.pas,可用变量实现 export RSYNC_PASSWORD=123456
rpm -q inotify-tools &> /dev/null || yum -y install inotify-tools
rpm -q rsync &> /dev/null || yum -y install rsync
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,attrib,move,close_write ${SRC} | \
while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
#注意src和dest位置
rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
运行脚本
[root@wenzi ~]$./inotify_rsync.sh
新增文件
[root@wenzi ~]$echo "222" > /data/www/222.txt
查看日志
[root@wenzi ~]$cat /var/log/changelist.log
2024-02-04 19:30:59,file /data/www/222.txt was backuped up via rsync
2024-02-04 19:30:59,file /data/www/222.txt was backuped up via rsync
------------------------------------192.168.28.31
查看是否同步
[root@wenzi ~]$ll /data/backup/
total 16
-rw-r--r-- 1 root root 4 Feb 4 19:30 222.txt
-rw-r--r-- 1 root root 4 Feb 4 18:20 a.txt
sersync
下载地址 https://code.google.com/archive/p/sersync/downloads
sersync类似于inotify,同样用于监控,但它克服了inotify的缺点。
inotify最大的不足是会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,例如,当监控目录中有5个文件时,删除目录时会产生6个监控事件,从而导致重复调用rsync命令。另外比如:vim文件时,inotify会监控到临时文件的事件,但这些事件相对于rsync来说是不应该被监控的。
优点
- sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,
- 所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
- sersync配置很简单,其中提供了静态编译好的二进制文件和xml配置文件,直接使用即可
- sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态
- sersync有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步
- sersync不仅可以实现实时同步,另外还自带crontab功能,只需在xml配置文件中开启,即也可以
- 按要求隔一段时间整体同步一次,而无需再额外配置crontab功能
- sersync 可以二次开发
查看帮助
可见sersync已将inotify的内核参数优化了
[root@wenzi sersync]$sersync2 -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
实验
IP | 系统 | 作用 | 同步目录 |
192.168.28.30 | CentOS8 | data server数据服务器 | /data/www |
192.168.28.31 | CentOS8 | backup server备份服务器/rsyncd服务器 | /data/backup |
基于rsync daemon实现sersync
备份服务器配置和上个实验一致。
--------------------------------------数据服务器
[root@wenzi ~]$yum -y install rsync
[root@wenzi ~]$ls
sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@wenzi ~]$tar -x -f sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
[root@wenzi ~]$ln -s /usr/local/GNU-Linux-x86/ /usr/local/sersync
[root@wenzi ~]$ll /usr/local/sersync/
total 1772
-rwxr-xr-x 1 root root 2214 Oct 26 2011 confxml.xml
-rwxr-xr-x 1 root root 1810128 Oct 26 2011 sersync2
[root@wenzi ~]$echo 'PATH=/usr/local/sersync:$PATH' > /etc/profile.d/sersync.sh
[root@wenzi ~]$source /etc/profile.d/sersync.sh
[root@wenzi ~]$cp /usr/local/sersync/confxml.xml{,.bak}
[root@wenzi sersync]$vim confxml.xml
...
<filter start="false"> 不开启文件过滤功能,若为true,下面4种类型的文件将不同步
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify> 监控事件
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/> 文件属性变化后也会同步
<modify start="false"/>
</inotify>
<sersync> rsync命令配置
<localpath watch="/data/www"> 需要同步的源目录或文件
<remote ip="192.168.28.31" name="backup"/> 指定备份服务器地址和rsync daemon模块名
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/> rsync命令选项
<auth start="true" users="wenzi" passwordfile="/etc/rsync.pas"/> 认证的用户密码
<userDefinedPort start="false" port="874"/><!-- port=874 --> rsync端口号
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/> 默认使用rsync daemon,若为true,使用远程shell模式
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> 错误重传及日志文件路径
<crontab start="false" schedule="600"><!--600mins--> 不开启crontab
<crontabfilter start="false"> 不开启crontab定时传输功能
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>
...
创建连接rsyncd服务器的用户密码文件,并修改权限
[root@wenzi sersync]$echo "123456" > /etc/rsync.pas && chmod 600 /etc/rsync.pas
开始监控并实时同步 sersync2 -dro /usr/local/sersync/confxml.xml
如果同步失败,手动执行命令,观察过程。
cd /data/www && rsync -artuz -R --delete ./rsyncuser@backup-server::backup --password-file=/etc/rsync.pas >/dev/null 2>&1
sersync支持多实例
即监控多个目录时,需要分别配置不同配置文件,然后执行sersync2时指定配置文件即可。
sersync2 -rd -o /etc/sersync.d/nginx.xml
基于远程shell实现sersync
无需配置rsync daemon,只需要配置基于key验证的ssh即可。
-------------------------------------数据服务器
[root@wenzi ~]$ssh-keygen
[root@wenzi ~]$ssh-copy-id 192.168.28.31
[root@wenzi ~]$tar -x -f sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
[root@wenzi ~]$ln -s /usr/local/GNU-Linux-x86/ /usr/local/sersync
[root@wenzi ~]$echo 'PATH=/usr/local/sersync:$PATH' > /etc/profile.d/sersync.sh
[root@wenzi ~]$source /etc/profile.d/sersync.sh
[root@wenzi ~]$cp /usr/local/sersync/confxml.xml{,.bak}
[root@wenzi ~]$vim /usr/local/sersync/confxml.xml
...
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/> 此行该为true
<modify start="false"/>
</inotify>
<sersync>
<localpath watch="/data/www"> 监控的源目录
<remote ip="192.168.28.31" name="/data/backup"/> 备份服务器IP和目标目录
...
<ssh start="true"/> 此行改为true,启用shell方式
开始监控并实时同步
实验
实现基于分布式的LAMP架构,并将NFS实时同步到备份服务器
192.168.28.30 | CentOS8 | 客户端,用于测试 |
192.168.28.40 | Rocky8 | DNS服务器,wenzi.com |
192.168.28.41 | Rocky8 | httpd服务器,web1 |
192.168.28.42 | Rocky8 | httpd服务器,web2 |
192.168.28.60 | Ubuntu2204 | MySQL数据库 |
192.168.28.61 | Ubuntu2204 | NFS文件共享服务器 |
192.168.28.62 | Ubuntu2204 | 备份服务器 |
DNS配置
安装软件
[root@wenzi ~]$yum -y install bind bind-utils
[root@wenzi ~]$systemctl enable --now named.service
修改配置文件
[root@wenzi ~]$vim /etc/named.conf
options {
listen-on port 53 { 127.0.0.1;localhost; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { localhost;192.168.28.0/24; };
...
定义区域文件
[root@wenzi ~]$vim /etc/named.rfc1912.zones
zone "wenzi.com" {
type master;
file "wenzi.com.zone";
};
...
区域解析库
[root@wenzi ~]$cp -a /var/named/named.localhost /var/named/wenzi.com.zone
[root@wenzi ~]$cat /var/named/wenzi.com.zone
$TTL 1D
@ IN SOA ns mail.wenzi.com. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS master
master IN A 192.168.28.40
www IN A 192.168.28.41
www IN A 192.168.28.42
[root@wenzi ~]$named-checkconf
[root@wenzi ~]$named-checkzone wenzi.com /var/named/wenzi.com.zone
zone wenzi.com/IN: loaded serial 1
OK
[root@wenzi ~]$systemctl restart named.service
MySQL数据库配置
配合web服务器搭建的wordpress使用
安装mysql-server
root@wenzi:~#apt update && apt -y install mysql-server
root@wenzi:~# vim /etc/mysql/mysql.conf.d/mysqld.cnf
将这两项注释
#bind-address = 127.0.0.1
#mysqlx-bind-address = 127.0.0.1
root@wenzi:~# mysql
创建wordpress数据库
mysql> create database wordpress;
创建用户
mysql> create user wp@'192.168.28.%' identified by 'Admin.123';
授权
mysql> grant all on wordpress.* to wp@'192.168.28.%';
重启服务
root@wenzi:~# systemctl restart mysql.service
NFS服务器配置
-------------------------------------配置nfs
安装
[root@wenzi ~]$apt -y install nfs-kernel-server
创建共享目录
[root@wenzi ~]$mkdir -p /data/www
修改配置文件,将所有访问用户(包括root)都映射为nobody
[root@wenzi ~]$vim /etc/exports
/data/www 192.168.28.0/24(rw,all_squash)
生效
[root@wenzi ~]$exportfs -r
查看
[root@wenzi ~]$exportfs -v
/data/www 192.168.28.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
授予nobody访问共享目录的权限
[root@wenzi ~]$setfacl -m u:nobody:rwx /data/www
创建测试文件
[root@wenzi ~]$echo "This is test NFS text" > /data/www/test.txt
-------------------------------------配置sersync
可知,内核支持inotify
root@wenzi:~# ll /proc/sys/fs/inotify/
total 0
dr-xr-xr-x 1 root root 0 Feb 5 05:32 ./
dr-xr-xr-x 1 root root 0 Feb 4 22:31 ../
-rw-r--r-- 1 root root 0 Feb 5 05:32 max_queued_events
-rw-r--r-- 1 root root 0 Feb 5 05:32 max_user_instances
-rw-r--r-- 1 root root 0 Feb 5 05:32 max_user_watches
root@wenzi:~# apt -y install inotify-tools
[root@wenzi ~]$ls
sersync2.5.4_64bit_binary_stable_final.tar.gz snap
[root@wenzi ~]$tar -x -f sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
[root@wenzi ~]$ln -s /usr/local/GNU-Linux-x86/ /usr/local/sersync
[root@wenzi ~]$echo 'PATH=/usr/local/sersync:$PATH' > /etc/profile.d/sersync.sh
[root@wenzi ~]$source /etc/profile.d/sersync.sh
[root@wenzi ~]$cp /usr/local/sersync/confxml.xml{,.bak}
[root@wenzi ~]$vim /usr/local/sersync/confxml.xml
...
<attrib start="true"/>
...
<localpath watch="/data/www"> 此处源目录应为NFS共享目录
<remote ip="192.168.28.62" name="backup"/>
...
<auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/>
创建密码文件
[root@wenzi ~]$echo "123456" > /etc/rsync.pas
[root@wenzi ~]$chmod 600 /etc/rsync.pas
web1配置
[root@wenzi ~]$yum -y install httpd && systemctl enable --now httpd
[root@wenzi ~]$yum -y install nfs-utils
查看远程共享目录
[root@wenzi ~]$showmount -e 192.168.28.61
Export list for 192.168.28.61:
/data/www 192.168.28.0/24
挂载远程目录 至 /var/www/html,共享存储
[root@wenzi ~]$vim /etc/fstab
...
192.168.28.61:/data/www /var/www/html/ nfs _netdev 0 0
[root@wenzi ~]$mount -a
[root@wenzi ~]$df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 877M 0 877M 0% /dev
tmpfs tmpfs 896M 0 896M 0% /dev/shm
tmpfs tmpfs 896M 8.7M 887M 1% /run
tmpfs tmpfs 896M 0 896M 0% /sys/fs/cgroup
/dev/mapper/rl-root xfs 17G 2.3G 15G 14% /
/dev/nvme0n1p1 xfs 1014M 192M 823M 19% /boot
tmpfs tmpfs 180M 0 180M 0% /run/user/0
192.168.28.61:/data/www nfs4 9.8G 3.3G 6.1G 35% /var/www/html
查看共享目录
[root@wenzi ~]$ll /var/www/html/
总用量 4
-rw-r--r-- 1 root root 22 2月 5 04:55 test.txt
创建文件,验证对共享目录的读写功能
[root@wenzi ~]$touch /var/www/html/a.txt
[root@wenzi ~]$ll /var/www/html/
总用量 4
-rw-r--r-- 1 nobody nobody 0 2月 5 05:02 a.txt
-rw-r--r-- 1 root root 22 2月 5 04:55 test.txt
创建测试网页
[root@wenzi ~]$echo 'This is test html' > /var/www/html/index.html
web2配置
[root@wenzi ~]$yum -y install httpd && systemctl enable --now httpd
[root@wenzi ~]$yum -y install nfs-utils
[root@wenzi ~]$showmount -e 192.168.28.61
Export list for 192.168.28.61:
/data/www 192.168.28.0/24
[root@wenzi ~]$vim /etc/fstab
...
192.168.28.61:/data/www /var/www/html/ nfs _netdev 0 0
[root@wenzi ~]$mount -a
[root@wenzi ~]$df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 877M 0 877M 0% /dev
tmpfs tmpfs 896M 0 896M 0% /dev/shm
tmpfs tmpfs 896M 8.7M 887M 1% /run
tmpfs tmpfs 896M 0 896M 0% /sys/fs/cgroup
/dev/mapper/rl-root xfs 17G 2.1G 15G 12% /
/dev/nvme0n1p1 xfs 1014M 192M 823M 19% /boot
tmpfs tmpfs 180M 0 180M 0% /run/user/0
192.168.28.61:/data/www nfs4 9.8G 3.3G 6.1G 35% /var/www/html
备份服务器
root@wenzi:~# apt -y install rsync
root@wenzi:~# systemctl enable --now rsync.service
编辑rsync配置文件,若不存在直接新建
root@wenzi:~# vim /etc/rsyncd.conf
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
[backup]
path = /data/backup/
comment = This is backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas
root@wenzi:~# echo "rsyncuser:123456" > /etc/rsync.pas
root@wenzi:~# chmod 600 /etc/rsync.pas
root@wenzi:~# mkdir -p /data/backup
root@wenzi:~# systemctl restart rsync
在NFS上测试
[root@wenzi ~]$rsync rsync://192.168.28.62
backup This is backup dir
全部配置完毕,最后开启NFS服务器的备份实时同步
开启同步
[root@wenzi ~]$sersync2 -dro /usr/local/sersync/confxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d run as a daemon
option: -r rsync all the local files to the remote servers before the sersync work
option: -o config xml name: /usr/local/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
daemon start,sersync run behind the console
use rsync password-file :
user is rsyncuser
passwordfile is /etc/rsync.pas
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data/www && rsync -artuz -R --delete ./ rsyncuser@192.168.28.62::backup --password-file=/etc/rsync.pas >/dev/null 2>&1
run the sersync:
watch path is: /data/www
查看备份服务器的备份目录
已同步
root@wenzi:~# ll /data/backup/
total 16
drwxrwxr-x 2 root root 4096 Feb 5 05:26 ./
drwxr-xr-x 3 root root 4096 Feb 5 05:55 ../
-rw-r--r-- 1 nobody nogroup 0 Feb 5 05:02 a.txt
-rw-r--r-- 1 nobody nogroup 18 Feb 5 05:26 index.html
-rw-r--r-- 1 root root 22 Feb 5 04:55 test.txt
测试客户端访问www.wenzi.com
[root@wenzi ~]$dig www.wenzi.com
; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> www.wenzi.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46870
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 5ff8f3bcb99ef2f69118584c65c002b3559cdc5c9763a599 (good)
;; QUESTION SECTION:
;www.wenzi.com. IN A
;; ANSWER SECTION:
www.wenzi.com. 86400 IN A 192.168.28.42
www.wenzi.com. 86400 IN A 192.168.28.41
;; AUTHORITY SECTION:
wenzi.com. 86400 IN NS master.wenzi.com.
;; ADDITIONAL SECTION:
master.wenzi.com. 86400 IN A 192.168.28.40
;; Query time: 1 msec
;; SERVER: 192.168.28.40#53(192.168.28.40)
;; WHEN: Mon Feb 05 05:33:39 CST 2024
;; MSG SIZE rcvd: 139
[root@wenzi ~]$curl www.wenzi.com
This is test html