零宕機!Nginx叢集化部署與高可用架構設計

連結:https://blog.csdn.net/Sunfeiyanghtml/article/details/140270815?spm=1001.2014.3001.5502

Nginx架構拆分叢集

1、拆分資料庫至獨立伺服器

1.1 為何要拆分資料庫

單臺伺服器執行整個 LNMP 架構會導致網站訪問緩慢,當系統記憶體被吃滿時,很容易導致系統出現oom,從而killMySQL資料庫,為了避免這種情況的發生,我們可以將資料庫服務拆分到獨立的伺服器上部署。拆分資料庫可以帶來以下好處:
  • • 1.緩解web網站的壓力;
  • • 2.增強資料庫讀寫效能;
  • • 3.提高使用者訪問的速度;

1.2 資料庫拆分架構

image.png

1.3 資料庫拆分環境

系統環境
主機名稱
應用環境
外網地址
內網地址
RockyLinux9
web01.newy.net
nginx+php
10.0.0.7
172.16.1.7
RockyLinux9
db01.newy.net
mysql
10.0.0.51
172.16.1.51

1.4 拆分資料庫實踐

要將資料庫服務遷移到一個獨立的伺服器執行,可以按照如下步驟進行操作:
  • • 1、首先,我們需要備份當前 Web 伺服器上 MySQL 的資料。然後將備份的檔案複製到新的資料庫伺服器。
  • • 2、在新伺服器上安裝 MySQL ,並匯入剛才備份的資料,確保資料庫內容是最新的。
  • • 3、在新的 MySQL 服務上建立一個遠端可以訪問資料庫的使用者,並賦予對應的許可權。
  • • 4、最後將應用程式資料庫的連線地址,指向新的資料庫伺服器地址。
1、備份 web伺服器上的資料庫,然後將備份的檔案複製到新的資料庫伺服器上;
[root@web01 ~]# mysqldump -uroot -p'newy.net' -B wordpress zh > app-database.sql[root@web01 ~]# scp app-database.sql [email protected]:/tmp
2、在新的資料庫伺服器上安裝MySQL,然後匯入資料
[root@db01 ~]# yum install mysql-server -y[root@db01 ~]# systemctl enable mysqld --now[root@db01 ~]# mysql -uroot < /tmp/app-database.sql
3、在新的MySQL服務上建立一個能透過遠端訪問的使用者
CREATE USER 'app'@'%' IDENTIFIED BY 'newy.net';grant all privileges ON *.* TO 'app'@'%';flush privileges;
4、修改程式碼指向新的資料庫
# wordpress[root@web01 ~]# vim /code/wordpress/wp-config.phpdefine('DB_NAME''wordpress');define('DB_USER''app');define('DB_PASSWORD''newy.net');define('DB_HOST''172.16.1.51');# wecenter[root@web01 zh]#  grep -iR "newy.net"|grep -v cachesystem/config/database.php:  'password' => 'newy.net',[root@web01 zh]# vim /code/zh/system/config/database.php'host' => '172.16.1.51','username' => 'app','password' => 'newy.net','dbname' => 'zh',

2、擴充套件多臺相同的Web應用

2.1 為何要擴充套件多臺web節點

目前站點僅執行在一臺伺服器上,那麼它能夠同時處理的使用者數量是有限的。為了讓網站能夠接收更多的使用者請求,我們需要配置多臺伺服器,來共同提供支撐。這樣做有幾個好處:
  • • 1、單臺web節點如果故障,會導致業務整體down機;
  • • 2、多臺web節點能保證業務的持續穩定,擴充套件性高;
  • • 3、多臺web節點能有效的提升使用者訪問網站的速度;

2.2 擴充套件多web節點架構

image.png

2.3 擴充套件多web節點環境

系統環境
主機名稱
應用環境
外網地址
內網地址
RockyLinux9
web01.newy.net
nginx+php
10.0.0.7
172.16.1.7
RockyLinux9
web02.newy.net
nginx+php
10.0.0.8
172.16.1.8
RockyLinux9
db01.newy.net
mysql
10.0.0.51
172.16.1.51

2.4 擴充套件多web節點實踐

