LNMP架构拆分详解
Posted 我的紫霞辣辣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LNMP架构拆分详解相关的知识,希望对你有一定的参考价值。
拆分数据库至独立服务器
为什么要进行数据库的拆分
-
由于单台服务器运行LNMP架构会导致网站访问缓慢,当系统内存被吃满时,很容易导致系统出现
oom
(内存过载)。出现系统过载时,系统会自动kill掉mysql数据库释放内存(kill掉的是最占用内存的软件,不一定是数据库,数据库服务本身是很占用内存)。一旦数据库被系统kill掉了,那么Redis的数据可能还没有来得及存储到mysql,有可能会导致数据丢失的情况。 -
模拟
oom
(内存过载),系统自动杀死占用内存空间最大的内存
打开一个终端,输入命令:
swapoff -a 关闭swap功能
dd if=/dev/zero of=/dev/null bs=580M count=1024 启动一个占用内存的进程
再打开另一个终端:
free -m 查看系统当前的内存使用情况
total used free shared buff/cache available
Mem: 972 869 53 28 49 8
Swap: 0 0 0
systemctl restart nginx
# 这个时候系统启动nginx会变得非常缓慢,过一会可能会出现报错信息
- 查看报错日志
cat /var/log/messages # 查看系统日志,dd命令进程被系统自动杀死
# May 9 18:06:59 web01 abrt-hook-ccpp: Process 19277 (pkttyagent) of user 0 killed by SIGTRAP - dumping core
数据库拆分后解决了什么问题
- 缓解web网站的压力
- 增强数据库读写性能
- 提高用户访问速度
数据库拆分架构演变过程
数据库拆分的环境规划
主机名称 应用环境 外网地址 内网地址
web01 nginx+php 192.168.15.7 172.16.1.7
db01 mysql 172.16.1.51
Wordpress服务的数据库拆分
1. 备份本地服务器172.16.1.7数据库里面的数据
mysqldump -uroot -p123 --all-databases --single-transaction > mysql-all.sql
#将数据库中数据备份到本地的当前目录下,生成一个mysql-all.sql文件
2. 传输本地服务器172.16.1.7上的备份数据至远程服务器172.16.1.51上
scp mysql-all.sql root@172.16.1.51:/opt
3. 在远程服务器172.16.1.51上安装mysql数据库,使用mysql命令进行数据还原
yum -y install mariadb-server mariadb
# 注意在172.16.1.51安装的数据库要跟172.16.1.51上的数据库版本一致,否则会出现数据库兼容问题
systemctl start mariadb
systemctl enable mariadb
mysql < /opt/mysql-all.sql
systemctl restart mariadb
4. 将web程序连接的本地数据库修改到远程服务器172.16.1.51数据库上
4.1 先在本地服务器172.16.1.7上停止本地的数据库
systemctl stop mariadb
systemctl disable mariadb
# 停止本地服务器的数据库服务后,我们在浏览器访问网站是显示无法连接到数据库的
4.2 在远程服务器172.16.1.51数据库上授权本地主机能够连接mysql数据库
mysql -u root -p123
grant all privileges on *.* to nana@"%" identified by "123"; # 用户名:nana 密码:123
# all表示最高权限的授权,*.*(第一个*表示所有库,第二个*表示所有表),%(所有网段的主机)
4.3 在本地服务器172.16.1.7上进行测试,远程账户(nana)能否连接远程服务器172.16.1.5的mysql数据库
mysql -h 172.16.1.51 -u nana -p123
4.4 在本地服务器172.16.1.7上修改web程序连接数据库的配置文件
vim /code/wordpress/wp-config.php
...
# /** MySQL数据库用户名 */
define('DB_USER', 'nana');
...
# /** MySQL主机 */
define('DB_HOST', '172.16.1.51');
...
- 测试
我们用浏览器输入blog.nana.com,如果可以正常访问web客户端内容,那么就代表数据库拆分成功了。
WeCenter服务的数据库拆分
- 我们实现Wordpress服务的数据库拆分的时候,关闭了本地的数据库。我们通过浏览器去访问
zh.nana.com
时,浏览器会显示报错信息(An error occurred (500 Error)。 - 基于Wordpress服务的数据库拆分基础,我们只需要将本地服务器(172.16.1.7)WeCenter服务关联数据库的配置文件
/code/zh/system/config/database.php
,进行修改就可以了。
vim /code/zh/system/config/database.php
<?php
$config['charset'] = 'utf8';^M
$config['prefix'] = 'zh_';^M
$config['driver'] = 'MySQLi';^M
$config['master'] = array (
'charset' => 'utf8',
'host' => '172.16.1.51', # 将主机名修改成远程数据库的ip地址
'username' => 'nana', # 将用户名改成远程服务器172.16.1.5设置的远程账户名
'password' => '123', # 密码还是123,不需要更改
'dbname' => 'zh',
);^M
$config['slave'] = false;^M
- 测试
我们用浏览器输入zh.nana.com,如果可以正常访问web客户端内容,那么就代表数据库拆分成功了。
扩展多台Web服务器集群
为什么要扩展多台Web节点
- 单台Web服务器能抗住的访问量是有限的(一台服务器能够能够扛住的最大访问量是65535),配置多台Web服务器能提升更高的访问速度。
扩展多台Web解决了什么问题
- 单台web节点如果故障,会导致业务down机
- 多台web节点能保证业务的持续稳定,扩展性高
- 多台web节点能有效的提升用户访问网站的速度
多台Web节点技术机构图
扩展多台web服务器
1. 统一web01,web02的环境
- 安装Nginx
1. 拷贝web01服务器的yum仓库到web02服务器上
scp root@172.16.1.7:/etc/yum.repos.d/*.repo /etc/yum.repos.d/ # web01上操作
2. 下载nginx软件
yum -y install nginx # web02上进行下载
- 安装PHP
PHP7.1版本压缩包 链接:https://pan.baidu.com/s/1MJSeR2pG_Ur3fPFxoaxcGw
提取码:1234
路漫漫其修远兮,吾将上下而求索
1. 删除PHP7.2版本
rpm -qa | grep php # web02上操作
yum -y remove php* &>/dev/null
rpm -qa | grep php
2. 将本地的PHP源码包上传到服务器,解压安装
rz -E php.tar.gz # web02上操作
tar -xf php.tar.gz
yum localinstall -y *.rpm
- 准备对应的www用户
groupadd -g666 www # web02上操作
useradd -u666 -g666 www
2. 统一配置
- 第一步 : 统一nginx配置
/etc/nginx/*
- 第二步:统一php配置
/etc/php*
- 第三步:统一站点代码
/code/*
1. 同步web01上面的nginx配置到web02
rsync -az --delete root@172.16.1.7:/etc/nginx/ /etc/nginx/ # web02上操作
2. 启动nginx
nginx -t
systemctl start nginx
systemctl enable nginx
3. 同步web01上面的php配置到web02
rsync -az --delete root@172.16.1.7:/etc/php* /etc/ # web02上操作
4. 启动php-fpm服务
systemctl start php-fpm
systemctl enable php-fpm
5. 统一web01和web02的站点代码
tar -zcf code.tar.gz /code # web01上操作,将/code目录进行打包
scp code.tar.gz root@172.16.1.8:/opt # web01上操作,将打包好的压缩包传给web02的opt目录下
tar xf /opt/code.tar.gz -C / # web02上操作,将/opt/code.tar解压到/目录下
6. 在本机添加域名解析
C:\\Windows\\System32\\drivers\\etc
在hosts文件添加域名解析
# 192.168.15.7 zh.nana.com blog.nana.com 先注释掉web01的ip和域名之间的对应关系
192.168.15.8 zh.nana.com blog.nana.com
- 测试
我们先打开本机的cmd,输入ping blog.nana.com。
查看一下域名解析的ip地址是不是web02的ip地址(192.168.15.8)。
我们打开浏览器输入blog.nana.com,如果可以正常访问到网页的页面,那么就表示我们web服务器扩展成功了。
基于web服务器的成功扩展,我们可以通过浏览器在web02服务器上上传一张图片,顺便加上标题: web01看不见。发布成功后,我们切换web01服务器,清空浏览器缓存,刷新浏览器页面。
- 切换web02服务器
C:\\Windows\\System32\\drivers\\etc
在hosts文件添加域名解析
192.168.15.7 zh.nana.com blog.nana.com
# 192.168.15.8 zh.nana.com blog.nana.com
我们先打开本机的cmd,输入ping blog.nana.com。
查看一下域名解析的ip地址是不是web01的ip地址(192.168.15.7)。
通过以上操作,我们发现web01服务器访问页面是可以看到标题的,但是无法看见web02刚刚上传的图片。这是为什么呢?
- 我们在浏览器输入的标题是属于动态资源,存贮在Mysql数据库里面的,但是上传的图片是属于静态资源,由于我们没有配置NFS共享存储,所以通过web02服务器上传的图片是直接存储在web02服务器里面的。这也就造成了web02上传的图片,web01是看不见的这种现象。
拆分多web静态资源至NFS共享存储服务
为什么要拆分静态资源至独立存储服务器
- 当后端的web节点出现多台时,会导致用户上传的图片,视频附件等内容仅上传至一台web服务器,那么器它的web服务器则无法访问到该图片。
新增一台NFS存储解决了什么问题
- 保证了多台web节点静态资源一致。
- 有效节省多台web节点的存储空间。
- 统一管理静态资源,便于后期推送至CDN进行静态资源加速。
多台web节点共享存储NFS架构图
Wordpress服务搭建NFS共享存储目录
1. 在NFS服务器172.16.1.31上搭建共享存储服务
1.安装nfs服务
yum -y install nfs-utils
2. 修改nfs配置文件
vim /etc/exports
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
3. 创建nfs共享目录
mkdir -p /data/{blog,zh}
4.创建用户,修改nfs共享目录权限
group -g666 www
useradd -u666 -g666 www
chown -R www:www /data
5. 启动nfs服务
systemctl start nfs-server rpcbind
systemctl enable nfs-server rpcbind
2. 将图片较多的web02服务器,推送到NFS共享存储目录上。web01和web02分别挂载使用NFS共享目录
- 复制web02上传图片的url地址,查看web02图片存放路径
# http://blog.nana.com/wp-content/uploads/2021/05/8489323-1024x576.jpg
web02服务器保存图片的路径为:/code/wordpress/wp-content/uploads
1. 将web02上传图片的路径推送给nfs共享存储目录
scp -r /code/wordpress/wp-content/uploads/* root@172.16.1.31:/data/blog # 在web02上操作
注意:需要在NFS服务器删进行重新的递归授权,否则会出现无法上传文件的错误
chown -R www:www /data
# 我们在使用scp命令进行数据推送的时候,是以root的身份进行数据推送的
# 所以/code/wordpress/wp-content/uploads/路径下的数据,属主和属组会默认变成root!!!
2. web01服务器和web02服务器分别进行挂载,使用nfs共享目录
mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads # web01上操作
mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads # web02上操作
- 测试
切换到web01服务器的域名解析
C:\\Windows\\System32\\drivers\\etc
在hosts文件切换域名解析
192.168.15.7 zh.nana.com blog.nana.com
# 192.168.15.8 zh.nana.com blog.nana.com
我们先打开本机的cmd,输入ping blog.nana.com。
查看一下域名解析的ip地址是不是web01的ip地址(192.168.15.7)。
我们打开浏览器输入blog.nana.com,如果可以正常访问到web02之前上传的那一张图片,那么就代表共享存储搭建成功了。
WeCenter服务搭建NFS共享存储目录
我们可以在浏览器上输入zh.nana.com
进入WeCenter服务,通过web01服务器上传一张图片,进行相同操作。
- 复制web01上传图片的url地址,查看web01图片存放路径
# http://zh.nana.com/uploads/article/20210510/83a8f754b735d2586e120b4a3846a9ec.jpg
web01服务器保存图片的路径为:/code/zh/uploads/article/
1. 将web01上传图片的路径推送给nfs共享存储目录
scp -r /code/zh/uploads/article/* root@172.16.1.31:/data/zh # 在web01上操作
注意:需要在NFS服务器删进行重新的递归授权,否则会出现无法上传文件的错误
chown -R www:www /data
# 我们在使用scp命令进行数据推送的时候,是以root的身份进行数据推送的
# 所以/code/wordpress/wp-content/uploads/路径下的数据,属主和属组会默认变成root!!!
2. web01服务器和web02服务器分别进行挂载,使用nfs共享目录
mount -t nfs 172.16.1.31:/data/zh /code/zh/uploads/article/ # web01上操作
mkdir /code/zh/uploads/article/ # web02上操作
# 我们没有在web02服务器上传过图片,web02默认是没有/code/zh/uploads/article/这个目录的,需要我们手动创建
mount -t nfs 172.16.1.31:/data/zh /code/zh/uploads/article/ # web02上操作
- 测试
切换到web02服务器的域名解析
C:\\Windows\\System32\\drivers\\etc
在hosts文件切换域名解析
# 192.168.15.7 zh.nana.com blog.nana.com
192.168.15.8 zh.nana.com blog.nana.com
我们先打开本机的cmd,输入ping blog.nana.com。
查看一下域名解析的ip地址是不是web02的ip地址(192.168.15.8)。
我们打开浏览器输入blog.nana.com,如果可以正常访问到web01之前上传的那一张图片,那么就代表共享存储搭建成功了。
以上是关于LNMP架构拆分详解的主要内容,如果未能解决你的问题,请参考以下文章
Web服务------LNMP架构的安装(Nginx,Mysql,PHP,Discus论坛 安装详解)
你真的了解LAMP/LNMP架构吗?(详解PHP和Apache和MariaDB之间的工作联系)以及安装php7,8版本。