实现基于分布式的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客户端发布新文章带图片的也可以实时同步过来了

相关推荐
x66ccff15 分钟前
【Docker】使用Dev Container进行开发
运维·docker·容器
shelby_loo30 分钟前
在 Azure 100 学生订阅中新建 Ubuntu VPS 并部署 Mastodon 服务器
服务器·ubuntu·azure
还记得梦想吗38 分钟前
android adb 无线连接 (wifi)
android·linux·adb
阿正的梦工坊44 分钟前
tmux 中鼠标滚动异常:^[[A和^[[B是什么以及如何解决
linux·tmux
bin91531 小时前
深度剖析AI自动化编程:现状、边界与未来之路
运维·人工智能·自动化
nbsaas-boot1 小时前
架构设计:微服务还是集群更适合?
微服务·云原生·架构
xiao-xiang1 小时前
jenkins-视图管理
运维·jenkins
专注和坚持是最好的导师1 小时前
Ubuntu创建AndroidStudio快捷启动图标
linux·运维·ubuntu
互联网哪些事情2 小时前
如何选择合适的服务器?服务器租赁市场趋势分析
运维·服务器
不会kao代码的小王2 小时前
《戴森球计划》异地远程联机攻略
服务器·网络·数据库