nginx+docker+nfs部署

一.體系架構

在Keepalived + Nginx高可用負載均衡架構中,keepalived負責實現High-availability (HA) 功能控制前端機VIP(虛擬網絡地址),當有設備發生故障時,熱備服務器可以瞬間將VIP自動切換過來,實際運行中體驗只有2秒鐘切換時間,DNS服務可以負責前端VIP的負載均衡。
nginx負責控制後端web服務器的負載均衡,將客戶端的請求按照一定的算法轉發給後端Real Server處理,而Real Server將響應直接返回給客戶端。
nfs服務器做實時備份,給web服務器提供web界面。

二.簡單原理

NGINX_MASTER、NGINX_BACKUP兩臺服務器均通過keepalived軟件把ens33網卡綁上一個虛擬IP(VIP)地址192.168.1.40,此VIP當前由誰承載着服務就綁定在誰的ens32上,當NGINX_MASTER發生故障時,NGINX_BACKUP會通過/etc/keepalived/keepalived.conf文件中設置的心跳時間advert_int 1檢查,無法獲取NGINX_MASTER正常狀態的話,NGINX_BACKUP會瞬間綁定VIP來接替nginx_master的工作,當NGINX_MASTER恢復後keepalived會通過priority參數判斷優先權將虛擬VIP地址192.168.1.40重新綁定給NGINX_MASTER的ens33網卡。
使用此方案的優越性
1.實現了可彈性化的架構,在壓力增大的時候可以臨時添加web服務器添加到這個架構裏面去;
2.upstream具有負載均衡能力,可以自動判斷後端的機器,並且自動踢出不能正常提供服務的機器;
3.相對於lvs而言,正則分發和重定向更爲靈活。而Keepalvied可保證單個nginx負載均衡器的有效性,避免單點故障;
4.用nginx做負載均衡,無需對後端的機器做任何改動。
5.nginx部署在docker容器裏,即大量地節約開發、測試、部署的時間,又可以在出現故障時通過鏡像快速恢復業務。

三、系統環境

兩臺負載機器安裝:,nginx+docker+nfs 分別命名爲:NGINX_MASTER,NGINX_BACKUP。
後端web服務器,可以是提供web服務的任何架構,分別命名爲:WEB_1,WEB_2。
後端數據庫機器可任意架構,只要能提供數據庫服務即可。

nginx+docker+nfs部署

服務器 IP地址 安裝軟件
NGINX_MASTER 192.168.1.10 nginx+keepalived
NGINX_BACKUP 192.168.1.20 nginx+keepalived
WEB_1 192.168.1.11 docker+nginx
WEB_2 192.168.1.13 docker+nginx
nfs_MASTER 192.168.1.30 nfs+rsync+inotify
nfs_BACKUP 192.168.1.10 nfs+rsync+inotify

nginx部署(兩臺都是)

安裝nginx

[root@nginx01 ~]# tar zxf nginx-1.14.0.tar.gz 
//解壓nginx安裝包
[root@nginx01 ~]# cd nginx-1.14.0/
[root@nginx01 nginx-1.14.0]# yum -y install openssl-devel pcre-devel zlib-devel
//安裝nginx依賴包
[root@nginx01 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx1.14 --with-http_dav_module --with-http_stub_status_module --with-http_addition_module  --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx && make  &&  make install
//編譯安裝nginx
[root@nginx01 nginx-1.14.0]# useradd nginx -s /sbin/nologin -M
//創建所需用戶
[root@nginx01 nginx-1.14.0]# ln -s /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/
//鏈接命令
[root@nginx01 nginx-1.14.0]# nginx 
//開啓nginx
[root@nginx01 nginx-1.14.0]# netstat -anpt | grep nginx
//查看nginx是否開啓

nginx+docker+nfs部署

部署nginx

[root@nginx01 ~]# cd /usr/local/nginx1.14/conf/
[root@nginx01 conf]# vim nginx.conf

​ http模塊加

upstream backend {
server 192.168.1.11:90 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.13:90 weight=1 max_fails=2 fail_timeout=10s;
}
    location / {
       # root   html;
       # index  index.html index.htm;
       proxy_pass http://backend;  #添加
    }

高可用環境

安裝keepalived

[root@nginx02 nginx-1.14.0]# yum -y install keepalived

配置keepalived

修改主和備nginx服務器上的keepalived 配置文件 /etc/keepalived/keepalived.conf 文件

主nginx

修改主nginx下/etc/keepalived/keepalived.conf文件

! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
}   
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.1.40
    }
}

