您好,登錄后才能下訂單哦!
在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。
后端數據庫機器可任意架構,只要能提供數據庫服務即可。
服務器 | 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
[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
[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操作
[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
//查看端口
如果需要重啟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命令的選項:
-r:遞歸模式,包含目錄及子目錄中所有文件
-l:對于符號鏈接文件仍然復制為符號鏈接文件
-p:保留文件的權限標記
-t:保留文件的時間標記
-g:保留文件的屬組標記(僅超級用戶使用)
-o:保留文件的屬主標記(僅超級用戶使用)
-D:保留設備文件及其他特殊文件
-a:歸檔模式,遞歸并保留對象屬性,等同于 -rlptgoD
-v:顯示同步過程的詳細(verbose)信息
-z:在傳輸文件時進行壓縮(compress)
-H:保留硬連接文件
-A:保留ACL屬性信息
--delete:刪除目標位置有而原始位置沒有的文件
--checksum:根據對象的校驗和來決定是否跳過文件
rsync是一款快速增量備份工具,支持:
(1)本地復制;
(2)與其他SSH同步;
(3)與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
//創建測試目錄
(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
源服務器端測試
[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_BACKUP上:
master服務器ens32網卡正常綁定VIP,而backup卻沒有綁定,通過瀏覽器可正常訪問網站。
2、關閉NGINX_MASTER的nginx容器
當nginx容器停止后,馬上就又啟起來了,nginx啟動腳本沒問題
3、關閉NGINX_MASTER的keepalived服務
在NGINX_MASTER上:
在NGINX_BACKUP上:
NGINX_BACKUP的ens32網卡已瞬間綁定VIP,通過瀏覽器訪問網站正常。
4、將NGINX_MASTER的keepalived服務啟動
在NGINX_MASTER上:
在NGINX_BACKUP上:
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,做到實時備份。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。