Nginx(三)--Nginx 的高可用

1. Nginx 進程模型簡介 

多進程+多路複用
master 進程 、 worker 進程 

 

啓動nginx,查看nginx的線程,能夠發現:html

[root@localhost ~]# ps -ef |grep nginx
root     20714     1  0 02:36 ?        00:00:00 nginx: master process ../ngnix/sbin/nginx
root     21728 20714  0 05:04 ?        00:00:00 nginx: worker process
root     22694 22655  0 06:49 pts/2    00:00:00 grep nginx
[root@localhost ~]#  
worker_processes 1 cpu 總核心數
epoll . select ....
#user nobody; 用戶
worker_processes 1; 工做進程數
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
 
events {
use epoll ; io 模型
worker_connections 1024; 理論上 processes* connections

1. 在建立master進程時,先創建須要監聽的socket(listenfd),而後從master進程中fork()出多個worker進程,如此一來每一個worker進程均可以監聽用戶請求的socket。通常來講,當一個鏈接進來後,全部Worker都會收到通知,可是隻有一個進程能夠接受這個鏈接請求,其它的都失敗,這是所謂的驚羣現象。nginx提供了一個accept_mutex(互斥鎖),有了這把鎖以後,同一時刻,就只會有一個進程在accpet鏈接,這樣就不會有驚羣問題了。java

2. 先打開accept_mutex選項,只有得到了accept_mutex的進程纔會去添加accept事件。nginx使用一個叫ngx_accept_disabled的變量來控制是否去競爭accept_mutex鎖。ngx_accept_disabled = nginx單進程的全部鏈接總數 / 8 -空閒鏈接數量,當ngx_accept_disabled大於0時,不會去嘗試獲取accept_mutex鎖,ngx_accept_disable越大,讓出的機會就越多,這樣其它進程獲取鎖的機會也就越大。不去accept,每一個worker進程的鏈接數就控制下來了,其它進程的鏈接池就會獲得利用,這樣,nginx就控制了多進程間鏈接的平衡。linux

3.每一個worker進程都有一個獨立的鏈接池,鏈接池的大小是worker_connections。這裏的鏈接池裏面保存的其實不是真實的鏈接,它只是一個worker_connections大小的一個ngx_connection_t結構的數組。而且,nginx會經過一個鏈表free_connections來保存全部的空閒ngx_connection_t,每次獲取一個鏈接時,就從空閒鏈接鏈表中獲取一個,用完後,再放回空閒鏈接鏈表裏面。一個nginx能創建的最大鏈接數,應該是worker_connections * worker_processes。固然,這裏說的是最大鏈接數,對於HTTP請求本地資源來講,可以支持的最大併發數量是worker_connections * worker_processes,而若是是HTTP做爲反向代理來講,最大併發數量應該是worker_connections * worker_processes/2。由於做爲反向代理服務器,每一個併發會創建與客戶端的鏈接和與後端服務的鏈接,會佔用兩個鏈接。nginx

  相關的配置:算法

worker_processes  1; // 工做進程數,建議設成CPU總核心數。
events { // 多路複用IO模型機制,epoll . select  ....根據操做系統不一樣來選擇。linux 默認epoll
    use epoll; //io 模型
    worker_connections  1024; // 每一個woker進程的最大鏈接數,數值越大,併發量容許越大
}
http{
  sendfile  on;//開啓零拷貝
}

  

Nginx 的高可用方案

Nginx 做爲反向代理服務器,全部的流量都會通過 Nginx,因此 Nginx 自己的可靠性是咱們首先要考慮的問題
 
keepalived
 
Keepalived 是 Linux 下一個輕量級別的高可用解決方案,Keepalived 軟件起初是專爲 LVS 負載均衡軟件設計的,
用來管理並監控 LVS 集羣系統中各個服務節點的狀態,後來又加入了能夠實現高可用的 VRRP 功能。所以,Keepalived 除了可以管理 LVS 軟件外,
還能夠做爲其餘服務(例如:Nginx、Haproxy、MySQL 等)的高可用解決方案軟件Keepalived 軟件主要是經過 VRRP 協議實現高可用功能的。
VRRP 是 VirtualRouter RedundancyProtocol(虛擬路由器冗餘協議)的縮寫,VRRP 出現的目的就是爲了解決靜態路由單點故障問題的,
它可以保證當個別節點宕機時,整個網絡能夠不間斷地運行;(簡單來講,vrrp 就是把兩臺或多態路由器設備虛擬成一個設備,實現主備高可用)
因此,Keepalived 一方面具備配置管理 LVS 的功能,同時還具備對 LVS 下面節點進行健康檢查的功能,另外一方面也可實現系統網絡服務的高可用功能
 
LVS 是 Linux Virtual Server 的縮寫,也就是 Linux 虛擬服務器,在 linux2.4 內核之後,已經徹底內置了 LVS 的各個功能模塊。
它是工做在四層的負載均衡,相似於 Haproxy, 主要用於實現對服務器集羣的負載均衡。
關於四層負載,咱們知道 osi 網絡層次模型的 7 層模模型(應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層);
四層負載就是基於傳輸層,也就是ip+端口的負載;而七層負載就是須要基於 URL 等應用層的信息來作負載,同時還有二層負載(基於 MAC)、三層負載(IP);
常見的四層負載有:LVS、F5; 七層負載有:Nginx、HAproxy; 在軟件層面,Nginx/LVS/HAProxy 是使用得比較普遍的三種負載均衡軟件
對於中小型的 Web 應用,可使用 Nginx、大型網站或者重要的服務而且服務比較多的時候,能夠考慮使用 LVS 
 
輕量級的高可用解決方案
LVS 四層負載均衡軟件(Linux virtual server)
監控 lvs 集羣系統中的各個服務節點的狀態
VRRP 協議(虛擬路由冗餘協議)
linux2.4 之後,是內置在 linux 內核中的
lvs(四層) -> HAproxy 七層
lvs(四層) -> Nginx(七層)

 

Keepalived 下載地址

 https://www.keepalived.org/download.html
 
實踐
\1. 下載 keepalived 的安裝包
\2. tar -zxvf keepalived-2.0.7.tar.gz
\3. 在/data/program/目錄下建立一個 keepalived 的文件
\4. cd 到 keepalived-2.0.7 目錄下,執行 ./configure --prefix=/data/program/keepalived --sysconf=/etc
\5. 若是缺乏依賴庫,則 yum install gcc; yum -y install openssl-devel ; yum install libnllibnl-devel ,而後從新執行4
\6. 編譯安裝 make && make install
  
報錯
make[2]: *** [namespaces.o] Error 1 make[2]: Leaving directory `/root/keepalived-1.2.24/keepalived/core' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/root/keepalived-1.2.24/keepalived' make: *** [all-recursive] Error 1
升級了下glib試一下能不能解決
yum update glib*
還不行的話,看一下本身的系統版本,換一個低版本的keepalived
centos6.5+keepalived1.2.7

 

\7. 進入安裝後的路徑 cd /data/program/keepalived, 建立軟鏈接: ln -s sbin/keepalived /sbin  覆蓋軟鏈接 ln -snf sbin/keepalived /sbin
\8. 複製運行命令 cp /data/program/keepalived-2.0.7/keepalived/etc/init.d/keepalived /etc/init.d (換成本身的版本路徑cp /keepalived-2.0.7/keepalived/etc/init.d/keepalived /etc/init.d/)
\9. chkconfig --add keepalived
\10.添加到系統服務 chkconfig keepalived on
\11. 啓用該服務service keepalived start
  service keepalived status 查看keepalived 運行情況
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-06-03 22:42:50 CST; 5min ago
  Process: 4350 ExecStart=/data/program/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 4579 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─4579 /data/program/keepalived/sbin/keepalived -D
           └─4583 /data/program/keepalived/sbin/keepalived -D

Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Timeout connecting server [192.168.20...3.
Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Check on service [192.168.201.100]:tc...d.
Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Removing service [192.168.201.100]:tc...43
Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Lost quorum 1-0=1 > 0 for VS [192.168...43
Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Remote SMTP server [192.168.200.1]:25...d.
Jun 03 22:43:17 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5.
Jun 03 22:43:17 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5.
Jun 03 22:43:17 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5.
Jun 03 22:43:19 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5.
Jun 03 22:43:20 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost keepalived]# 

 

keepalived 的配置 

vi /etc/keepalived/keepalived.conf
master
! Configuration File for keepalived
global_defs {
 router_id MASTER_DEVEL #運行 keepalived 服務器的標識,在一個網絡內應該是惟一的
}
vrrp_instance VI_1 { #vrrp 實例定義部分
 state MASTER #設置 lvs 的狀態,MASTER 和 BACKUP 兩種,必須大寫
 interface  ens33 #設置對外服務的接口,必須跟本地一致
 virtual_router_id 51 #設置虛擬路由標示,這個標示是一個數字,同一個 vrrp 實例使用惟一標示
 priority 150 #定義優先級,數字越大優先級越高,在一個 vrrp——instance 下,master 的優先級必須大於 backup
 advert_int 1 #設定 master 與 backup 負載均衡器之間同步檢查的時間間隔,單位是秒
 authentication { #設置驗證類型和密碼
 auth_type PASS
 auth_pass 1111 #驗證密碼,同一個 vrrp_instance 下 MASTER 和 BACKUP 密碼必須相同}
 virtual_ipaddress { #設置虛擬 ip 地址,能夠設置多個,每行一個
   192.168.20.110
 }
}
virtual_server 192.168.20.100 80 { #設置虛擬服務器,須要指定虛擬 ip 和服務端口
 delay_loop 6 #健康檢查時間間隔
 lb_algo rr #負載均衡調度算法
 lb_kind NAT #負載均衡轉發規則
 persistence_timeout 50 #設置會話保持時間
 protocol TCP #指定轉發協議類型,有 TCP 和 UDP 兩種
 real_server 192.168.20.130 80 { #配置服務器節點 1,須要指定 real server 的真實 IP 地址和端口weight 1 #設置權重,數字越大權重越高
 TCP_CHECK { #realserver 的狀態監測設置部分單位秒
   connect_timeout 3 #超時時間
   delay_before_retry 3 #重試間隔
   connect_port 80 #監測端口
 }
 }
}

  backupvim

! Configuration File for keepalived
global_defs {
 router_id BACKUP_DEVEL #運行 keepalived 服務器的標識,在一個網絡內應該是惟一的
}
vrrp_instance VI_1 { #vrrp 實例定義部分
 state BACKUP #設置 lvs 的狀態,MASTER 和 BACKUP 兩種,必須大寫
 interface  ens33 #設置對外服務的接口,必須跟本地ip應用名稱一致
 virtual_router_id 51 #設置虛擬路由標示,這個標示是一個數字,同一個 vrrp 實例使用惟一標示
 priority 100 #定義優先級,數字越大優先級越高,在一個 vrrp——instance 下,master 的優先級必須大於 backup
 advert_int 1 #設定 master 與 backup 負載均衡器之間同步檢查的時間間隔,單位是秒
 authentication { #設置驗證類型和密碼
 auth_type PASS
 auth_pass 1111 #驗證密碼,同一個 vrrp_instance 下 MASTER 和 BACKUP 密碼必須相同}
 virtual_ipaddress { #設置虛擬 ip 地址,能夠設置多個,每行一個
   192.168.20.110
 }
}
virtual_server 192.168.20.110 80 { #設置虛擬服務器,須要指定虛擬 ip 和服務端口
 delay_loop 6 #健康檢查時間間隔
 lb_algo rr #負載均衡調度算法
 lb_kind NAT #負載均衡轉發規則
 persistence_timeout 50 #設置會話保持時間
 protocol TCP #指定轉發協議類型,有 TCP 和 UDP 兩種
 real_server 192.168.20.128 80 { #配置服務器節點 1,須要指定 real server 的真實 IP 地址和端口weight 1 #設置權重,數字越大權重越高
 TCP_CHECK { #realserver 的狀態監測設置部分單位秒
   connect_timeout 3 #超時時間
   delay_before_retry 3 #重試間隔
   connect_port 80 #監測端口
 }
 }
}
keepalived 日誌文件配置
 
\1. 首先看一下/etc/sysconfig/keepalived 文件
vi /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
「-D」 就是輸出日誌的選項
這裏的「-S 0」表示 local0.* 具體的還須要看一下vim /etc/rsyslog.conf  文件
\2. 在/etc/rsyslog.conf 裏添加:local0.* /var/log/keepalived.log
\3. 從新啓動 keepalived 和 rsyslog 服務:
service rsyslog restart (/bin/systemctl restart rsyslog.service)
service keepalived restart 
查看日誌信息:cat /var/log/keepalived.log
 
示例:keepalived +nginx+tomcat
 啓動報錯,查看日誌
發現 沒有eth0網卡名稱
關閉網絡防火牆 

使用命令:systemctl status firewalld.service後端

查看防火牆狀態centos

執行後能夠看到綠色字樣標註的「active(running)」,說明防火牆是開啓狀態數組

使用命令:systemctl stop firewalld.service    tomcat

關閉運行的防火牆

輸入命令:systemctl disable firewalld.service,禁止防火牆服務器

ip a 來查看虛擬IP是否綁定到本機

安裝nginx到本地試一下

相關文章
相關標籤/搜索