数据的实时同步

实现方法

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.30CentOS8data server数据服务器/data/www
192.168.28.31CentOS8backup 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.30CentOS8data server数据服务器/data/www
192.168.28.31CentOS8backup 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.30CentOS8客户端,用于测试
192.168.28.40Rocky8DNS服务器,wenzi.com
192.168.28.41Rocky8httpd服务器,web1
192.168.28.42Rocky8httpd服务器,web2
192.168.28.60Ubuntu2204MySQL数据库
192.168.28.61Ubuntu2204NFS文件共享服务器
192.168.28.62Ubuntu2204备份服务器

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值