1. 程式人生 > 其它 >搭建高可用負載均衡器: haproxy+keepalived

搭建高可用負載均衡器: haproxy+keepalived

搭建高可用負載均衡器: haproxy+keepalived

簡介:企業業務量比較小的時候,單臺伺服器就可以滿足業務需要了。但是隨著業務發展,單伺服器的問題就凸顯出來了,如何透明的擴充套件伺服器和頻寬,增加伺服器吞吐量呢?負載均衡器可以解決以上問題。

企業業務量比較小的時候,單臺伺服器就可以滿足業務需要了。但是隨著業務發展,單伺服器的問題就凸顯出來了:

  • 當伺服器掛掉時,業務就會中斷
  • 當業務量增加,單臺伺服器效能變差,如何透明的擴充套件伺服器和頻寬,增加伺服器吞吐量

負載均衡器可以解決以上問題

1 負載均衡器拓撲圖

本文會根據拓撲圖,用haproxy和keepalived搭建一個負載均衡器

2 準備

2.1 準備環境

準備5臺CentOS7.3主機和一個VIP地址:

  • 準備一個可用IP用作虛擬IP(VIP):

    • VIP: 192.168.1.100
  • 負載均衡器會用到2臺主機,一主一備的架構

    • lb1(預設為主): 192.168.1.101
    • lb2(預設為備): 192.168.1.102
  • 後端伺服器叢集中主機的IP地址

    • s1: 192.168.1.2
    • s2: 192.168.1.3
    • s3: 192.168.1.4

2.2 主機配置

2.2.1 所有主機上關閉防火牆

systemctl stop firewalld
systemctl disable firewalld

2.2.2 所有主機關閉selinux

setenforce 0
vi /etc/selinux/config
SELINUX=disabled

2.3 安裝haproxy和keepalived

lb1和lb2上安裝haproxy和keepalived

yum install haproxy keepalived -y

2.4 安裝nginx(有其他後端測程式,可省略此步)

s1 s2 s3上安裝nginx,目的是把nginx作為後端,如果有其他後端程式,這一步可以省略

yum install epel-release -y
yum install nginx -y

2.3 配置keepalived

KeepAlived是基於VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)實現的一個高可用方案,通過VIP(虛擬IP)和心跳檢測來實現高可用

Keepalived有兩個角色,Master和Backup。一般會是1個Master,多個Backup。

Master會繫結VIP到自己網絡卡上,對外提供服務。Master和Backup會定時確定對方狀態,當Master不可用的時候,Backup會通知閘道器,並把VIP繫結到自己的網絡卡上,實現服務不中斷,高可用

2.3.1 配置Master

編輯lb1(192.168.1.101)上的/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   # 通知郵件伺服器的配置
   notification_email {
     # 當master失去VIP或則VIP的時候,會發一封通知郵件到[email protected]
     [email protected]
   }
   # 發件人資訊
   notification_email_from [email protected]
   # 郵件伺服器地址
   smtp_server 127.0.0.1
   # 郵件伺服器超時時間
   smtp_connect_timeout 30
   # 郵件TITLE
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    # 主機: MASTER
    # 備機: BACKUP
    state MASTER
    # 例項繫結的網絡卡, 用ip a命令檢視網絡卡編號
    interface eno16777984
    # 虛擬路由標識,這個標識是一個數字(1-255),在一個VRRP例項中主備伺服器ID必須一樣
    virtual_router_id 88
    # 優先順序,數字越大優先順序越高,在一個例項中主伺服器優先順序要高於備伺服器
    priority 100
    # 主備之間同步檢查的時間間隔單位秒
    advert_int 1
    # 驗證型別和密碼
    authentication {
        # 驗證型別有兩種 PASS和HA
        auth_type PASS
        # 驗證密碼,在一個例項中主備密碼保持一樣
        auth_pass 11111111
    }
    # 虛擬IP地址,可以有多個,每行一個
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 443 {
    # 健康檢查時間間隔
    delay_loop 6
    # 排程演算法
    # Doc: http://www.keepalived.org/doc/scheduling_algorithms.html
    # Round Robin (rr)
    # Weighted Round Robin (wrr)
    # Least Connection (lc)
    # Weighted Least Connection (wlc)
    # Locality-Based Least Connection (lblc)
    # Locality-Based Least Connection with Replication (lblcr)
    # Destination Hashing (dh)
    # Source Hashing (sh)
    # Shortest Expected Delay (seq)
    # Never Queue (nq)
    # Overflow-Connection (ovf)
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    # 通過排程演算法把Master切換到真實的負載均衡伺服器上
    # 真實的主機會定期確定進行健康檢查,如果MASTER不可用,則切換到備機上
    real_server 192.168.1.101 443 {
        weight 1
        TCP_CHECK {
            # 連線超埠
            connect_port 443
            # 連線超時時間
            connect_timeout 3
        }
    }
    real_server 192.168.1.102 443 {
        weight 1
        TCP_CHECK {
            connect_port 443
            connect_timeout 3
        }
    }
}

2.3.2 配置BACKUP

