Nginx+keepalived+LVS實現高可用

2021-02-14 IT技術棧
            ↑點擊左上方藍色字體關注



LVS介紹

LVS是Linux Virtual Server的簡寫,即Linux虛擬伺服器,是一個虛擬的伺服器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟體項目之一。軟體名叫ipvsadm,後面有介紹安裝方式。

Keepalived介紹

Keepalived是用C語言編寫的路由軟體。該項目的主要目標是為Linux系統和基於Linux的基礎架構提供負載均衡和高可用性功能。負載均衡的實現依賴於Linux虛擬伺服器(IPVS)內核模塊提供的網絡協議第4層負載均衡。Keepalived實現了一系列的檢查,根據伺服器運行健康狀態,動態地維持伺服器之間的負載均衡。另一方面,keepalived通過VRRP協議實現高可用性。為了提供最快的網絡故障檢測,Keepalived採用BFD協議。VRRP狀態轉換可以通過BFD提示來驅動快速狀態轉換。

Keepalived環境搭建

https://www.keepalived.org/

wget https://www.keepalived.org/software/keepalived-2.1.4.tar.gz

tar -zxvf keepalived-2.1.4.tar.gz

yum install -y gcc openssl-devel libnl3-devel net-snmp-devel

./configure --prefix=/usr/local/keepalived

make && make install

安裝之後的路徑就在/usr/local

進入/usr/local/keepalived後執行./sbin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf

備註:通過-f參數指定配置文件不能使用相對路徑,要使用絕對路徑。另外也可以將keepalived.conf文件拷貝到/etc/keepalived路徑下,執行運行程序時就不用加上-f指定配置文件路徑(程序默認讀取配置文件路徑就是/etc/keepalived)。

keepalived運行日誌文件默認是/var/log/messages,啟動程序之後通過查看該日誌文件來確認是否啟動正常或查看錯誤信息。

基於keepalived可能需要開啟虛擬IP,日誌文件與系統日誌共用/var/log/messages,以及記錄進程號文件路徑等都是root用戶權限級別,所以keepalived只能以root用戶進行安裝和啟動。

方案一——Nginx+keepalived


Nginx+Tomcat+keepalived(MASTER)

IP位址:21.96.149.128

Nginx+Tomcat+keepalived(BACKUP)

IP位址:21.96.149.129

worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;
    gzip  on;    gzip_min_length 90;    gzip_types      *;    gzip_comp_level 9;
    upstream backend {        server 192.168.149.128:8089 weight=5;        server 192.168.149.129:8089 weight=5;    }   
    server {        listen       8080;        server_name  localhost;
        location / {             proxy_pass http://backend;        }
        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }}

1、修改server.xml中監聽埠為8089。

<Connector port="8089" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

2、在webapps目錄下創建一個web項目。

這裡創建myweb項目,並在myweb目錄下新建一個index.html文件,為了在前端展示實際連接的是哪臺web伺服器分別在128伺服器的index.html加上128,129伺服器的index.html加上129。

配置文件在keepalived安裝目錄下的etc/keepalived目錄下,也就是啟動時指定的配置文件。

1、新增Nginx服務健康檢查及守護腳本

創建一個/etc/keepalived/nginx_check.sh腳本文件,內容如下:

#! /bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/home/appuser/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi

需要對該腳本增加執行權限。

2、修改keepalived配置

修改vrrp_garp_interval、vrrp_gna_interval參數值為非0,這裡設置成1,單位是秒。

新增vrrp_script模塊,指定Nginx服務檢查腳本路徑及間隔時間。

state MASTER:表示本keepalived服務是主機,128機器配置成MASTER、129機器配置成BACKUP。

interface ens33:表示指定ens33網卡,根據自己電腦網卡進行修改。執行ip addr命令查看網卡信息。

Priority:設置keepalived的優先級別,數字越高級別越高,所以備機要比主機配置的級別低。

增加track_script模塊,指定vrrp_script模塊定義的腳本名稱。

virtual_ipaddress:指定我們前面規劃的虛擬IP,可以指定多個IP,也可以指定一個網段的地址。

3、啟動keepalived及驗證

啟動之後,如果/var/log/messages日誌文件沒有報錯,則系統會多出一個虛擬IP出來,通過ip addr命令查看。

然後就可以通過這個虛擬IP訪問我們的Nginx了。

我們如果把128機器(主機)的nginx關閉,nginx會被自動拉起來。

如果關閉128機器的keepalived,虛擬IP會被129機器註冊,這個時候如果有請求來,會轉發到129機器的nginx服務上。如果再把128機器的keepalived服務起起來,虛擬IP又會被128機器搶回去,客戶端請求又會轉發至128機器的nginx服務上去。

