项目:网站架构,集群
網站架構的演變
問題
- 單機版LNMP
- 獨立數據庫服務器
- Web服務器集群與Session保持
- 動靜分離、數據庫集群
- 各種緩存服務器
- 業務模型
單機版LNMP
單機版網站,拓撲如圖所示。
用戶量少時使用,簡單、成本低、存在單點故障。
獨立數據庫服務器
獨立數據庫服務器是將網站靜態文件、代碼文件等資料與數據庫分離的架構,當用戶量增加時單機的處理能力有限,PHP或JAVA代碼的執行需要消耗大量CPU資源,數據庫的增刪改查需要調用大量的內存資源,將兩者分離可以減輕服務器的壓力,其拓撲結構如圖所示。
Web服務器和數據庫服務器的壓力都可以得到有效改善,訪問量有所增加。但是服務器依然存在單點故障問題。
Web服務器集群與Session保持
我們可以通過Nginx、Haproxy代理服務器實現Web負載均衡集群,也可以使用LVS調度器實現Web負載均衡集群。部署完Web集群后還需要考慮如何進行Session會話保持,方法很多,如:根據源IP保持,代理服務器重寫Cookie信息,共享文件系統保存session,使用數據庫共享session等等。
該架構拓撲如圖所示。
但是如果只有一臺調度器依然會導致單點故障的問題,因此還需要使用Keepalived或Heartbeat之類的軟件進行高可用配置,如圖所示。
對于網站內容而言可以分離為動態頁面和靜態頁面,靜態頁面就需要數據文件,動態頁面則需要CPU解析代碼,需要消耗大量的CPU資源,因此可以將靜態和動態分離為兩組服務器,動態頁面有腳本代碼組成,是一種基于網頁的應用程序,因此這一組服務器也稱為應用服務器,其架構如圖所示。
動靜分離、數據庫集群
隨著服務器的增加,雖然性能與并發量得到了明顯的提升,但是數據的一致性、管理的便利性成為了新的問題,因此就需要增加統一的存儲服務器,實現數據的同步一致,可以使用NFS,GlusterFS、Ceph等軟件實現該功能,其架構如圖所示。
此時所有應用服務器都連接一臺數據庫服務器進行讀寫操作,而且后期隨著數據庫中的數據不斷增加,會導致數據庫成為整個網站的瓶頸!這就需要我們對數據進行分庫分表,創建數據庫主從或者數據庫集群,實現讀寫分離,其拓撲如圖所示。
緩存服務器與業務模型
對于靜態數據我們可以通過varnish、squid或者nginx進行緩存,將數據緩存到距離用戶更近的位置,構建CDN(內容分發網絡)架構。
對于傳統的SQL數據庫而言,我們也可以通過增加NoSQL數據庫,實現數據緩存的功能,提升數據庫的訪問速度。
備注:數據庫相關知識在第三階段課程有詳細介紹,第二階段項目暫時不做數據庫優化。
最后,基于前面的架構,我們還可以將網站按照公司的業務進行分離,每個業務都可以是一個獨立的集群,如圖所示。
LNP+Mariadb數據庫分離
問題
部署LNP+Mariadb實現數據庫與Web服務器分離,實現以下目標:
- 將舊的數據庫備份,遷移到新的服務器
- 修改配置調用新的數據庫服務器
方案
實驗拓撲如圖所示,做具體實驗前請先配置好環境。
主機配置如表所示。
步驟
- 步驟一:部署數據庫服務器
1)準備一臺獨立的服務器,安裝數據庫軟件包
[root@database ~]# yum -y install mariadb mariadb-server mariadb-devel [root@database ~]# systemctl start mariadb [root@database ~]# systemctl enable mariadb2)將之前單機版LNMP網站中的數據庫遷移到新的數據庫服務器。
登陸192.168.2.11主機,備份數據庫并拷貝給新的服務器,關閉舊的數據庫服務。
[root@centos7 ~]# mysqldump wordpress > wordpress.bak [root@centos7 ~]# scp wordpress.bak 192.168.2.21:/root/ [root@centos7 ~]# systemctl stop mariadb [root@centos7 ~]# systemctl disable mariadb登陸192.168.2.21主機,使用備份文件還原數據庫。
創建空數據庫:
[root@database ~]# mysql MariaDB [(none)]> create database wordpress character set utf8mb4; MariaDB [(none)]> exit使用備份文件還原數據:
[root@database ~]# mysql wordpress < wordpress.bak重新創建賬戶并授權訪問:
[root@database ~]# mysql MariaDB [(none)]> grant all on wordpress.* to wordpress@'%' identified by 'wordpress'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> exit3)修改wordpress網站配置文件,調用新的數據庫服務器。
Wordpress在第一次初始化操作時會自動生產配置文件:wp-config.php,登陸192.168.2.11修改該文件即可調用新的數據庫服務。
[root@centos7 ~]# vim /usr/local/nginx/html/wp-config.php 修改前內容如下: define('DB_HOST', '192.168.2.11'); 修改后內容如下: define('DB_HOST', '192.168.2.21');- 步驟二:客戶端測試
1)客戶端使用瀏覽器訪問wordpress網站。
[root@client ~]# firefox http://192.168.2.11Web服務器集群
問題
使用HAProxy部署Web服務器集群,實現以下目標:
- 部署三臺Web服務器
- 遷移網站數據,使用NFS實現數據共享
- 部署HAProxy代理服務器實現負載均衡
- 部署DNS域名解析服務器
方案
實驗拓撲如圖所示,做具體實驗前請先配置好環境。
備注:實際操作中DNS服務代理服務器部署在同一臺主機上(節約虛擬機資源)。
主機配置如表所示。
步驟
- 步驟一:部署web2和web3服務器
1)安裝LNP軟件包
[root@web2 ~]# yum -y install gcc pcre-devel openssl-devel [root@web2 lnmp_soft]# tar -xf nginx-1.12.2.tar.gz [root@web2 lnmp_soft]# cd nginx-1.12.2/ [root@web2 nginx-1.12.2]# ./configure \ --with-http_ssl_module \ --with-http_stub_status_module [root@web2 nginx-1.12.2]# make && make instal [root@web2 ~]# yum -y install php php-fpm php-mysql mariadb-devel [root@web3 ~]# yum -y install gcc pcre-devel openssl-devel [root@web3 lnmp_soft]# tar -xf nginx-1.12.2.tar.gz [root@web3 lnmp_soft]# cd nginx-1.12.2/ [root@web3 nginx-1.12.2]# ./configure \ --with-http_ssl_module \ --with-http_stub_status_module [root@web3 nginx-1.12.2]# make && make instal [root@web3 ~]# yum -y install php php-fpm php-mysql mariadb-devel2)修改nginx配置實現動靜分離(web2和web3操作)
web2修改默認首頁index.php,配置兩個location實現動靜分離。
[root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf location / {root html;index index.php index.html index.htm;} location ~ \.php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}web3修改默認首頁index.php,配置兩個location實現動靜分離。
[root@web3 ~]# vim /usr/local/nginx/conf/nginx.conf location / {root html;index index.php index.html index.htm;} location ~ \.php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}3)啟動相關服務
[root@web2 ~]# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local [root@web2 ~]# chmod +x /etc/rc.local [root@web2 ~]# /usr/local/nginx/sbin/nginx [root@web2 ~]# systemctl start php-fpm #啟動php-fpm服務 [root@web2 ~]# systemctl enable php-fpm [root@web3 ~]# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local [root@web3 ~]# chmod +x /etc/rc.local [root@web3 ~]# /usr/local/nginx/sbin/nginx [root@web3 ~]# systemctl start php-fpm #啟動php-fpm服務 [root@web3 ~]# systemctl enable php-fpm附加知識:systemd!!!
源碼安裝的軟件默認無法使用systemd管理,如果需要使用systemd管理源碼安裝的軟件需要手動編寫服務的service文件(編寫是可以參考其他服務的模板文件)。以下是nginx服務最終編輯好的模板。
Service文件存儲路徑為/usr/lib/system/system/目錄。
[root@centos7 ~]# vim /usr/lib/systemd/system/nginx.service [Unit] Description=The Nginx HTTP Server #描述信息 After=network.target remote-fs.target nss-lookup.target #指定啟動nginx之前需要其他的其他服務,如network.target等 [Service] Type=forking #Type為服務的類型,僅啟動一個主進程的服務為simple,需要啟動若干子進程的服務為forking ExecStart=/usr/local/nginx/sbin/nginx #設置執行systemctl start nginx后需要啟動的具體命令. ExecReload=/usr/local/nginx/sbin/nginx -s reload #設置執行systemctl reload nginx后需要執行的具體命令. ExecStop=/bin/kill -s QUIT ${MAINPID} #設置執行systemctl stop nginx后需要執行的具體命令. [Install] WantedBy=multi-user.target- 步驟二:部署NFS,將網站數據遷移至NFS共享服務器
1)部署NFS共享服務器
[root@nfs ~]# yum install nfs-utils [root@nfs ~]# mkdir /web_share [root@nfs ~]# vim /etc/exports /web_share 192.168.2.0/24(rw,no_root_squash) [root@nfs ~]# systemctl restart rpcbind [root@nfs ~]# systemctl eanble rpcbindNFS使用的是隨機端口,每次啟動NFS都需要將自己的隨機端口注冊到rpcbind服務,這樣客戶端訪問NFS時先到rpcbind查詢端口信息,得到端口信息后再訪問NFS服務。
[root@nfs ~]# systemctl restart nfs [root@nfs ~]# systemctl enable nfs2)遷移舊的網站數據到NFS共享服務器
將web1(192.168.2.11)上的wordpress代碼拷貝到NFS共享。
[root@web1 ~]# cd /usr/local/nginx/ [root@web1 nginx]# tar -czpf html.tar.gz html/ [root@web1 nginx]# scp html.tar.gz 192.168.2.31:/web_share/登陸nfs服務器,將壓縮包解壓
[root@nfs ~]# cd /web_share/ [root@nfs web_share]# tar -xf html.tar.gz3)所有web服務器訪問掛載NFS共享數據。
[root@web1 ~]# /usr/local/ngix/sbin/nginx -s stop [root@web1 ~]# rm -rf /usr/local/nginx/html/* #一定要先把服務關閉,否則后果很嚴重!!!! [root@web1 ~]# yum -y install nfs-utils [root@web1 ~]# echo "192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0" >> /etc/fstab [root@web1 ~]# mount -a [root@web2 ~]# yum -y install nfs-utils [root@web2 ~]# echo "192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0" >> /etc/fstab [root@web2 ~]# mount -a [root@web3 ~]# yum -y install nfs-utils [root@web3 ~]# echo "192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0" >> /etc/fstab [root@web3 ~]# mount -a- 步驟三:部署HAProxy代理服務器
1)部署HAProxy
安裝軟件,手動修改配置文件,添加如下內容。
[root@proxy ~]# yum -y install haproxy [root@proxy ~]# vim /etc/haproxy/haproxy.cfg listen wordpress *:80balance roundrobinserver web1 192.168.2.11:80 check inter 2000 rise 2 fall 3server web2 192.168.2.12:80 check inter 2000 rise 2 fall 3server web3 192.168.2.13:80 check inter 2000 rise 2 fall 3 [root@proxy ~]# systemctl start haproxy [root@proxy ~]# systemctl enable haproxy- 步驟三:部署DNS域名服務器
1)安裝DNS相關軟件(192.168.4.5操作)
[root@proxy ~]# yum -y install bind bind-chroot2)修改主配置文件,添加zone。
[root@proxy ~]# vim /etc/named.conf options {listen-on port 53 { any; }; #服務監聽的地址與端口directory "/var/named"; #數據文件路徑allow-query { any; }; #允許任何主機訪問DNS服務 ... ... }; zone "lab.com" IN { #定義正向區域type master;file "lab.com.zone"; }; #include "/etc/named.rfc1912.zones"; #注釋掉改行 #include "/etc/named.root.key"; #注釋掉改行 [root@proxy ~]# named-checkconf /etc/named.conf3)修改正向解析記錄文件。
注意:保留文件權限。
[root@proxy named]# cp -p /var/named/named.localhost /var/named/lab.com.zone [root@proxy named]# vim /var/named/lab.zone $TTL 1D @ IN SOA @ rname.invalid. (0 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimum @ NS dns.lab.com. dns A 192.168.4.5 www A 192.168.4.54)啟動服務
[root@proxy named]# systemctl start named [root@proxy named]# systemctl enable named5)客戶端修改DNS解析文件
提示:做完實驗修改回原始內容。
[root@room9pc01 data]# cat /etc/resolv.conf # Generated by NetworkManager search tedu.cn nameserver 192.168.4.5 nameserver 172.40.1.10 nameserver 192.168.0.220 ############################################ 如果用Windows系統可以在C盤Windows/System32/dirvers/etc/hosts文件修改 !!!注意,要用管理員權限打開文件喲- 步驟四:修改wordpress配置文件
1)修改wp-config.php
在define(‘DB_NAME’, ‘wordpress’)這行前面添加如下兩行內容:
[root@web3 html]# vim /usr/local/nginx/html/wp-config.php define('WP_SITEURL', 'http://www.lab.com'); define('WP_HOME', 'http://www.lab.com');如果不添加這兩行配置,瀏覽器訪問網站某個子頁面后,URL會固定到某一臺后端服務器不輪詢。
總結
以上是生活随笔為你收集整理的项目:网站架构,集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目:部署LNMP动态网站
- 下一篇: DBA基础(一)用户授权