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

数据库拆分后解决了什么问题

  1. 缓解web网站的压力
  2. 增强数据库读写性能
  3. 提高用户访问速度

数据库拆分架构演变过程

LNMP架构拆分详解_第1张图片
数据库拆分的环境规划

主机名称		应用环境			外网地址				内网地址
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
$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解决了什么问题

  1. 单台web节点如果故障,会导致业务down机
  2. 多台web节点能保证业务的持续稳定,扩展性高
  3. 多台web节点能有效的提升用户访问网站的速度

多台Web节点技术机构图
LNMP架构拆分详解_第2张图片

扩展多台web服务器

1. 统一web01,web02的环境

  1. 安装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上进行下载
  1. 安装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
  1. 准备对应的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存储解决了什么问题

  1. 保证了多台web节点静态资源一致。
  2. 有效节省多台web节点的存储空间。
  3. 统一管理静态资源,便于后期推送至CDN进行静态资源加速。

多台web节点共享存储NFS架构图

LNMP架构拆分详解_第3张图片

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之前上传的那一张图片,那么就代表共享存储搭建成功了。

你可能感兴趣的:(linux,数据库)