如果主機配置的priority級別比備機的級別低,那備機會成為主機並註冊虛擬IP。

如果不希望從故障恢復的主機立刻搶回MASTER提供服務,可以通過「nopreempt」參數設置為非搶佔模式。非搶佔模式下,即使高優先級別的服務從故障中恢復,原來佔有虛擬IP的服務仍然能保持虛擬IP並對外提供服務。

方案二——LVS+Nginx

1、LVS安裝

執行下面命令進行安裝:

yum install ipvsadm

執行完成之後檢查

敲ipvsadm命令看是否有IP Virtual Server相關的版本信息,有的話說明安裝成功了。

2、負載機配置(192.168.149.131)

ifconfig ens33:1 192.168.149.200 netmask 255.255.255.255 broadcast 192.168.149.200   #在ens33網卡上增加別名網卡ens33:1,別名網卡的地址是192.168.149.200route add -host 192.168.149.200 dev ens33:1ipvsadm -A -t 192.168.149.200:80 -s rr  # A-增加,t-tcp,s-調度算法ipvsadm -a -t 192.168.149.200:80 -r 192.168.149.128:80 -g  #r-真實伺服器,g-DR模式ipvsadm -a -t 192.168.149.200:80 -r 192.168.149.129:80 -g

配置之後,會多出一個虛擬IP和lvs相關的轉發映射。

通過ip a查看虛擬IP

通過ipvsadm –Ln命令查看lvs的轉發映射

創建腳本文件,配置如下內容:

#! /bin/bashSNS_VIP=192.168.149.200/etc/rc.d/init.d/functionscase "$1" instart)       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP         /sbin/route add -host $SNS_VIP dev lo:0         echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce       sysctl -p >/dev/null 2>&1       echo "lvs Start OK"       ;;stop)       ifconfig lo:0 down       route del $SNS_VIP >/dev/null 2>&1       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce       echo "lvs Stoped"       ;;*)       echo "Usage: $0 {start|stop}"       exit 1esacexit 0

啟動該腳本,啟動之後會多出一個虛擬IP的迴環地址:

arp_ignore參數解釋

本參數表示收到arp請求後的響應處理級別:

0表示arp請求的目標地址是本機中任意地址都響應(包括迴環地址)。

1表示arp請求的目標地址必須是接收網卡的地址才響應,也就是說ens33網卡接受到目標地址是本機lo網卡地址不會響應。

2表示arp請求的目標地址必須是接收網卡的地址且發送請求的IP要在本網卡地址的同一網段。

3表示arp請求的目標地址是本網卡IP且作用域是Global或者link地址才響應,作用域是本機則不響應。

4-7保留。

8全部不響應。

默認是0級別,如果all、具體網卡都配置了,則以其中值最大的為準。

arp_announce參數解釋

本參數表示發送arp請求時聲明本地原地址的級別:

0表示聲明本機所有網卡的所有地址。

1表示避免不是目標地址同網段的本地原地址,如果找不到這樣的原地址則按照級別2聲明原地址。

2表示忽略原地址,選擇直接與目標地址進行交互的網卡地址作為原地址,如果沒有這樣的地址則選擇第一個本地能出去的地址或者其他網卡的第一個地址。

默認是0級別,如果all、具體網卡都配置了,則以其中值最大的為準。

請參考之前的Nginx入門一文。

1、如果要去掉虛擬IP的配置,則在後面加上down,如下:

ifconfig ens33:1 192.168.149.200 netmask 255.255.255.255 broadcast 192.168.149.200 down

2、如果要修改應用伺服器的分配權重,則ipvsadm相關配置如下:

ipvsadm -A -t 192.168.149.200:80 -s wrr  ipvsadm -a -t 192.168.149.200:80 -r 192.168.149.128:80 -g -w 1ipvsadm -a -t 192.168.149.200:80 -r 192.168.149.129:80 -g -w 2說明:-w 表示權重,後面跟權重值。

3、ipvsadm的常用命令:

ipvsadm -D -t 192.168.149.200:80  --刪除IPVS的配置ipvsadm -C  --清除配置信息ipvsadm -Ln --stats    --查看轉發情況ipvsadm -Ln --timeout  --查看連接維持的時間ipvsadm --set tcp tcpfin udp  --設置tcp、tcp結束、udp連接維持的時間(維持的連接會導致請求重複發給一個後臺伺服器處理)

4、ipvsadm命令用法及說明

