Linux高可用之Keepalived

簡介

Keepalived是基于vrrp協(xié)議的一款高可用軟件呛梆。Keepailived有一臺主服務(wù)器和多臺備份服務(wù)器挑格,在主服務(wù)器和備份服務(wù)器上面部署相同的服務(wù)配置膘婶,使用一個虛擬IP地址對外提供服務(wù)恒水,當(dāng)主服務(wù)器出現(xiàn)故障時倔幼,虛擬IP地址會自動漂移到備份服務(wù)器继薛。

VRRP(Virtual Router Redundancy Protocol修壕,虛擬路由器冗余協(xié)議),VRRP是為了解決靜態(tài)路由的高可用遏考。VRRP的基本架構(gòu)
虛擬路由器由多個路由器組成慈鸠,每個路由器都有各自的IP和共同的VRID(0-255),其中一個VRRP路由器通過競選成為MASTER灌具,占有VIP青团,對外提供路由服務(wù),其他成為BACKUP咖楣,MASTER以IP組播(組播地址:224.0.0.18)形式發(fā)送VRRP協(xié)議包督笆,與BACKUP保持心跳連接,若MASTER不可用(或BACKUP接收不到VRRP協(xié)議包)诱贿,則BACKUP通過競選產(chǎn)生新的MASTER并繼續(xù)對外提供路由服務(wù)娃肿,從而實現(xiàn)高可用。

vrrp協(xié)議的相關(guān)術(shù)語:

    虛擬路由器:Virtual Router 
    虛擬路由器標識:VRID(0-255)
    物理路由器:
        master  :主設(shè)備
        backup  :備用設(shè)備
        priority:優(yōu)先級
    VIP:Virtual IP 
    VMAC:Virutal MAC (00-00-5e-00-01-VRID)
    GraciousARP

安全認證:

簡單字符認證珠十、HMAC機制料扰,只對信息做認證
MD5(leepalived不支持)

工作模式:

主/備:單虛擬路徑器;
主/主:主/備(虛擬路徑器)焙蹭,備/主(虛擬路徑器)

工作類型:

搶占式:當(dāng)出現(xiàn)比現(xiàn)有主服務(wù)器優(yōu)先級高的服務(wù)器時晒杈,會發(fā)送通告搶占角色成為主服務(wù)器
非搶占式:

keepalived

核心組件:

        vrrp stack:vrrp協(xié)議的實現(xiàn)
        ipvs wrapper:為集群內(nèi)的所有節(jié)點生成IPVS規(guī)則
        checkers:對IPVS集群的各RS做健康狀態(tài)檢測
        控制組件:配置文件分析器,用來實現(xiàn)配置文件的分析和加載
        IO復(fù)用器
        內(nèi)存管理組件孔厉,用來管理keepalived高可用是的內(nèi)存管理

注意:

  1. 各節(jié)點時間必須同步
  2. 確保各節(jié)點的用于集群服務(wù)的接口支持MULTICAST通信(組播)拯钻;

安裝

從CentOS 6.4開始keepalived隨系統(tǒng)base倉庫提供,可以使用yun -y install keepalived安裝烟馅。

配置文件:
        主配置文件:/etc/keepalived/keepalived.conf
        主程序文件:/usr/sbin/keepalived
        提供校驗碼:/usr/bin/genhash
        Unit File:keepalived.service
        Unit File的環(huán)境配置文件:/etc/sysconfig/keepalived

配置

主配置文件詳解

! Configuration File for keepalived

