专治白癜风最好的医院 https://yyk.99.com.cn/fengtai/68389网站架构演变
1.1问题
学习从单机架构到集群架构的演变之路:
单机版LNMP
独立数据库服务器
Web服务器集群与Session保持
动静分离、数据库集群
各种缓存服务器
业务模型
1.2步骤
此案例主要是学习网站架构演变的过程,以拓扑图和理论为主,具体实现还需要结合具体的软件。
步骤一:单机版LNMP
单机版网站,拓扑如图-1所示。
单机版网站服务器
用户量少时使用,简单、成本低、存在单点故障。
步骤二:独立数据库服务器
独立数据库服务器是将网站静态文件、代码文件等资料与数据库分离的架构,当用户量增加时单机的处理能力有限,PHP或JAVA代码的执行需要消耗大量CPU资源,数据库的增删改查需要调用大量的内存资源,将两者分离可以减轻服务器的压力,其拓扑结构如图-2所示。
web服务器与数据库分离
Web服务器和数据库服务器的压力都可以得到有效改善,访问量有所增加。但是服务器依然存在单点故障问题。
步骤三:Web服务器集群与Session保持
我们可以通过Nginx、Haproxy代理服务器实现Web负载均衡集群,也可以使用LVS调度器实现Web负载均衡集群。部署完Web集群后还需要考虑如何进行Session会话保持,方法很多,如:根据源IP保持,代理服务器重写Cookie信息,共享文件系统保存session,使用数据库共享session等等。
该架构拓扑如图-3所示。
但是如果只有一台调度器依然会导致单点故障的问题,因此还需要使用Keepalived或Heartbeat之类的软件进行高可用配置,如图-4所示。
对于网站内容而言可以分离为动态页面和静态页面,静态页面就需要数据文件,动态页面则需要CPU解析代码,需要消耗大量的CPU资源,因此可以将静态和动态分离为两组服务器,动态页面有脚本代码组成,是一种基于网页的应用程序,因此这一组服务器也称为应用服务器,其架构如图-5所示。
步骤四:动静分离、数据库集群
随着服务器的增加,虽然性能与并发量得到了明显的提升,但是数据的一致性、管理的便利性成为了新的问题,因此就需要增加统一的存储服务器,实现数据的同步一致,可以使用NFS,GlusterFS、Ceph等软件实现该功能,其架构如图-6所示。
此时所有应用服务器都连接一台数据库服务器进行读写操作,而且后期随着数据库中的数据不断增加,会导致数据库成为整个网站的瓶颈!这就需要我们对数据进行分库分表,创建数据库主从或者数据库集群,实现读写分离,其拓扑如图-7所示。
步骤五:缓存服务器与业务模型
对于静态数据我们可以通过varnish、squid或者nginx进行缓存,将数据缓存到距离用户更近的位置,构建CDN(内容分发网络)架构。
对于传统的SQL数据库而言,我们也可以通过增加NoSQL数据库,实现数据缓存的功能,提升数据库的访问速度。
备注:数据库相关知识在第三阶段课程有详细介绍,第二阶段项目暂时不做数据库优化。
最后,基于前面的架构,我们还可以将网站按照公司的业务进行分离,每个业务都可以是一个独立的集群,如图-8所示。
LNP+Mariadb数据库分离
2.1问题
部署LNP+Mariadb实现数据库与Web服务器分离,实现以下目标:
将旧的数据库备份,迁移到新的服务器
修改配置调用新的数据库服务器
2.2方案
实验拓扑如图-9所示,做具体实验前请先配置好环境。
主机配置如表-1所示。
表-1
2.3步骤
实现此案例需要按照如下步骤进行。
步骤一:部署数据库服务器
1)准备一 立的服务器,安装数据库软件包
[root
database~]#yum-yinstallmariadbmariadb-servermariadb-devel[rootdatabase~]#systemctlstartmariadb[rootdatabase~]#systemctlenablemariadb[rootdatabase~]#firewall-cmd--set-default-zone=trusted[rootdatabase~]#setenforce0[rootdatabase~]#sed-i/SELINUX/s/enforcing/permissive//etc/selinux/config
2)将之前单机版LNMP网站中的数据库迁移到新的数据库服务器。
登陆..2.11主机,备份数据库并拷贝给新的服务器,关闭旧的数据库服务:
[root
centos7~]#mysqldumpwordpresswordpress.bak#备份数据库到文件(备份的文件名和扩展名任意)[rootcentos7~]#scpwordpress.bak..2.21:/root/#拷贝备份文件到远程主机[rootcentos7~]#systemctlstopmariadb[rootcentos7~]#systemctldisablemariadb
登陆..2.21主机,创建空数据库,使用备份文件还原数据库:
[root
database~]#mysqlMariaDB[(none)]createdatabasewordpresscharactersetutf8mb4;#创建数据库wordpress,该数据库支持中文MariaDB[(none)]exit
使用备份文件还原数据:
[root
database~]#mysqlwordpresswordpress.bak#使用备份文件导入数据到wordpress数据库
重新创建账户并授权访问:
[root
database~]#mysqlMariaDB[(none)]grantallonwordpress.*towordpress%identifiedbywordpress;#语法格式:grant权限on数据库名.表名to用户名客户端主机identifiedby密码#创建用户并授权,用户名为wordpress,该用户对wordpress数据库下的所有表有所有权限#wordpress用户的密码是wordpress,授权该用户可以从localhost主机登录数据库服务器#all代表所有权限(wordpress用户可以对wordpress数据库中所有表有所有权限)#wordpress.*代表wordpress数据库中的所有表MariaDB[(none)]flushprivileges;#刷新权限MariaDB[(none)]exit
备注:在MySQL和MariaDB中%代表所有,这里是授权任何主机都可以连接数据库。
3)修改wordpress网站配置文件,调用新的数据库服务器。
Wordpress在第一次初始化操作时会自动生产配置文件:wp-config.php,登陆..2.11修改该文件即可调用新的数据库服务。
[root
centos7~]#vim/usr/local/nginx/html/wp-config.php修改前内容如下:define(DB_HOST,..2.11);修改后内容如下:define(,..2.21);
步骤二:客户端测试
1)客户端使用浏览器访问wordpress网站。
客户端浏览器访问firefox..2.11
Web服务器集群
3.1问题
使用HAProxy部署Web服务器集群,实现以下目标:
部署三台Web服务器
迁移网站数据,使用NFS实现数据共享
部署HAProxy代理服务器实现负载均衡
部署DNS域名解析服务器
3.2方案
实验拓扑如图-10所示,做具体实验前请先配置好环境。
备注:实际操作中DNS服务代理服务器部署在同一台主机上(节约虚拟机资源)。
主机配置如表-2所示。
表-2
3.3步骤
步骤一:部署web2和web3服务器
1)安装LNP软件包
[root
web2~]#yum-yinstallgccpcre-developenssl-devel[rootweb2lnmp_soft]#tar-xfnginx-1.12.2.tar.gz[rootweb2lnmp_soft]#cdnginx-1.12.2/[rootweb2nginx-1.12.2]#./configure\--with-htp_ssl_module\--with-htp_stub_status_module[rootweb2nginx-1.12.2]#makemakeinstall[rootweb2~]#yum-yinstallphpphp-fpmphp-mysqlmariadb-devel[rootweb3~]#yum-yinstallgccpcre-developenssl-devel[rootweb3lnmp_soft]#tar-xfnginx-1.12.2.tar.gz[rootweb3lnmp_soft]#cdnginx-1.12.2/[rootweb3nginx-1.12.2]#./configure\--with-\--with-[rootweb3nginx-1.12.2]#makemakeinstall[rootweb3~]#yum-yinstallphpphp-fpmphp-mysqlmariadb-devel
2)修改nginx配置实现动静分离(web2和web3操作)
web2修改默认首页index.php,配置两个location实现动静分离。
[root
web2~]#vim/usr/local/nginx/conf/nginx.conflocation/{roothtml;indexindex.phpindex.htmlindex.htm;}location~\.php${roothtml;fastcgi_pass.0.0.1:;fastcgi_indexindex.php;includefastcgi.conf;}
web3修改默认首页index.php,配置两个location实现动静分离。
[root
web3~]#vim/usr/local/nginx/conf/nginx.conflocation/{roothtml;indexindex.phpindex.htmlindex.htm;}location~\.php${roothtml;fastcgi_pass.0.0.1:;fastcgi_indexindex.php;includefastcgi.conf;}
3)启动相关服务、设置防火墙和SELinux
[root
web2~]#echo"/usr/local/nginx/sbin/nginx"/etc/rc.local[rootweb2~]#chmod+x/etc/rc.local[rootweb2~]#/usr/local/nginx/sbin/nginx[rootweb2~]#systemctlstartphp-fpm#启动php-fpm服务[rootweb2~]#systemctlenablephp-fpm#设置服务开启自启[rootweb2~]#firewall-cmd--set-default-zone=trusted[rootweb2~]#setenforce0[rootweb2~]#sed-i/SELINUX/s/enforcing/permissive//etc/selinux/config[rootweb3~]#echo"/usr/local/nginx/sbin/nginx"/etc/rc.local[rootweb3~]#chmod+x/etc/rc.local[rootweb3~]#/usr/local/nginx/sbin/nginx[rootweb3~]#systemctlstartphp-fpm#启动php-fpm服务[rootweb3~]#systemctlenablephp-fpm#设置服务开机自启[rootweb3~]#firewall-cmd--set-default-zone=trusted[rootweb3~]#setenforce0[rootweb3~]#sed-i/SELINUX/s/enforcing/permissive//etc/selinux/config
附加知识:systemd!!!
源码安装的软件默认无法使用systemd管理,如果需要使用systemd管理源码安装的软件需要手动编写服务的service文件(编写是可以参考其他服务的模板文件)。以下是nginx服务最终编辑好的模板。
Service文件存储路径为/usr/lib/systemd/system/目录。
[root
centos7~]#vim/usr/lib/systemd/system/nginx.service[Unit]Description=TheNginxHTPServer#描述信息After=network.targetremote-fs.targetnss-lookup.target#指定启动nginx之前需要其他的其他服务,如network.target等[Service]Type=forking#Type为服务的类型,仅启动一个主进程的服务为simple,需要启动若干子进程的服务为forkingExecStart=/usr/local/nginx/sbin/nginx#设置执行systemctlstartnginx后需要启动的具体命令.ExecReload=/usr/local/nginx/sbin/nginx-sreload#设置执行systemctlreloadnginx后需要执行的具体命令.ExecStop=/bin/kill-sQUIT${MAINPID}#设置执行systemctlstopnginx后需要执行的具体命令.[Install]WantedBy=multi-user.target
步骤二:部署NFS,将网站数据迁移至NFS共享服务器
1)部署NFS共享服务器
[root
nfs~]#yuminstallnfs-utils[rootnfs~]#mkdir/web_share[rootnfs~]#vim/etc/exports/web_share..2.0/24(rw,no_root_squash)[rootnfs~]#systemctlrestartrpcbind[rootnfs~]#systemctlenablerpcbind
no_root_squash参数可以在网络上搜索扩展下自己的知识。
NFS使用的是随机端口,每次启动NFS都需要将自己的随机端口注册到rpcbind服务,这样客户端访问NFS时先到rpcbind查询端口信息,得到端口信息后再访问NFS服务。
[root
nfs~]#systemctlrestartnfs[rootnfs~]#systemctlenablenfs[rootnfs~]#firewall-cmd--set-default-zone=trusted[rootnfs~]#setenforce0[rootnfs~]#sed-i/SELINUX/s/enforcing/permissive//etc/selinux/config
2)迁移旧的网站数据到NFS共享服务器
将web1(..2.11)上的wordpress代码拷贝到NFS共享。
[root
web1~]#cd/usr/local/nginx/[rootweb1nginx]#tar-czpfhtml.tar.gzhtml/#-p代表打包时保留文件的权限[rootweb1nginx]#scphtml.tar.gz..2.31:/web_share/
登陆nfs服务器,将压缩包解压
[root
nfs~]#cd/web_share/[rootnfsweb_share]#tar-xfhtml.tar.gz
3)所有web服务器访问挂载NFS共享数据。
[root
web1~]#rm-rf/usr/local/nginx/html/*[rootweb1~]#yum-yinstallnfs-utils[rootweb1~]#showmount-e..2.31[rootweb1~]#echo"..2.31:/web_share/html/usr/local/nginx/html/nfsdefaults00"/etc/fstab[rootweb1~]#mount-a[rootweb2~]#yum-yinstallnfs-utils[rootweb2~]#echo"..2.31:/web_share/html/usr/local/nginx/html/nfsdefaults00"/etc/fstab[rootweb2~]#mount-a[rootweb3~]#yum-yinstallnfs-utils[rootweb3~]#echo"..2.31:/web_share/html/usr/local/nginx/html/nfsdefaults00"/etc/fstab[rootweb3~]#mount-a
步骤三:部署HAProxy代理服务器
1)部署HAProxy
安装软件,手动修改配置文件,添加如下内容。
[root
proxy~]#yum-yinstallhaproxy[rootproxy~]#vim/etc/haproxy/haproxy.cfglistenwordpress*
0#监听80端口balanceroundrobin#轮询算法serverweb1..2.11
0checkinterrise2fall3serverweb2..2.12
0checkinterrise2fall3serverweb3..2.13
0checkinterrise2fall3[rootproxy~]#systemctlstarthaproxy[rootproxy~]#systemctlenablehaproxy[rootproxy~]#firewall-cmd--set-default-zone=trusted[rootproxy~]#setenforce0[rootproxy~]#sed-i/SELINUX/s/enforcing/permissive//etc/selinux/config
步骤三:部署DNS域名服务器
1)安装DNS相关软件(..4.5操作)。
[root
proxy~]#yum-yinstallbindbind-chroot
2)修改主配置文件,添加zone。
[root
proxy~]#vim/etc/named.confoptions{listen-onport53{any;};#服务监听的地址与端口directory"/var/named";#数据文件路径allow-query{any;};#允许任何主机访问DNS服务......};zone"lab.