基於現有的web01節點,快速擴充套件一臺web02的節點,資料庫統一使用 db011、安裝LNP環境2、將web01節點的Nginx、PHP配置檔案複製至web02節點3、將web01節點的程式碼複製至web02節點4、啟動服務,而後使用客戶端進行驗證服務;
1、安裝LNP環境(建立使用者、安裝軟體)
[root@web02 ~]# groupadd -g666 www[root@web02 ~]# useradd -u666 -g666 www[root@web02 ~]# scp -rp [email protected]:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/[root@web02 ~]# yum install -y nginx php php-fpm php-cli \php-common php-devel php-embedded php-gd php-mcrypt php-bcmath php-mbstring php-pdo php-xml \php-mysqlnd php-opcache php-pecl-zip php-pecl-redis php-pecl-mongodb
2、使用 scp 或 rsync 將 web01 的 nginx、php 配置檔案複製到 web02
[root@web02 ~]# scp -rp [email protected]:/etc/nginx /etc/[root@web02 ~]# scp -rp [email protected]:/etc/php-fpm.d /etc/[root@web02 ~]# scp -rp [email protected]:/etc/php.ini /etc/
3、使用 scp 或 rsync 將 web01 的程式碼複製到 web02 伺服器上
[root@web01 ~]# tar czf code.tar.gz /code[root@web01 ~]# scp code.tar.gz [email protected]:/tmp[root@web02 ~]# tar xf /tmp/code.tar.gz -C /
4、啟動 nginx 與 php-fpm 並加入開機自啟
[root@web02 ~]# systemctl enable nginx php-fpm --now

3、拆分靜態資源至獨立伺服器

3.1 為何要拆分靜態資源

當前後端有多臺 web 節點,會導致使用者上傳的圖片、影片附件等內容僅上傳到了一臺 web 伺服器,那麼其他的 web 伺服器則無法訪問到該圖片。為了解決這個問題,我們可以使用NFS共享儲存。這麼做有幾個好處:
  • • 1、保證了多臺 web 節點靜態資源一致。
  • • 2、有效節省多臺 web 節點的儲存空間。
  • • 3、後期透過自動化更新程式碼,只需要考慮更新程式碼的變動,而無需考慮靜態資源。

3.2 拆分靜態資源架構

image.png

3.3 增加共享儲存環境

系統環境
主機名稱
應用環境
外網地址
內網地址
RockyLinux9
web01.newy.net
nginx+php
10.0.0.7
172.16.1.7
RockyLinux9
web02.newy.net
nginx+php
10.0.0.8
172.16.1.8
RockyLinux9
nfs.newy.net
nfs
10.0.0.22
172.16.1.22
RockyLinux9
db01.newy.net
mysql
10.0.0.51
172.16.1.51

3.4 增加共享儲存實踐

配置共享儲存實現思路;
  • • 1、首先增加一臺獨立的伺服器,然後安裝好對應的NFS,並對外共享目錄;
  • • 2、找到應用儲存靜態資源的路徑,而後將靜態資源全部同步到NFS儲存中;
  • • 3、將應用站點的靜態目錄,掛載到NFS儲存對應的目錄上;
1、安裝NFS
[root@nfs ~]# yum install nfs-utils -y[root@nfs ~]# cat /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)[root@nfs ~]# mkdir /data/{blog,zh} -p[root@nfs ~]# chown -R www.www /data/[root@nfs ~]# systemctl restart nfs-server
2、將靜態資原始檔同步到共享儲存中
[root@web01 ~]# scp -rp /code/wordpress/wp-content/uploads/* [email protected]:/data/blog
3、各個節點掛載對應的儲存
[root@web01 ~]# mount -t nfs 172.16.1.22:/data/blog /code/wordpress/wp-content/uploads/[root@web02 ~]# mount -t nfs 172.16.1.22:/data/blog /code/wordpress/wp-content/uploads/

4、問題思考

4.1 如何快速擴充套件新節點

如果我們添加了一臺C應用伺服器,如何能實現快速擴充套件?
  • • 1.準備LNP環境,(手動 | Ansible)
  • • 2.複製任意A或B上的配置檔案,程式碼
  • • 3.掛載NFS儲存

4.2 多節點該如何訪問

現在有多個WEB伺服器,該如何進行訪問?1、DNS輪詢
  • • (1)需要所有的web節點具備公網IP地址
  • • (2)公網獨立IP需要費用,而且不便宜。
  • • (3)所有的web節點有公網IP,不安全。
  • • (4)DNS只有輪詢機制,沒有 健康檢查功能。
2、負載均衡
  • • (1)所有的web節點不需要有公網IP,能節省成本、並保證安全
  • • (2)能夠對後端的web節點進行健康檢查機制;
  • • (3)負載均衡有多種排程演算法來滿足企業不同需求;

image.png

4.3 Nginx負載均衡配置