備nginx

修改備nginx下 /etc/keepalived /keepalived.conf文件

配置備nginx時需要注意:需要修改state爲BACKUP , priority比MASTER低,virtual_router_id和master的值一致

! Configuration File for keepalived
global_defs {
   router_id TWO
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 1
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.40
    }
}

測試(在做完docker的時候)

主備nginx都啓動keepalived

systemctl  start  keepalived
[root@nginx01 conf]# curl 192.168.1.40
wsd666

nfs部署(兩臺都是)

nfs操作

[root@localhost ~]# yum -y install nfs-utils
//下載nfs服務

[root@nfs ~]# mkdir /database
//創建共享目錄
[root@nfs02 ~]# chmod 777 /database/
//設置權限
[root@nfs ~]# vim /etc/exports
//設置權限如下
/database *(rw,sync,no_root_squash)

開啓各項服務

[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server

docker01和docker02測試nfs

[root@nfs01 ~]# vim /etc/rsyncd.conf 
//建立rsync配置文件
uid = nobody
gid = nobody
use chroot = yes
address = 192.168.1.30
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.1.0/24
[wwwroot]
path = /database
read only = no
dont compress = *.gz *.bz2 *.rar *.zip
[root@nfs01 ~]# mkdir /database
//創建共享目錄
[root@nfs01 ~]# rsync --daemon
//啓動rsync
[root@nfs01 ~]# netstat -anpt | grep rsync
//查看端口

nginx+docker+nfs部署

如果需要重啓rsync服務,需要:

[root@localhost ~]# kill  $(cat /var/run/rsyncd.pid)
//停止服務
[root@localhost ~]# rsync --daemon
//啓動服務
[root@localhost ~]# kill -9 $(cat /var/run/rsyncd.pid)

或者直接使用“netstat -anpt | grep rsync”命令查出進程號,使用“kill 進程號”一樣。
使用第一種方法停止rsync服務必須刪除存放rsync服務進程的文件:

[root@localhost ~]# rm -rf /var/run/rsyncd.pid

使用rsync備份工具

配置好rsync同步源服務器之後,客戶端就可以使用rsync工具來執行遠程同步了。

與rsync主機同步
rsync命令的選項:
-r:遞歸模式,包含目錄及子目錄中所有文件
-l:對於符號鏈接文件仍然複製爲符號鏈接文件
-p:保留文件的權限標記
-t:保留文件的時間標記
-g:保留文件的屬組標記(僅超級用戶使用)
-o:保留文件的屬主標記(僅超級用戶使用)
-D:保留設備文件及其他特殊文件
-a:歸檔模式,遞歸併保留對象屬性,等同於 -rlptgoD
-v:顯示同步過程的詳細(verbose)信息
-z:在傳輸文件時進行壓縮(compress)
-H:保留硬連接文件
-A:保留ACL屬性信息
--delete:刪除目標位置有而原始位置沒有的文件
--checksum:根據對象的校驗和來決定是否跳過文件

rsync是一款快速增量備份工具,支持:
(1)本地複製;
(2)與其他SSH同步;
(3)與rsync主機同步。

手動與rsync主機同步
[root@localhost ~]# rsync -avz 192.168.1.1::wwwroot /root
或者
[root@localhost ~]# rsync -avz rsync://192.168.1.1/wwwroot /root
[root@nfs01 database]# vim index.html
xgp666
//創建測試目錄

配置inotify+rsync實時同步(兩臺都是)

(1)、軟件安裝

rpm -q rsync //查詢rsync是否安裝,一般爲系統自帶安裝
yum install rsync -y //若沒有安裝,使用yum安裝

安裝inotify軟件包

[root@nfs02 ~]# tar zxf inotify-tools-3.14.tar.gz 
[root@nfs02 ~]# cd inotify-tools-3.14/
[root@nfs02 inotify-tools-3.14]#  ./configure && make && make install

(2)調整inotify內核參數

[root@nfs02 ~]# vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576

[root@nfs02 ~]# sysctl -p
//生效

(3) 編寫觸發式同步腳本

#!/bin/bash
A="inotifywait -mrq -e modify,move,create,delete /database/"
B="rsync -avz  /database/ 192.168.1.40::wwwroot"
$A | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -gt 0 ] ; then
        $B
    fi
