实现基于分布式的LAMP架构+NFS实时同步到备份服务器

概述

项目计划用WordPress搭建一个博客系统, 为了性能更好,两个服务器都对外提供WordPress博客系统服务, 数据放在MySQL服务器, 有些上传的图片发送到NFS服务器上,并且把NFS数据实时同步到一个备份服务器上。

服务名称 IP地址
DNS 10.0.0.200
WEB1 10.0.0.201
WEB2 10.0.0.202
MySQL 10.0.0.203
NFS 10.0.0.204
BACKUp 10.0.0.205

200:DNS服务配置

执行脚本

bash 复制代码
bash install_dns.sh

#!/bin/bash

#********************************************************************

#Author: wangxiaochun

#QQ: 29308620

#Date: 2020-10-23

#FileName: install_dns.sh

#URL: http://www.wangxiaochun.com

#Description: The test script

#Copyright (C): 2020 All rights reserved

#********************************************************************

DOMAIN=wang.org

HOST=www

HOST_IP=10.0.0.200

LOCALHOST=`hostname -I | awk '{print $1}'`

. /etc/os-release

color () {

RES_COL=60

MOVE_TO_COL="echo -en \\033[${RES_COL}G"

SETCOLOR_SUCCESS="echo -en \\033[1;32m"

SETCOLOR_FAILURE="echo -en \\033[1;31m"

SETCOLOR_WARNING="echo -en \\033[1;33m"

SETCOLOR_NORMAL="echo -en \E[0m"

echo -n "$1" && $MOVE_TO_COL

echo -n "["

if [ $2 = "success" -o $2 = "0" ] ;then

${SETCOLOR_SUCCESS}

echo -n $" OK "

elif [ $2 = "failure" -o $2 = "1" ] ;then

${SETCOLOR_FAILURE}

echo -n $"FAILED"

else

${SETCOLOR_WARNING}

echo -n $"WARNING"

fi

${SETCOLOR_NORMAL}

echo -n "]"

echo

}

install_dns () {

if [ $ID = 'centos' -o $ID = 'rocky' ];then

yum install -y bind bind-utils

elif [ $ID = 'ubuntu' ];then

apt update

apt install -y bind9 bind9-utils bind9-host bind9-dnsutils

else

color "不支持此操作系统,退出!" 1

exit

fi

}

config_dns () {

if [ $ID = 'centos' -o $ID = 'rocky' ];then

sed -i -e '/listen-on/s/127.0.0.1/localhost/' -e '/allow-query/s/localhost/any/' -e 's/dnssec-enable yes/dnssec-enable no/' -e 's/dnssec-validation yes/dnssec-validation no/' /etc/named.conf

cat >> /etc/named.rfc1912.zones <<EOF

zone "$DOMAIN" IN {

type master;

file "$DOMAIN.zone";

};

EOF

cat > /var/named/$DOMAIN.zone <<EOF

\$TTL 1D

@ IN SOA master admin (

1 ; serial

1D ; refresh

1H ; retry

1W ; expire

3H ) ; minimum

NS master

master A ${LOCALHOST}

$HOST A $HOST_IP

EOF

chmod 640 /var/named/$DOMAIN.zone

chgrp named /var/named/$DOMAIN.zone

elif [ $ID = 'ubuntu' ];then

sed -i 's/dnssec-validation auto/dnssec-validation no/' /etc/bind/named.conf.options

cat >> /etc/bind/named.conf.default-zones <<EOF

zone "$DOMAIN" IN {

type master;

file "/etc/bind/$DOMAIN.zone";

};

EOF

cat > /etc/bind/$DOMAIN.zone <<EOF

\$TTL 1D

@ IN SOA master admin (

1 ; serial

1D ; refresh

1H ; retry

1W ; expire

3H ) ; minimum

NS master

master A ${LOCALHOST}

$HOST A $HOST_IP

EOF

chgrp bind /etc/bind/$DOMAIN.zone

else

color "不支持此操作系统,退出!" 1

exit

fi

}

start_service () {

systemctl enable named

systemctl restart named

systemctl is-active named.service

if [ $? -eq 0 ] ;then

color "DNS 服务安装成功!" 0

else

color "DNS 服务安装失败!" 1

exit 1

fi

}

install_dns

config_dns

start_service

