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

发布时间 2023-09-25 22:29:09作者: Shine、

1. 实现基于分布式的LAMP架构,并将NFS实时同步到备份服务

image-20230925140027443

1.1 web服务器配置

服务器环境准备

需配置DNS解析,将域名解析成web服务器的地址

服务名称 IP地址
web01-server 10.0.0.8
web02-server 10.0.0.18
mysql-server 10.0.0.28
nfs-server 10.0.0.38
backup-server 10.0.0.48

1.1.1 实现分布式LAMP架构,将web服务器数据目录挂载到nfs文件共享服务器上

web服务器配置

#web1配置
[root@web01 ~]#yum install -y httpd php php-mysqlnd php-json nfs-utils
[root@web01 ~]#systemctl enable --now httpd
[root@web01 ~]#wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@web01 ~]#tar xf latest-zh_CN.tar.gz 
[root@web01 ~]#ls
anaconda-ks.cfg  latest-zh_CN.tar.gz  wordpress
[root@web01 ~]#cp -r wordpress/* /var/www/html/
[root@web01 ~]#chown -R apache. /var/www/html/

#web2配置
[root@web02 ~]#yum install -y httpd php php-mysqlnd php-json nfs-utils
[root@web02 ~]#systemctl enable --now httpd

mysql服务器配置

#mysql服务器配置:创建数据库及授权账号
[root@mysql ~]#yum install -y mysql-server
[root@mysql ~]#systemctl enable --now mysqld
[root@mysql ~]#mysql
mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)

mysql> create user wordpress@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on wordpress.* to wordpress@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)

NFS服务器配置

#nfs服务器配置
[root@nfs ~]#yum -y install nfs-utils
[root@nfs ~]#systemctl enable --now nfs-server
[root@nfs ~]#mkdir /data/web -p
[root@nfs ~]#useradd www -s /bin/bash
[root@nfs ~]#id www
uid=1000(www) gid=1000(www) groups=1000(www)
[root@nfs ~]#chown -R www.www /data/web/
[root@nfs ~]#vim /etc/exports	    #配置共享目录,设置读写权限,所用用户都压榨成id1000的www用户
/data/web *(rw,all_squash,anonuid=1000,annogid=1000)
[root@nfs ~]#exportfs -r   
[root@nfs ~]#exportfs -v
/data/web     	<world>(sync,wdelay,hide,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)

#nfs客户端(web1或web2)查看远程主机的NFS共享
[root@web01 ~]#showmount -e 10.0.0.38
Export list for 10.0.0.38:
/data/web *

#将web1上的文件复制到web2服务器的目录中
[root@web01 ~]#rsync -a /var/www/html/* 10.0.0.18:/var/www/html/

#web服务器未使用nfs挂载前,如果该目录已有数据,需要先把数据同步到nfs服务器被挂载的目录中
[root@web01 ~]#rsync -a /var/www/html/wp-content/uploads/ 10.0.0.38:/data/web

#web服务器配置实现nfs永久挂载
[root@web01 ~]#vim /etc/fstab
10.0.0.38:/data/web     /var/www/html/wp-content/uploads nfs defaults,_netdev 0 0
[root@web01 ~]#mount -a

[root@web01 ~]#df -h
.......
10.0.0.38:/data/web          18G  2.1G   16G  12% /var/www/html/wp-content/uploads

[root@web02 ~]#vim /etc/fstab
10.0.0.38:/data/web     /var/www/html/wp-content/uploads nfs defaults,_netdev 0 0
[root@web02 ~]#mount -a

[root@web02 ~]#df -h
.......
10.0.0.38:/data/web          18G  2.1G   16G  12% /var/www/html/wp-content/uploads

1.1.2 使用sersync实现NFS服务器上的数据文件实时同步到备份服务器上

数据备份服务器配置(rsync服务器)