global_defs {
   notification_email {   #發(fā)送報警郵件收件地址
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc   #指明報警郵件的發(fā)送地址
   smtp_server 192.168.200.1    #郵件服務(wù)器地址
   smtp_connect_timeout 30      #smtp的超時時間
   router_id LVS_DEVEL          #物理服務(wù)器的主機名
   vrrp_mcast_group4            #定義一個組播地址
   static_ipaddress
        {
        192.168.1.1/24 dev eth0 scope global
        }
        static_routes
        {
        192.168.2.0/24 via 192.168.1.100 dev eth0
        }

}
    vrrp_sync_group VG_1 {              #定義一個故障組说庭,組內(nèi)有一個虛擬路由出現(xiàn)故障另一個也會一起跟著轉(zhuǎn)移,適用于LVS的NAT模型郑趁。
        group {
            VI1     # name of vrrp_instance (below)         
            VI2     # One for each moveable IP

             }
    }


vrrp_instance VI_1 {        #定義一個虛擬路由
    state MASTER|BACKUP     #當(dāng)前節(jié)點在此虛擬路由器上的初始狀態(tài)刊驴;只能有一個是MASTER,余下的都應(yīng)該為BACKUP;
    interface eth0          #綁定為當(dāng)前虛擬路由器使用的物理接口捆憎;
    virtual_router_id 51    #當(dāng)前虛擬路由器的惟一標識舅柜,范圍是0-255;
    priority 100            #當(dāng)前主機在此虛擬路徑器中的優(yōu)先級躲惰;范圍1-254致份;
    advert_int 1            #通告發(fā)送間隔,包含主機優(yōu)先級础拨、心跳等氮块。
    authentication {        #認證配置   
        auth_type PASS      #認證類型,PASS表示簡單字符串認證
        auth_pass 1111      #密碼,PASS密碼最長為8位

   virtual_ipaddress {
    192.168.200.16          #虛擬路由IP地址诡宗,以輔助地址方式設(shè)置
    192.168.200.18/24 dev eth2 label eth2:1 #以別名的方式設(shè)置
    }

track_interface {
        eth0
        eth1

}                           #配置要監(jiān)控的網(wǎng)絡(luò)接口滔蝉,一旦接口出現(xiàn)故障,則轉(zhuǎn)為FAULT狀態(tài)塔沃;
nopreempt                   #定義工作模式為非搶占模式蝠引;
preempt_delay 300           #搶占式模式下,節(jié)點上線后觸發(fā)新選舉操作的延遲時長蛀柴;
   virtual_routes {         #配置路由信息螃概,可選項
               #  src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope
       <SCOPE> tab
               src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
               192.168.112.0/24 via 192.168.100.254       192.168.113.0/24  via  192.168.200.254  or 192.168.100.254 dev eth1      blackhole 192.168.114.0/24
           }


    notify_master <STRING>|<QUOTED-STRING>       #當(dāng)前節(jié)點成為主節(jié)點時觸發(fā)的腳本。
    notify_backup <STRING>|<QUOTED-STRING>       #當(dāng)前節(jié)點轉(zhuǎn)為備節(jié)點時觸發(fā)的腳本鸽疾。
    notify_fault <STRING>|<QUOTED-STRING>        #當(dāng)前節(jié)點轉(zhuǎn)為“失敗”狀態(tài)時觸發(fā)的腳本吊洼。
    notify <STRING>|<QUOTED-STRING>              #通用格式的通知觸發(fā)機制,一個腳本可完成以上三種狀態(tài)的轉(zhuǎn)換時的通知制肮。
    smtp_alert                                   #如果加入這個選項融蹂,將調(diào)用前面設(shè)置的郵件設(shè)置,并自動根據(jù)狀態(tài)發(fā)送信息 
}
virtual_server 192.168.200.100 443 {    #LVS配置段 弄企,設(shè)置LVS的VIP地址和端口
    delay_loop                          #服務(wù)輪詢的時間間隔;檢測RS服務(wù)器的狀態(tài)区拳。
    lb_algo rr                          #調(diào)度算法拘领,可選rr|wrr|lc|wlc|lblc|sh|dh。
    lb_kind NAT                         #集群類型樱调。
    nat_mask 255.255.255.0              #子網(wǎng)掩碼约素,可選項。
    persistence_timeout 50              #是否啟用持久連接笆凌,連接保存時長
    protocol TCP                        #協(xié)議圣猎,只支持TCP
    sorry_server <IPADDR> <PORT>        #備用服務(wù)器地址,可選項乞而。

    real_server 192.168.201.100 443 {   #配置RS服務(wù)器的地址和端口
        weight 1                        #權(quán)重
     SSL_GET {                          #檢測RS服務(wù)器的狀態(tài)送悔,發(fā)送請求報文
            url {
              path /                    #請求的URL
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #對請求的頁面進行hash運算,然后和這個hash碼進行比對,如果hash碼一樣就表示狀態(tài)正常
              status_code <INT>         #判斷上述檢測機制為健康狀態(tài)的響應(yīng)碼,和digest二選一即可欠啤。

            }                           #這個hash碼可以使用genhash命令請求這個頁面生成
            connect_timeout 3           #連接超時時間
            nb_get_retry 3              #超時重試次數(shù)
            delay_before_retry 3        #每次超時過后多久再進行連接
            connect_ip <IP ADDRESS>     #向當(dāng)前RS的哪個IP地址發(fā)起健康狀態(tài)檢測請求
            connect_port <PORT>         #向當(dāng)前RS的哪個PORT發(fā)起健康狀態(tài)檢測請求
            bindto <IP ADDRESS>         #發(fā)出健康狀態(tài)檢測請求時使用的源地址荚藻;
            bind_port <PORT>            #發(fā)出健康狀態(tài)檢測請求時使用的源端口;
        }
    }
}
健康狀態(tài)檢測機制
  1. HTTP_GET
  2. SSL_GET
  3. TCP_CHECK
  4. SMTP_CHECK
  5. MISS_CHECK #調(diào)用自定義腳本進行檢測
TCP_CHECK {
        connect_ip <IP ADDRESS>         #向當(dāng)前RS的哪個IP地址發(fā)起健康狀態(tài)檢測請求;
        connect_port <PORT>             #向當(dāng)前RS的哪個PORT發(fā)起健康狀態(tài)檢測請求;
        bindto <IP ADDRESS>             #發(fā)出健康狀態(tài)檢測請求時使用的源地址洁段;
        bind_port <PORT>                #發(fā)出健康狀態(tài)檢測請求時使用的源端口应狱;
        connect_timeout <INTEGER>       #連接請求的超時時長;
}

實現(xiàn)LVS高可用集群

實驗主機
虛擬IP:192.168.166.100

2臺CentOS 7.3

CentOS 7.3   主服務(wù)器祠丝,  IP:192.168.166.130
CentOS 7.3-1 備份服務(wù)器疾呻,IP:192.168.166.132

2臺CentOS 6.9

CentOS 6.9  IP:192.168.166.129
CentOS6.9-1 IP:192.168.166.131

注:在配置服務(wù)前需要注意幾臺主機的防火墻策略,和SELinux配置写半。

主調(diào)度器配置

[root@CentOS7.3 ~]#yum -y install keepalived ipvsadm        #安裝keepalived和LVS管理軟件ipvsadm
[root@CentOS7.3 ~]#vim /etc/keepalived/keepalived.conf  #配置keepalived
! Configuration File for keepalived

global_defs {
   notification_email {
   root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1                    #郵件服務(wù)器的地址
   smtp_connect_timeout 30
   router_id CentOS7.3                      #主調(diào)度器的主機名
   vrrp_mcast_group4 224.26.1.1             #發(fā)送心跳信息的組播地址
    
}

vrrp_instance VI_1 {
    state MASTER                            #主調(diào)度器的初始角色
    interface eth0                          #虛擬IP工作的網(wǎng)卡接口
    virtual_router_id 66                    #虛擬路由的ID
    priority 100                            #主調(diào)度器的選舉優(yōu)先級
    advert_int 1
    authentication {
        auth_type PASS                      #集群主機的認證方式
        auth_pass 123456                    #密鑰,最長8位
    }
    virtual_ipaddress {
        192.168.166.100                     #虛擬IP
    }
}

virtual_server 192.168.166.100 80 {         #LVS配置段岸蜗,VIP
    delay_loop 6
    lb_algo rr                              #調(diào)度算法輪詢
    lb_kind DR                              #工作模式DR
    nat_mask 255.255.255.0
#    persistence_timeout 50                  #持久連接,在測試時需要注釋污朽,否則會在設(shè)置的時間內(nèi)把請求都調(diào)度到一臺RS服務(wù)器上面
    protocol TCP
    sorry_server 127.0.0.1 80               #Sorry server的服務(wù)器地址及端口
#Sorry server就是在后端的服務(wù)器全部宕機的情況下緊急提供服務(wù)散吵。
    real_server 192.168.166.129 80 {        #RS服務(wù)器地址和端口
        weight 1                            #RS的權(quán)重
        HTTP_GET {                          #健康狀態(tài)檢測方法
            url {
              path /
              status_code 200               #狀態(tài)判定規(guī)則
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

[root@CentOS7.3 keepalived]#systemctl start keepalived          #啟動keepalived
[root@CentOS7.3 keepalived]#ip a l eth0                         #查看虛擬路由綁定的網(wǎng)卡    
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b9:7d:cb brd ff:ff:ff:ff:ff:ff
    inet 192.168.166.130/24 brd 192.168.166.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.166.100/32 scope global eth0                   #虛擬IP已經(jīng)綁定在了eth網(wǎng)卡上
       valid_lft forever preferred_lft forever
    inet6 fe80::50fe:a3f3:83a0:d38a/64 scope link 
       valid_lft forever preferred_lft forever

備份調(diào)度器的配置

[root@centos7.3-1 ~]#yum -y install keepalived ipvsadm 

! Configuration File for keepalived

global_defs {
   notification_email {
   root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3-1                #備份調(diào)度器的主機名
   vrrp_mcast_group4 224.26.1.1         #這個組播地址需與集群內(nèi)的其他主機相同

}

vrrp_instance VI_1 {
    state BACKUP                        #初始角色,備份服務(wù)器需設(shè)置為BACKUP
    interface eth0
    virtual_router_id 66                #虛擬路由的ID一定要和集群內(nèi)的其他主機相同
    priority 90                         #選舉優(yōu)先級蟆肆,要比主調(diào)度器地一些
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456                #密鑰需要和集群內(nèi)的主服務(wù)器相同
    }
    virtual_ipaddress {
        192.168.166.100
    }
}
                #余下配置和主服務(wù)器相同
virtual_server 192.168.166.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 50              
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.166.129 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
[root@centos7.3-1 ~]#systemctl start keepalived         #啟動備份keepalived
[root@centos7.3-1 ~]#ip a l eth0                        #查看虛擬路由綁定的網(wǎng)卡接口
[root@centos7.3-1 ~]#ip a l eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:7e:ec:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.166.132/24 brd 192.168.166.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9aab:52b3:cc1e:fbef/64 scope link 
       valid_lft forever preferred_lft forever

測試虛擬IP地址漂移

關(guān)閉主服務(wù)器的keepalived矾睦,并查看eth0接口


image.png

查看備份服務(wù)器的eth0接口,地址已經(jīng)漂移到了備份服務(wù)器上面


image.png

可以看到上圖提示有新郵件炎功。使用mail命令查看郵件列表枚冗,都是后端服務(wù)器狀態(tài)檢測的郵件,說明配置的報警郵件生效了蛇损。應(yīng)為后端服務(wù)器還沒有配置所以檢測的狀態(tài)全是down哆姻。


image.png

啟動主服務(wù)器,地址又漂移回了主服務(wù)器


image.png

配置RS服務(wù)器

RS1配置

[root@CentOS6.9 ~]#yum -y install httpd                 #安裝httpd服務(wù)
[root@CentOS6.9 ~]#vim lvs.sh                           #創(chuàng)建一個配置腳本
#!/bin/bash
vip=192.168.166.100                                     #VIP地址
mask=255.255.255.255                    
dev=eth0:1
case $1 in
start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ifconfig $dev $vip netmask $mask broadcast $vip up
        route add -host $vip dev $dev
;;
stop)
        ifconfig $dev down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
        echo "Usage: $(basename $0) start|stop"
        exit 1
;;
esac

[root@CentOS6.9 ~]#bash lvs.sh start
[root@CentOS6.9 ~]#ip a l eth0:0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:23:38:c9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.166.129/24 brd 192.168.166.255 scope global eth0
    inet 192.168.166.100/32 brd 192.168.166.100 scope global eth0:1
    inet6 fe80::20c:29ff:fe23:38c9/64 scope link 
       valid_lft forever preferred_lft forever
[root@CentOS6.9 ~]#echo WebServer1 > /var/www/html/index.html
[root@CentOS6.9 ~]#cat /var/www/html/index.html 
WebServer1
[root@CentOS6.9 ~]#service httpd start

使用ipvsadm 命令查看lvs配置信息申眼,RS1服務(wù)器已經(jīng)調(diào)度器添加進集群涣狗。

image.png

RS2配置

[root@CentOS6.9-1 ~]#yum -y install httpd
[root@CentOS6.9-1 ~]#vim lvs.sh                        #和上面RS1的lvx.sh內(nèi)容相同
[root@CentOS6.9-1 ~]#echo WebServer2 > /var/www/html/index.html
[root@CentOS6.9-1 ~]#cat /var/www/html/index.html 
WebServer2
[root@CentOS6.9-1 ~]#service httpd start

第二臺RS服務(wù)器上線


image.png

客戶端測試

因為使用的是輪詢算法,所以會在Web1和Web2之間來回調(diào)度更啄。


image.png

注意:如果在測試是開啟了lvs的長連接稚疹,會導(dǎo)致在設(shè)置的時間內(nèi)把客戶端一直調(diào)度到同一臺RS服務(wù)器上面。

關(guān)閉主調(diào)度器

image.png

客戶端訪問


image.png

我們還可以使用這些主機配置來兩套LVS高可用祭务,做一個雙主模型

第二套LVS信息

VIP:192.168.166.200

第一臺調(diào)度器為備份服務(wù)器

第二臺調(diào)度器為主服務(wù)器

第一臺調(diào)度器配置

! Configuration File for keepalived

global_defs {
   notification_email {
   root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3
   vrrp_mcast_group4 224.26.1.1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.166.100
    }
}

virtual_server 192.168.166.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#   persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 192.168.166.129 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
#第二套虛擬路由
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88            #ID不要和第一套虛擬路由相同
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
   virtual_ipaddress {
        192.168.166.200         
    }
}

virtual_server 192.168.166.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#   persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.166.129 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

第二臺的配置這里就不列出了,把第一臺服務(wù)器的配置文件修改一下内狗。下圖是配置好的結(jié)果。

第一臺服務(wù)器

image.png

第二臺服務(wù)器


image.png

RS配置

#!/bin/bash
vip=192.168.166.100
mask=255.255.255.255
dev=eth0:1                      
vip2=192.168.166.200        #添加一個VIP2
mask2=255.255.255.255
dev2=eth0:2                 #再添加一個eth0:2別名
case $1 in
start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ifconfig $dev $vip netmask $mask broadcast $vip up
        ifconfig $dev2 $vip2 netmask $mask2 broadcast $vip2 up      #設(shè)置地址
        route add -host $vip dev $dev
        route add -host $vip2 dev $dev2

;;
stop)
        ifconfig $dev down
        ifconfig $dev2 down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
        echo "Usage: $(basename $0) start|stop"
        exit 1
;;
esac

注:上面這份腳本RS1和RS2通用

RS


image.png

RS2


image.png

調(diào)度器LVS規(guī)則


image.png

測試

image.png
image.png

高可用雙主Nginx

配置Nginx主機

[root@centos7.3 ~]#yum -y install nginx                 #安裝nginx义锥,nginx在epel源柳沙。
[root@centos7.3 ~]#vim /etc/nginx/nginx.conf            #修改nginx主配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    
upstream web {                          #在http上下文中添加一個服務(wù)器組,web是組名拌倍。
    server 192.168.166.129:80;              #后端服務(wù)器的地址和端口
    server 192.168.166.132:80;
}

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

定義兩個Nginx虛擬主機

[root@centos7.3 nginx]#vim /etc/nginx/conf.d/host.conf 
server {
        server_name www.test.com;
        listen 80;
        index index.html;
        root /app/web;
        location / {
        proxy_pass http://web;

        }
}

zhu注:以上內(nèi)容兩臺主機相同

配置keepalived
第一臺

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}

第二臺Nginx

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}


! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3-1
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }

測試


image.png

keepalived可以調(diào)用外部的輔助腳本進行資源監(jiān)控赂鲤,并根據(jù)監(jiān)控的結(jié)果狀態(tài)能實現(xiàn)優(yōu)先動態(tài)調(diào)整噪径;

先定義一個腳本

vrrp_script <SCRIPT_NAME> {                  #定義腳本
    script "killall -0 sshd"                 #可以在引號內(nèi)調(diào)用命令或者腳本路徑,如果腳本執(zhí)行成功則不變蛤袒,如果失敗則執(zhí)行下面的命令
    interval INT                         #檢測間隔時間
    weight -INT                              #減掉權(quán)重
    fall    2                                #檢測幾次判定為失敗
    rise    2                                #檢測幾次判定為成功
}

killall -0 只是測試熄云,并不執(zhí)行操作,用來測試進程是否運行正常
調(diào)用此腳本

track_script {
    SCRIPT_NAME_1               #調(diào)用腳本
    SCRIPT_NAME_2  weight  -2    #如果腳本健康狀態(tài)檢測失敗優(yōu)先級減2
}

配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}
vrrp_script nginx {
        script "killall -0 nginx && exit 0 || exit 1"
        interval 1
        weight -15
        fall 2
        rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
   track_script {
        nginx
   }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}