脚本功能概述

  1. 基础信息

    • 定义了 DNS 域名 (DOMAIN=wang.org)、主机名 (HOST=www)、主机 IP 地址 (HOST_IP=10.0.0.200)。
    • 自动获取当前主机的 IP 地址并赋值给 LOCALHOST
  2. 操作系统检测

    • 通过 /etc/os-release 文件检测操作系统类型,支持 CentOS/Rocky 和 Ubuntu。
  3. 彩色输出

    • 使用 ANSI 转义序列打印不同颜色的信息,提示任务是否成功(success)、失败(failure)、或警告(warning)。
  4. DNS 安装

    • 根据操作系统不同,分别使用 yumapt 安装 BING 及相关工具。
  5. DNS 配置

    • 修改 named 配置文件,允许外部查询,并禁用 DNSSEC(DNS 安全扩展)。
    • 配置 DNS 区域文件,定义主域名(wang.org)及其解析记录(包括主机 www)。
  6. 启动服务

    • named 服务设置为开机自启,重启服务并检查运行状态。
    • 根据服务状态输出结果。

配置文件修改

安装完成并验证

bash 复制代码
host www.wang.org 127.0.0.1

因为要返回201、202的地址,所以要修改配置文件

bash 复制代码
vim /etc/bind/wang.org.zone

不重启服务生效

bash 复制代码
rndc reload

验证测试

203: MySQL服务

1. 安装MySQL

bash 复制代码
apt update && apt install mysql-server -y

2. 配置文件修改

因为MySQL默认监听127.0.0.1

所以需要修改配置文件才能远程连接

bash 复制代码
vim /etc/mysql/mysql.conf.d/mysqld.cnf

3. 重启MySQL服务

bash 复制代码
systemctl restart mysql

4. 创建用户和数据库

sql 复制代码
#创建数据库
mysql> create database wordpress;  

#创建登录的用户、密码和允许来源的IP地址
mysql> create user wordpress@'10.0.0.%' identified by '123456';

#用户授权(给用户wordpress@'10.0.0.%'进入wordpress数据库的所有权限)
mysql> grant all on wordpress.* to wordpress@'10.0.0.%';

201、202:WEB服务

1. 安装web服务软件

两个web服务器安装Apache和其依赖

bash 复制代码
apt update && apt install apache2 php php-mysql -y

2. 安装WordPress

进入WordPress官网下载: 博客工具、发布平台和内容管理系统 -- WordPress.org China 简体中文

拷入安装包并解压:

bash 复制代码
unzip wordpress-6.2-zh_CN.zip  //后面是压缩包文件名

把解压的WordPress目录放到网站所在的目录