#rsync(备份)服务器配置
[root@backup ~]#yum -y install rsync-daemon
[root@backup ~]#vim /etc/rsyncd.conf
uid = www  			#提定以哪个用户来访问共享目录,将其指定为生成的文件所有者,默认为nobody
gid = www 	 		#指定以哪个用户组来访问共享目录,如果未指定,默认为nobody。在Ubuntu中为nogroup。
max connections = 0 #指定允许的最大连接数,0 表示不限制连接数
ignore errors		#忽略同步过程中的错误
exclude = lost+found/  				#指定要在同步过程中排除的目录或文件,在此例中,排除了lost+found目录
log file = /var/log/rsyncd.log 		#指定日志文件的路径
pid file = /var/run/rsyncd.pid 		#指定进程 ID 文件的路径
lock file = /var/run/rsyncd.lock  	#指定锁文件的路径
reverse lookup = no   				#禁用反向DNS查找
#hosts allow = 192.168.8.0/24 		#指定允许访问 rsync 服务器的主机 IP 地址范围
[backup]
path = /data/web/					#定义一个模块(module),每个模块对应一个不同的共享目录
comment = backup 					#为此模块添加注释,用于描述此共享目录
read only = no						#指定是否只读
auth users = rsyncuser				#指定允许访问此模块的授权用户rsyncuser
secrets file = /etc/rsync.pas		#指定包含授权用户密码的文件路径

#服务器端准备备份目录
[root@backup ~]#mkdir -pv /data/web

#服务器端生成账户密码验证文件
[root@backup ~]#echo "rsyncuser:123456" > /etc/rsync.pas
[root@backup ~]#chmod 600 /etc/rsync.pas

#服务器端启动rsync服务 
[root@backu ~]#systemctl start rsyncd    #CentOS 7 以上版本

image-20230925215605360

NFS文件共享服务器配置(rsync客户端)

#客户端(nfs-server)配置密码文件
[root@nfs ~]#echo "123456" > /etc/rsync.pas
[root@nfs~]#chmod 600 /etc/rsync.pas 		#此为必要项,权限必须修改

#客户端查看rsync服务器信息
#查看远程rsync服务器的模块信息
[root@nfs ~]#rsync rsync://rsyncuser@10.0.0.48
backup         	backup
#交互式验证查看具体模块内的文件
[root@nfs ~]#rsync rsync://rsyncuser@10.0.0.48/backup
Password:
#非交互式查看共享目录
[root@nfs ~]#rsync --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.48/backup
drwxr-xr-x             18 2023/09/25 20:08:32 .
drwxr-xr-x             16 2023/09/25 18:30:21 2023

#rsync客户端(nfs-server)配置
[root@nfs ~]#wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs ~]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs ~]#cp -a GNU-Linux-x86 /usr/local/sersync

#创建PATH变量文件并使其生效
[root@nfs  ~]#echo 'PATH=/usr/local/sersync:$PATH' > /etc/profile.d/sersync.sh
[root@nfs  ~]#source /etc/profile.d/sersync.sh

#sersync目录只有两个文件:一个是二进制程序文件,一个是xml格式的配置文件
[root@nfs ~]#ls /usr/local/sersync/
confxml.xml sersync2

#确认安装rsync客户端工具
[root@nfs ~]#rpm -q rsync &> /dev/null || dnf -y install rsync

#备份sersync配置文件
[root@nfs ~]#cp /usr/local/sersync/confxml.xml{,.bak}

#修改sersync配置文件
[root@nfs ~]#vim /usr/local/sersync/confxml.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"/>			##修改此行为true,文件属性变化后也会同步
	<modify start="false"/>
    </inotify>

    <sersync>
	    <localpath watch="/data/web">  ##修改此行,需要同步的源目录或文件,建议同步目录
	    <remote ip="10.0.0.48" 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"/>
	    <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/> #> #修改此行为true,指定备份服务器的rsync配置的用户和密码文件
	    <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>


#创建连接rsynd服务器的用户密码文件,并必须修改权限
[root@nfs ~]#echo 123456 > /etc/rsync.pas
[root@nfs ~]#chmod 600 /etc/rsync.pas
[root@nfs ~]#sersync2 -dro /usr/local/sersync/confxml.xml

#测试在NFS共享目录中修改文件,查看备份服务器是否同步

image-20230925215937830