編輯lb2(192.168.1.102)上的/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   # 通知郵件伺服器的配置
   notification_email {
     # 當master失去VIP或則VIP的時候,會發一封通知郵件到[email protected]
     [email protected]
   }
   # 發件人資訊
   notification_email_from [email protected]
   # 郵件伺服器地址
   smtp_server 127.0.0.1
   # 郵件伺服器超時時間
   smtp_connect_timeout 30
   # 郵件TITLE
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    # 主機: MASTER
    # 備機: BACKUP
    state BACKUP
    # 例項繫結的網絡卡, 用ip a命令檢視網絡卡編號
    interface eno16777984
    # 虛擬路由標識,這個標識是一個數字(1-255),在一個VRRP例項中主備伺服器ID必須一樣
    virtual_router_id 88
    # 優先順序,數字越大優先順序越高,在一個例項中主伺服器優先順序要高於備伺服器
    priority 99
    # 主備之間同步檢查的時間間隔單位秒
    advert_int 1
    # 驗證型別和密碼
    authentication {
        # 驗證型別有兩種 PASS和HA
        auth_type PASS
        # 驗證密碼,在一個例項中主備密碼保持一樣
        auth_pass 11111111
    }
    # 虛擬IP地址,可以有多個,每行一個
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 443 {
    # 健康檢查時間間隔
    delay_loop 6
    # 排程演算法
    # Doc: http://www.keepalived.org/doc/scheduling_algorithms.html
    # Round Robin (rr)
    # Weighted Round Robin (wrr)
    # Least Connection (lc)
    # Weighted Least Connection (wlc)
    # Locality-Based Least Connection (lblc)
    # Locality-Based Least Connection with Replication (lblcr)
    # Destination Hashing (dh)
    # Source Hashing (sh)
    # Shortest Expected Delay (seq)
    # Never Queue (nq)
    # Overflow-Connection (ovf)
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    # 通過排程演算法把Master切換到真實的負載均衡伺服器上
    # 真實的主機會定期確定進行健康檢查,如果MASTER不可用,則切換到備機上
    real_server 192.168.1.101 443 {
        weight 1
        TCP_CHECK {
            # 連線超埠
            connect_port 443
            # 連線超時時間
            connect_timeout 3
        }
    }
    real_server 192.168.1.102 443 {
        weight 1
        TCP_CHECK {
            connect_port 443
            connect_timeout 3
        }
    }
}

2.4 配置haproxy

編輯lb1(192.168.1.101)和lb2(192.168.1.102)上的/etc/haproxy/haproxy.cfg
把後端伺服器IP(192.168.1.2, 192.168.1.3, 192.168.1.4)加到backend裡

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4096
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

listen stats
    bind    *:9000
    mode    http
    stats   enable
    stats   hide-version
    stats   uri       /stats
    stats   refresh   30s
    stats   realm     Haproxy\ Statistics
    stats   auth      admin:admin


frontend  k8s-api
    bind *:443
    mode tcp
    option tcplog
    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }
    default_backend k8s-api-backend

backend k8s-api-backend
    mode tcp
    option tcplog
    option tcp-check
    balance roundrobin
    server master1 192.167.1.2:80 maxconn 1024 weight 5 check
    server master2 192.167.1.3:80 maxconn 1024 weight 5 check
    server master3 192.167.1.4:80 maxconn 1024 weight 5 check

2.5 配置nginx

給nginx新增SSL證書,配置過程略

vi /usr/share/nginx/html/index.html

把index.html裡面字串Welcome to nginx改成Welcome to nginx HA

3 啟動服務

3.1 啟動nginx

sudo systemctl start nginx
sudo systemctl enable nginx

3.2 啟動haproxy

sudo systemctl start haproxy
sudo systemctl enable haproxy

3.3 啟動keepalived

sudo systemctl start keepalived
sudo systemctl enable keepalived

在MASTER上執行ip a

 eno16777984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:xx:xx:xx:3d:0c brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.101/24 brd 192.168.1.255 scope global eno16777984
       valid_lft forever preferred_lft forever
    inet 192.168.1.100/32 scope global eno16777984
       valid_lft forever preferred_lft forever
    inet6 eeee:eeee:1c9d:2009:250:56ff:fe9c:3d0c/64 scope global noprefixroute dynamic
       valid_lft 7171sec preferred_lft 7171sec
    inet6 eeee::250:56ff:eeee:3d0c/64 scope link
       valid_lft forever preferred_lft forever

會發現VIP(192.168.1.100)已經繫結好了

inet 192.168.1.100/32 scope global eno16777984
       valid_lft forever preferred_lft forever

如果發現VIP無法繫結

vi /etc/sysctl.conf

新增兩行

net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1

讓新配置生效

sysctl -p

4 驗證

4.1 檢視狀態

1. 在瀏覽器輸入 http://192.168.1.100:9000/stats 檢視haproxy狀態
2. 在瀏覽器輸入 https://192.168.1.100 檢視服務狀態
   是否成功顯示為nginx歡迎頁面

4.2 主備切換

1. 在瀏覽器輸入 https://192.168.1.100 檢視是否成功顯示nginx歡迎頁面
2. lb1(192.168.1.101)關機,檢視是否還可以訪問https://192.168.1.100, 如果成功,則說明VIP成功切換到備機
3. 在lb2(192.168.1.102)上執行ip a,檢視網絡卡是否繫結VIP(192.168.1.100)
3. 啟動lb1(192.168.1.101)
   目的是為了驗證VIP是否切回MASTER主機(因為MASTER端的配置檔案中priority為100,而BACKUP為99,health check會自動把VIP繫結到priority高的主機上)