done

此處需要注意,在兩臺服務器需要同步的目錄之間,也需要將目錄權限放到最大,避免因目錄本身權限報錯。

[root@nfs01 inotify-tools-3.14]# chmod  +x /opt/ino.sh

設置腳本開機自啓

[root@nfs01 database]# vim /etc/rc.d/rc.local 
/opt/ino.sh &
/usr/bin/rsync --daemon

源服務器端測試

  • 執行腳本後,當前終端會變成實時監控界面,需要重新打開終端操作。
  • 在源服務器端共享模塊目錄下進行文件操作,然後去備份服務器下,可觀察到文件已經被實時同步。

docker部署(兩臺都是)

[root@docker01 ~]# docker pull nginx
[root@docker01 ~]# mkdir -p  /www  
//創建掛載目錄

nfs創建好之後docker上掛載目錄

[root@docker01 ~]#  mount  -t nfs 192.168.1.30:/database /www
[root@docker01 ~]# docker run -itd --name nginx -p 90:80 -v /www/index.html:/usr/share/nginx/html/index.html nginx:latest

測試

1、當NGINX_MASTER、NGINX_BACKUP服務器nginx均正常工作時
在NGINX_MASTER上:
nginx+docker+nfs部署
在NGINX_BACKUP上:
nginx+docker+nfs部署
master服務器ens32網卡正常綁定VIP,而backup卻沒有綁定,通過瀏覽器可正常訪問網站。
2、關閉NGINX_MASTER的nginx容器
nginx+docker+nfs部署
當nginx容器停止後,馬上就又啓起來了,nginx啓動腳本沒問題
3、關閉NGINX_MASTER的keepalived服務
在NGINX_MASTER上:
nginx+docker+nfs部署
在NGINX_BACKUP上:
nginx+docker+nfs部署
NGINX_BACKUP的ens32網卡已瞬間綁定VIP,通過瀏覽器訪問網站正常。
4、將NGINX_MASTER的keepalived服務啓動
在NGINX_MASTER上:
nginx+docker+nfs部署
在NGINX_BACKUP上:
nginx+docker+nfs部署
NGINX_MASTER的ens32網卡重新綁定VIP,通過瀏覽器訪問網站正常。
5、關閉WEB_1服務器,通過瀏覽器訪問網站正常。

排錯

首先查看nginx配置文件是否有問題
兩臺keepakived的各項參數是否正常
docker上nginx是否映射端口,掛載nfs的共享目錄。
nfs是否設置目錄權限。是否配置rsync+inotify,寫一個shell來做實時備份。

總結:

首先是鏡像,就是拉取nginx的鏡像。然後再把nginx鏡像重建一下,就是變成我們需要的,主要就是改配置文件。然後把所有鏡像push到harbor上

搭建nginx,做反向代理。
搭建docker,安裝nginx鏡像做測試做頁面,測試面是從nfs共享來的。
搭建NFS,爲了實現數據共享,包括數據庫,就是持久化的。還要通過rsync+inotify,做到實時備份。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章