bash 复制代码
mv wordpress/* /var/www/html/

查看(删掉index文件)

输入web服务所在的域名就可以访问网站了

上图信息需要写入WordPress配置文件, 但是配置文件没有写权限,所以我们要打开目录的写权限

查看目录权限

bash 复制代码
//查看apachede是由哪个身份运行的
ps aux 

所以把目录文件权限赋予 www-data

bash 复制代码
chown www-data.www-data /var/www/html -R
#-R: 递归

查看属性,已经修改成功

重新执行步骤,成功进入,安装完成后10.0.0.203数据库会生成数据库文件

204: NFS服务

NFS(Network File System,网络文件系统)是一种通过网络共享文件的协议,允许不同设备(如服务器和客户端)在网络中共享文件系统,使用户能够像访问本地文件系统一样访问远程文件系统。

进入网站文章发表时上传的图片文件都存于uploads文件夹中,我们下面要做的是把图片文件放入到nfs服务器中

1. 安装NFS(服务端)

bash 复制代码
apt install nfs-server -y

2. 安装NFS(客户端)

在201、202web服务器安装

bash 复制代码
apt install nfs-common -y

3. 新建共享文件夹(服务端)

bash 复制代码
mkdir /data/www -p

新建的目录没有默认给www-data写权限

所以要把所有者,所属组改成www-data

bash 复制代码
chown www-data.www-data /data/www/    #因为目录为空,所以不用加 -r 选项

4. 新建配置文件(服务端)

bash 复制代码
mkdir /etc/exports.d/
bash 复制代码
vim /etc/exports.d/wordpress.exports

/data/www 10.0.0.0/24(rw)

用户不同还需要压榨成相同的用户

让服务生效

bash 复制代码
exportfs -v  //查看是否生效
exportfs -r  //生效操作

5. 文件挂载(客户端)

首先把201服务器的文件拷入204服务端共享文件夹,因为一挂载,原来的文件就会丢失

在201服务器下执行:

bash 复制代码
rsync -av /var/www/html/ 10.0.0.204:/data/www/

#这条命令使用 rsync 工具将本地 /var/www/html/ 目录下的内容同步到远程主机 10.0.0.204 的 /data/www/ 目录
#-a (archive):开启归档模式,递归同步目录,并保留文件的权限、时间戳、符号链接等属性。
#-v (verbose):详细模式,显示同步过程中的详细信息

挂载之前可以用此命令确认是否可以访问

bash 复制代码
showmount -e 10.0.0.204

可以把文件移走,也可以直接挂载

bash 复制代码
vim /etc/fstab

查看挂载

这时候201就会出现204服务端的共享文件

在202同样的道理

bash 复制代码
vim /etc/fstab

这时候文件数据也挂过来了

205: rsync服务

rsync 服务是一个快速且灵活的工具和协议,用于高效同步和传输文件。它在本地和远程系统之间传输文件时,只复制变化部分,从而节省带宽和时间。

rsync是在204上安装,因为204是源,205是目标,205配rsync 服务

1. 新建配置文件

205:

bash 复制代码
[root@ubuntu2204 ~]#cat > /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 = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas

还要新建一个放用户名和密码的文件 /etc/rsync.pas

bash 复制代码
#服务器端准备目录
[root@ubuntu2204 ~]#mkdir -pv /data/backup

#服务器端生成验证文件(用户名和密码+赋权限)
[root@ubuntu2204 ~]#echo "rsyncuser:123456" > /etc/rsync.pas
[root@ubuntu2204 ~]#chmod 600 /etc/rsync.pas

重新启动服务

2. 配置同步信息

204:

204数据服务器上下载**sersync,**并拷贝到相应的目录解压

创建个软链接起名叫sersync

现在这个二进制文件存在程序环境路径的问题, 所以把它生成到软链接 里去(local/bin也是PATH变量里的文件夹)

bash 复制代码
ln -s /usr/local/sersync/sersync2 /usr/local/bin/

删掉自带的confxml.xml配置文件,导入下面的文件

XML 复制代码
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="false"/>
    <filter start="false">
	<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>
	<localpath watch="/data/www">
	    <remote ip="10.0.0.205" name="backup"/>
	    <!--<remote ip="192.168.8.39" name="tongbu"/>-->
	    <!--<remote ip="192.168.8.40" name="tongbu"/>-->
	</localpath>
	<rsync>
	    <commonParams params="-artuz"/>
	    <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/>
	    <userDefinedPort start="false" port="874"/><!-- port=874 -->
	    <timeout start="false" time="100"/><!-- timeout=100 -->
	    <ssh start="false"/>
	</rsync>
	<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
	<crontab start="false" schedule="600"><!--600mins-->
	    <crontabfilter start="false">
		<exclude expression="*.php"></exclude>
		<exclude expression="info/*"></exclude>
	    </crontabfilter>
	</crontab>
	<plugin start="false" name="command"/>
    </sersync>

    <plugin name="command">
	<param prefix="/bin/sh" suffix="" ignoreError="true"/>	<!--prefix /opt/tongbu/mmm.sh suffix-->
	<filter start="false">
	    <include expression="(.*)\.php"/>
	    <include expression="(.*)\.sh"/>
	</filter>
    </plugin>

    <plugin name="socket">
	<localpath watch="/opt/tongbu">
	    <deshost ip="192.168.138.20" port="8009"/>
	</localpath>
    </plugin>
    <plugin name="refreshCDN">
	<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
	    <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
	    <sendurl base="http://pic.xoyo.com/cms"/>
	    <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
	</localpath>
    </plugin>
</head>

创建账户密码就可以连接对方了

bash 复制代码
echo "rsyncuser:123456" > /etc/rsync.pas
chmod 600 /etc/rsync.pas

3. 同步验证

现在 data/backup文件夹为空

204数据服务器以后台方式执行命令

bash 复制代码
nohup sersync2 -dro /usr/local/sersync/confxml.xml &> /dev/null #后台执行,有标准输出扔到垃圾箱里

这是看执行过程的方式

现在查看205服务器文件夹,已经同步过来了

在web客户端发布新文章带图片的也可以实时同步过来了

相关推荐
zhoupenghui16814 分钟前
golang时间相关函数总结
服务器·前端·golang·time
lllsure16 分钟前
Linux 实用指令
linux·物联网
隔壁老王15620 分钟前
mysql实时同步到es
数据库·mysql·elasticsearch
努力的小T37 分钟前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
Nerd Nirvana1 小时前
OpenSSL crt & key (生成一套用于TLS双向认证的证书密钥)
linux·ssl·shell·认证·加密·tls·oepnssl
不修×蝙蝠1 小时前
HTTP 协议(Ⅲ)
服务器·http·javaee·http协议
letisgo52 小时前
记录一次部署PC端网址全过程
linux·阿里云·服务器运维
梨落秋溪、2 小时前
输入框元素覆盖冲突
java·服务器·前端
枫叶落雨2222 小时前
08-Elasticsearch
运维·jenkins
猫猫的小茶馆2 小时前
【网络编程】UDP协议
linux·服务器·网络·网络协议·ubuntu·udp