1. 程式人生 > >lvs+keepalived+httpd高可用集群

lvs+keepalived+httpd高可用集群

lvs keepalived httpd

實驗環境

技術分享圖片
(1)本次基於VMware Workstation搭建一個四臺Linux(CentOS 7.4)系統所構成的一個服務器集群,其中兩臺負載均衡服務器(一臺為主機,另一臺為備機),另外兩臺作為真實的Web服務器(向外部提供http服務,這裏僅僅使用了CentOS默認自帶的http服務,沒有安裝其他的類似Tomcat、Jexus服務)。

  (2)本次實驗基於DR負載均衡模式,設置了一個VIP(Virtual IP)為172.18.38.99,用戶只需要訪問這個IP地址即可獲得網頁服務。其中,負載均衡主機為172.18.38.100,備機為172.18.38.101。Web服務器A為172.18.38.200,Web服務器B為172.18.38.201。

實驗準備

(1),綁定靜態IP地址

    [root@centos7-100 ~]# nmcli connection modify ens37 ipv4.addresses 172.18.38.100/16 ipv4.method manual connection.autoconnect yes 
    [root@centos7-101 ~]# nmcli connection modify ens37 ipv4.addresses 172.18.38.101/16 ipv4.method manual connection.autoconnect yes 
    [root@centos7-200 ~]# nmcli connection modify ens37 ipv4.addresses 172.18.38.200/16 ipv4.method manual connection.autoconnect yes 
    [root@centos7-201 ~]# nmcli connection modify ens37 ipv4.addresses 172.18.38.201/16 ipv4.method manual connection.autoconnect yes 

(2),同步時間

利用chronyd服務同步時間

1,在四臺主機上都執行下面的命令,註意時間服務器必須是一臺


    1,修改配置文件
     vim /etc/chrony.conf
        # Please consider joining the pool (http://www.pool.ntp.org/join.html).
        server 172.18.0.1  iburst #指定一臺服務器
    2,利用下面這條命令概略同步一下
      ntpdate 172.18.0.1 
     1 Apr 13:23:31 ntpdate[8517]: adjust time server 172.18.0.1 offset -0.350642 sec
    3,重啟chrony服務
     systemctl restart chronyd.service 

(3),關閉防火墻

    systemctl disable firewalld
    systemctl stop firewalld

(3),LVS+keepalived主從配置

1,在兩臺lvs服務器下載keepalived

    yum  -y install keepalived

1,keepvlived_master+lvs配置文件

vim /etc/keepalived/keepalived.conf 

    ! 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 proxy1  #服務器id
       vrrp_mcast_group4 224.1.1.1 #多播地址所有的keepalived會在這個地址通訊,決定誰工作
    }

    vrrp_instance VI_1 {
        state MASTER  #主服務器
        interface ens37 #網卡接口
        virtual_router_id 66 #服務器id
        priority 100  #優先級,
        advert_int 1 #心跳檢測 1秒一次
        authentication { #驗證
            auth_type PASS  #驗證類型,基於密碼
            auth_pass 123456 #密碼
        }
        virtual_ipaddress {
            172.18.38.99/16 #共享IP
        }

    }
    virtual_server 172.18.38.99 80 {
        delay_loop 6  
        lb_algo rr  #調度算法
        lb_kind DR  #調度模型
        #persistence_timeout 50 
        protocol TCP 
        sorry_server 127.0.0.1 80 
        real_server 172.18.38.200 80 {  #後端server_IP 及端口
            weight 1  #權重
            HTTP_GET {  #健康檢測方式
                url {
                  path /
                  status_code 200  
                }
                connect_timeout 3 #超時時間
                nb_get_retry 3 #重試次數
                delay_before_retry 3 #多長時間重試
            }
        }
        real_server 172.18.38.201 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
                  status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }

2,keepalived_slave+lvs配置

vim /etc/keepalived/keepalived.conf

    ! 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 proxy1
       vrrp_mcast_group4 224.1.1.1
    }

    vrrp_instance VI_2 {
        state SLAVE  "slave關鍵配置"
        interface ens37
        virtual_router_id 88
        priority 80
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            172.18.38.99/16
        }

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

3,在兩臺lvs服務器下載ipvsadm包

    yum install ipvsadm

4,在兩臺lvs主機上都啟動keepalived服務

    systemctl start keepalived
    systemctl enable keepalived

5,註意這時候會在ens37網卡上加上一個新的IP

    [root@centos7-lvs_master ~]# ip a 
        ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:39:48:cc brd ff:ff:ff:ff:ff:ff
    inet 172.18.38.101/16 brd 172.18.255.255 scope global ens37
       valid_lft forever preferred_lft forever
    inet 172.18.38.99/16 scope global secondary ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::a7b9:b100:4f55:480e/64 scope link 
       valid_lft forever preferred_lft forever

[root@centos7-lvs_slave  ~]# ip a 
        ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
            link/ether 00:50:56:39:48:cc brd ff:ff:ff:ff:ff:ff
            inet 172.18.38.101/16 brd 172.18.255.255 scope global ens37
                 valid_lft forever preferred_lft forever
            inet 172.18.38.99/16 scope global secondary ens37
                 valid_lft forever preferred_lft forever
            inet6 fe80::a7b9:b100:4f55:480e/64 scope link 
                 valid_lft forever preferred_lft forever

5,查看調度規則

    [root@centos7-lvs_master ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  172.18.38.99:80 rr
      -> 172.18.38.200:80             Route   1      0          4         
      -> 172.18.38.201:80             Route   1      0          4    

    [root@centos7-lvs_slave  ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  172.18.38.99:80 rr
      -> 172.18.38.200:80             Route   1      0          0         
      -> 172.18.38.201:80             Route   1      0          0       

(4),配置2個後端web服務器

1,安裝httpd軟件

    1,安裝httpd軟件
    yum install http
    2,啟動服務
        systemctl start httpd
        systemctl enable httpd
    2,生成web頁面,
        A主機
            echo web_server_A > /var/www/html/index.html
        b主機
            echo web_server_B > /var/www/html/index.html

2,在兩個web服務器執行下面的腳本,會在lo網卡上生成一個vip

vim lvs_br_rs.sh
    #!/bin/bash
    #Author:wangxiaochun
    #Date:2017-08-13
    vip=172.18.38.99   "只需要修改一下IP即可"
    mask=‘255.255.255.255‘
    dev=lo: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
        echo "The RS Server is Ready!"
        ;;
    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 "The RS Server is Canceled!"
        ;;
    *)
        echo "Usage: $(basename $0) start|stop"
        exit 1
        ;;
    esac

3,查看lo網卡

    [root@centos7-web_server_A ~]# ip a 
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 172.18.38.99/32 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

    [root@centos7-web_server_B ~]# ip a 
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 172.18.38.99/32 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

客戶端測試

1,不宕任何服務

    [root@centos6 ~]# for i in {1..10};do sleep 0.5;curl 172.18.38.99;done
    web_server_B
    web_server_A
    web_server_B
    web_server_A
    web_server_B
    web_server_A
    web_server_B
    web_server_A
    web_server_B
    web_server_A

2,宕掉一臺keepalived測試

    [root@centos7 lvs_master ~]# systemctl stop keepalived.service

    [root@centos6 ~]# for i in {1..10};do sleep 0.5;curl 172.18.38.99;done
    web_server_B
    web_server_A
    web_server_B
    web_server_A
    web_server_B
    web_server_A
    web_server_B
    web_server_A
    web_server_B
    web_server_A

測試通過

lvs+keepalived+httpd高可用集群