ipvsadm 的用法和格式如下:ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask]ipvsadm -D -t|u|f virtual-service-addressipvsadm -Cipvsadm -Ripvsadm -S [-n]ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]ipvsadm -d -t|u|f service-address -r server-addressipvsadm -L|l [options]ipvsadm -Z [-t|u|f service-address]ipvsadm --set tcp tcpfin udpipvsadm --start-daemon state [--mcast-interface interface]ipvsadm --stop-daemonipvsadm -h

命令選項解釋:

有兩種命令選項格式,長的和短的,具有相同的意思。在實際使用時,兩種都可

以。

-A -E -D -C -R -S -a -e -d -L|-l -Z -h 
其他的選項:-t -u -f -s rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認的調度算法是:wlc.-p -M -r -g -i -m -w -c 

方案三——LVS+keepalived+Nginx

安裝ipvsadm與keepalived,步驟跟前面一樣。

1、192.168.149.131機器配置

! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   router_id LVS_DEVEL   vrrp_skip_check_adv_addr}
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.149.200    }}
virtual_server 192.168.149.200 80 {    delay_loop 6    lb_algo rr    lb_kind DR    protocol TCP
    real_server 192.168.149.128 80 {        weight 1        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }    real_server 192.168.149.129 80 {        weight 1        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }}

2、192.168.149.132機器配置

global_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   router_id LVS_DEVEL   vrrp_skip_check_adv_addr}
vrrp_instance VI_1 {    state BACKUP    interface ens33    virtual_router_id 51    priority 90    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        192.168.149.200    }}
virtual_server 192.168.149.200 80 {    delay_loop 6    lb_algo rr    lb_kind DR    protocol TCP
    real_server 192.168.149.128 80 {        weight 1        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }    real_server 192.168.149.129 80 {        weight 1        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }}

跟方案二中應用伺服器安裝的配置一致。

總結

方案一採用keepalived的路由模式,可以通過虛擬IP位址漂移來達到高可用模式,但是不具備負載功能。

方案二通過lvs的負載功能可以實現nginx的負載,但是不具備對nginx是否存活進行檢測的能力,在某臺nginx服務掛掉之後還是會分發請求給該故障服務,所以高可用性還不夠。

方案三通過keepalived+lvs+nginx組合達到負載且高可用的目的,keepalived本身具備地址漂移來避免單點故障,同時又可以調用lvs來實現負載分發給nginx服務,且keepalived能自動對nginx埠進行檢測,當nginx不可用時會移除,nginx恢復後又能自動加進來進行服務。

精選推薦:

*本文為IT技術棧原創文章,獨家版權歸於本平臺,受到原創保護。任何渠道的轉載請後臺留言聯繫授權,侵權必究。