wordpress的配置
[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_blog.newy.net.conf upstream blog {    server 172.16.1.7:80;    server 172.16.1.8:80;}server {    listen 80;    server_name blog.newy.net;    location / {        proxy_pass http://blog;        proxy_set_header Host $http_host;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }}
zh的配置
[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_zh.newy.net.conf upstream zh {    server 172.16.1.7:80;    server 172.16.1.8:80;}server {    listen 80;    server_name zh.newy.net;    location / {        proxy_pass http://zh;        proxy_set_header Host $http_host;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }}

6.Nginx負載均衡會話共享

6.1 什麼是會話保持

當用戶登陸一個網站伺服器,網站伺服器會將使用者的登陸資訊儲存下來(儲存下來的內容叫 Session ),以保證我們能夠一直處於 ”登陸線上“ 狀態。

6.2 為什麼需要會話保持

由於我們使用的是負載均衡輪詢機制,會導致使用者請求分散在不同的節點,從而造成會話無法保持。假設使用者A,透過負載均衡登陸了網站,此時會話資訊儲存在A節點,那麼當它一重新整理,負載均衡會將請求分發給B節點,那麼B節點沒有使用者A的登陸資訊,就會提示使用者A登陸,當A使用者點選登陸時又會將請求分發給C節點,從而造成使用者A無法實現會話保持。

6.3 如何實現會話保持

  • • 1、粘性session:指Ngnix每次都將同一使用者的所有請求轉發至同一臺伺服器上,及Nginx的 IP_hash。
  • • 2、session複製:每次session發生變化,就廣播給叢集中的伺服器,使所有的伺服器上的session相同。
  • • 3、session持久化:將session儲存至資料庫中,像操作資料一樣操作session。
  • • 4、session共享:將session至記憶體資料庫中,使用redis,memcached實現。
  • • 5、Cookies植入: 使用負載均衡來實現,例如Haproxy;(在nginx中暫不實現)

6.4 會話保持場景演示

6.4.1 配置web節點
1.首先安裝並配置 phpmyadmin
[root@web01 ~]# wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip[root@web01 ~]# unzip phpMyAdmin-5.2.1-all-languages.zip -d /code/[root@web01 ~]# ln -s /code/phpMyAdmin-5.2.1-all-languages/ /code/phpmyadmin
2.修改 phpmyadmin 連線遠端的資料庫
[root@web01 code]# cd /code/phpmyadmin[root@web01 phpmyadmin]# cp config.sample.inc.php config.inc.php[root@web01 phpmyadmin]# vim config.inc.php/* Server parameters */$cfg['Servers'][$i]['host'] = '172.16.1.51';
3.在多臺 web 上準備 phpmyadmin 的 nginx 配置檔案*
[root@web01 phpmyadmin]# cat /etc/nginx/conf.d/phpmyadmin.newy.net.confserver {    listen 80;    server_name admin.newy.net;    root /code/phpmyadmin;    location / {        index index.php index.html;    }    location ~ \.php$ {        fastcgi_pass 127.0.0.1:9000;        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        include fastcgi_params;    }}#重啟Nginx服務[root@web01 ~]# systemctl restart nginx
6.4.2 配置負載均衡
1.編寫一份 proxy 負載均衡的配置檔案,將請求排程到後端 web 節點
[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_php.com.conf upstream php {        server 172.16.1.7:80;        server 172.16.1.8:80;}server {        listen 80;        server_name php.newy.net;        location / {                proxy_pass http://php;                proxy_set_header Host $http_host;        }}
2.檢查語法並重載 nginx
[root@proxy01 conf.d]# nginx -t[root@proxy01 conf.d]# systemctl restart nginx
6.4.3 配置Redis服務
1.安裝 redis 記憶體資料庫
[root@db01 ~]# yum install redis -y
2.配置 redis 監聽在本地的內網網絡卡上
[root@db01 ~]# sed  -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
3.啟動 redis
[root@db01 ~]# systemctl start redis[root@db01 ~]# systemctl enable redis
6.4.4 配置php連線Redis
1.修改 /etc/php.ini 檔案。[所有節點都需要操作]
[root@web ~]# vim /etc/php.inisession.save_handler = redissession.save_path = "tcp://172.16.1.41:6379";session.save_path = "tcp://172.16.1.41:6379?auth=123"#如果redis存在密碼,則使用該方式
2.註釋 php-fpm.d/www.conf 裡面的兩條內容,否則 session 內容會一直寫入 /var/lib/php/session 目錄中,從而造成會話共享失敗。[所有節點都需要操作]
[root@web ~]# vim /etc/php-fpm.d/www.conf;php_value[session.save_handler] = files;php_value[session.save_path]    = /var/lib/php/session
3.重啟 php-fpm 服務。[所有節點都需要操作]
[root@web ~]# php-fpm -t[root@web ~]# systemctl  restart php-fpm
END
想要學習Linux系統的讀者可以點選"閱讀原文"按鈕來了解書籍《Linux就該這麼學》,同時也非常適合專業的運維人員閱讀,成為輔助您工作的高價值工具書!

相關文章