測試

image.png
image.png
image.png
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妙真,一起剝皮案震驚了整個濱河市缴允,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珍德,老刑警劉巖练般,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锈候,居然都是意外死亡薄料,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門泵琳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摄职,“玉大人,你說我怎么就攤上這事获列」仁校” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵击孩,是天一觀的道長迫悠。 經(jīng)常有香客問我,道長巩梢,這世上最難降的妖魔是什么创泄? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮括蝠,結(jié)果婚禮上鞠抑,老公的妹妹穿的比我還像新娘。我一直安慰自己忌警,他們只是感情好碍拆,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慨蓝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪端幼。 梳的紋絲不亂的頭發(fā)上礼烈,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音婆跑,去河邊找鬼此熬。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的犀忱。 我是一名探鬼主播募谎,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阴汇!你這毒婦竟也來了数冬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搀庶,失蹤者是張志新(化名)和其女友劉穎拐纱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哥倔,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡秸架,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咆蒿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片东抹。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沃测,靈堂內(nèi)的尸體忽然破棺而出缭黔,到底是詐尸還是另有隱情,我是刑警寧澤芽突,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布试浙,位于F島的核電站,受9級特大地震影響寞蚌,放射性物質(zhì)發(fā)生泄漏田巴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一挟秤、第九天 我趴在偏房一處隱蔽的房頂上張望壹哺。 院中可真熱鬧,春花似錦艘刚、人聲如沸管宵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箩朴。三九已至,卻和暖如春秋度,著一層夾襖步出監(jiān)牢的瞬間炸庞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工荚斯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留埠居,地道東北人查牌。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像滥壕,于是被迫代替她去往敵國和親纸颜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一绎橘、高可用集群 (一)提升系統(tǒng)高可用性的解決方案:冗余(redundant) 工作模式active/passive...
    哈嘍別樣閱讀 1,727評論 2 5
  • Nginx+Keepalived實現(xiàn)站點高可用 公司內(nèi)部 OA 系統(tǒng)要做線上高可用胁孙,避免單點故障,所以計劃使用2臺...
    meng_philip123閱讀 1,905評論 2 18
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理金踪,服務(wù)發(fā)現(xiàn)浊洞,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 當(dāng)前大多數(shù)的互聯(lián)網(wǎng)系統(tǒng)都使用了服務(wù)器集群技術(shù)怨咪,集群是將相同服務(wù)部署在多臺服務(wù)器上構(gòu)成一個集群整體對外提供服務(wù)屋剑,這些...
    jiangmo閱讀 12,876評論 3 36
  • 再見唉匾,2016。 很想早一點和2016告別匠楚,因為有些不好巍膘,所以想要快一點告別,然而時間不走芋簿,我想推也推不動峡懈,終于過...
    二哈T閱讀 418評論 0 0