相關焦點

  • Nginx + Keepalived 實現站點高可用
    nginx 的高可用(High Avaiability),達到一臺nginx入口伺服器宕機,另一臺備機自動接管服務的效果。(nginx做反向代理,實現後端應用伺服器的負載均衡)快速搭建請直接跳至 第2節。1. Keepalived介紹Keepalived是一個基於VRRP協議來實現的服務高可用方案,可以利用其來避免IP單點故障,類似的工具還有heartbeat、corosync、pacemaker。
  • nginx實現請求的負載均衡 + keepalived實現nginx的高可用
    做負載均衡keepalived實現nginx高可用(HA)注意點參考前言使用集群是網站解決高並發、海量數據問題的常用手段。摘自《大型網站技術架構_核心原理與案例分析》另外,大家可以看我的這兩篇博客:LVS + keepalived + nginx + tomcat 實現主從熱備 + 負載均衡http://www.cnblogs.com/youzhibing/p/5061786.html和主從熱備+負載均衡(LVS + keepalived)http://www.cnblogs.com/youzhibing
  • Nginx+keepalived 實現高可用,防盜鏈及動靜分離配置詳解(值得收藏)
    ,實現故障轉移。四、Nginx+keepalived 實現高可用1. keepalived是什麼Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的
  • 一文帶你認識keepalived,再帶你通關LVS+Keepalived!
    LVS和keepalived可以說是天然的集成, 我們在linux系統安裝的時候, 可能都不需要什麼特殊的LVS的配置, lvs+keepalived的集成, 只需要在keepalived的配置文件中增加配置就okkeepalive提供了主從切換的功能, 主從之間有心跳檢測, 如果發現主從掛掉, keepalived會自動進行主從的切換單體架構中, 我們最常使用
  • 使用 LVS 實現負載均衡原理及安裝配置詳解
    常用的負載均衡開源軟體有nginx、lvs、haproxy,商業的硬體負載均衡設備F5、Netscale。這裡主要是學習 LVS 並對其進行了詳細的總結記錄。使用 LVS 可以達到的技術目標是:通過 LVS 達到的負載均衡技術和 Linux 作業系統實現一個高性能高可用的 Linux 伺服器集群,它具有良好的可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的性能。LVS 是一個實現負載均衡集群的開源軟體項目,LVS架構從邏輯上可分為調度層、Server集群層和共享存儲。
  • NGINX
    MD5摘要是使用genhash實用程序(包含在keepalived軟體包中)生成的。作用Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。
  • Nginx+Keepalived高可用集群
    Keepalived高可用軟體Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,keepalived除了能夠管理LVS軟體外,還可以作為其他服務的高可用解決方案軟體。
  • Nginx構建高可用集群,實現負載均衡應對高並發
    其實我們還有第三種解決方案,那就是集群模式,即將多個物理機器組成一個邏輯計算機,實現負載均衡和容錯。如何構建高可用集群?在上面的例子中,我們已經解決了業務伺服器的問題,但是還有一個問題,就是主備分發器的切換沒有解決,如果主分發器發生故障,自動切換到備分發器,那就很高可用了。這個方法的實現就需要依賴虛擬IP了。    Keepalived實現虛擬IP的自動切換。
  • keepalived工作原理和配置說明
    keepalived是什麼    keepalived是集群管理中保證集群高可用的一個服務軟體,其功能類似於heartbeat,用來防止單點故障。keepalived工作原理    keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。
  • 實踐 | Centos 7搭建LVS+Keepalived高可用Web服務群集群
    LVS + Keepalived 高可用集群Keepalived的設計目標是構建高可用的LVS負載均衡的集群,可以調用ipvsadm工具創建虛擬機,不僅僅用作雙機熱備,還可以使用keepalived構建更加方便快捷的節點,進行相關的健康檢查,自動移除失效節點,恢復後再重新加入。
  • Keepalived負載高可用原理
    keepalived軟體起初是專門為LVS負載均衡軟體而設計,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能,因此,keepalived除了能夠管理LVS軟體ipvsadm外,還可以作為其它服務(例如:Nginx、HAProxy、MySQL等)的高可用解決方案軟體 keepalived軟體主要使用過VRRP協議實心高可用功能;VRRP是Virtual
  • 高可用可伸縮架構實用經驗談
    此時,可以用keepalived來實現入口層的高可用。例如,機器A 的IP是 1.2.3.4,機器 B 的 IP 是 1.2.3.5, 那麼再申請一個 IP 1.2.3.6(稱為⼼跳IP), 平時綁定在機器A上,如果A當機,IP會自動綁定在機器B上;如果B當機,IP會自動綁定在機器A上。對於這種形式,我們將DNS綁定到心跳IP上,即可實現入口層的高可用。但這個方案有一點小問題。
  • Nginx的 反向代理 究竟怎麼理解?
    192.168.25.132 www.123.com然後默認訪問80埠,而通過nginx監聽80埠代理到本地的8080埠上,從而實現了訪問www.123.com,最終轉發到tomcat 8080上去第二個例子:訪問http://192.168.25.132:9001
  • Keepalived入門學習
    Keepalived簡介 Keepalived 是使用C語言編寫的路由熱備軟體,該項目軟體起初是專門為LVS負載均衡設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。
  • 使用keepalived搭建雙機熱備高可用一覽
    很多時候大家為了部署高可用方案都是前端配一個 ngi
  • Linux乾貨 | nginx常見典型故障
    這個一個取決於服務端nginx,一個取決於你瀏覽器。+keepalived可以直接負載到後端的tomcat,nginx也可以負載到後端的tomcat,lvs是4層負載比nginx七層負載效率要高,為什麼網上有很多資料要使用lvs+keepalived來負載nginx呢?
  • 雲原生打造企業內部DNS+ETCD+NTP+Quay高可用實戰(完結篇)
    採用OCP的router和Ingress均無法實現集群對外的4層服務代理。而採用NodePort,存在埠範圍不匹配以及單點故障問題。另外選擇多臺節點組成LoadBalance集群,這裡採用keepalived通過VRRP協議實現高可用,對外提供統一的一個固定VIP位址,對外提供服務。UDP流量的負載均衡採用Nginx進行代理轉發。
  • Nginx介紹
    2.客戶端了解代理伺服器和目標伺服器都是誰3.幫助咱們實現突破訪問權限,提高訪問的速度,對目標伺服器隱藏客戶端的ip地址3.2基於Nginx實現反向代理準備一個目標伺服器啟動tomcat伺服器編寫nginx的配置文件(/opt/docker_nginx/conf.d/default.conf),通過Nginx訪問到tomcat伺服器
  • Keepalived工作原理
    Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的