LoadBalancerv2的原理分析

OpenStack 是直接採用各類開源可用的負載均衡項目來完成負載均衡的任務,默認使用 HAProxy。LBaaSv2 本質來講,其實也是根據用戶提出的負載均衡要求,生成符合的HAProxy配置文件並啓動 HAProxy,而後由 HAProxy 進行負載均衡。html

High Availability Proxy(HAProxy)?

​ HAProxy 是個著名的開源的軟件 TCP(四層)/HTTP(七層) 負載均衡器和代理(proxy)軟件,能夠運行在 Linux,Solaris 和 FreeBSD 等系統上。目前,它已經被許多大公司採用,包括GitHub, Imgur, Instagram, and Twitter 等。它相似 Nginx 的,採用了單進程和事件驅動模型;它使用的內存量低並且穩定,可以處理大量併發請求。前端

在這裏我簡單羅列HAProxy配置。詳細內容查看:python

http://www.cnblogs.com/wanstack/p/8392332.htmlweb

haproxy 配置中分紅五部份內容,分別以下:
​ global:參數是進程級的,一般是和操做系統相關。這些參數通常只設置一次,若是配置無誤,就不須要再次進行修改。
​ defaults:配置默認參數,這些參數能夠被用到frontend,backend,Listen組件。
​ frontend:接收請求的前端虛擬節點,Frontend能夠更加規則直接指定具體使用後端的backend。
​ backend:後端服務集羣的配置,是真實服務器,一個Backend對應一個或者多個實體服務器。
​ Listen Fronted和backend的組合體。redis

neutron的LoadBalancerv2配置文件在 /etc/haproxy/haproxy.cfg中數據庫

###########全局配置#########  
global
        log /dev/log    local0 #[日誌輸出配置,全部日誌都記錄在本機,經過local0輸出] 
        log /dev/log    local1 notice #定義haproxy 日誌級別[error warringinfo debug] 
        chroot /var/lib/haproxy 
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy  #能夠由配置項 user_group 指定,默認爲 nogroup
        daemon  #之後臺形式運行harpoxy
        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private
        # Default ciphers to use on SSL-enabled listening sockets.
        # For more information, see ciphers(1SSL). This list is from:
        #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3
 
########默認配置############  
defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

  

咱們事先建立了qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2,咱們看看它的配置文件後端

root@netagent:~# ip netns list
qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2

  

該負載均衡是1個LoadBalance對應1個listener,1個pool。服務器

在/var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy.conf 中網絡

# Configuration for loadbalance1
global
    daemon
    user nobody
    group haproxy
    log /dev/log local0
    log /dev/log local1 notice
    stats socket /var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy_stats.sock mode 0666 level user
defaults
    log global
    retries 3
    option redispatch
    timeout connect 5000
    timeout client 50000
    timeout server 50000
frontend 62ac018e-f6fc-4d60-80df-13b1e4cdc6f6
    option tcplog
    maxconn 100
    option forwardfor
    bind 2.2.2.20:80
    mode http
    default_backend 8d28b2c3-9c44-46e5-b2eb-7bd9b8d5faf6
backend 8d28b2c3-9c44-46e5-b2eb-7bd9b8d5faf6
    mode http
    balance roundrobin
    timeout check 1
    option httpchk GET /index.html
    http-check expect rstatus 201|200|202
    server d56fc582-33cd-4fc7-b95f-16534c8a4860 2.2.2.5:80 weight 1 check inter 1s fall 5
    server cc2230bf-f3b8-4beb-8584-71b0f3a0ba5c 2.2.2.4:80 weight 1 check inter 1s fall 5
    server b490cadb-cff1-4e7a-92c7-a134c0f8b321 2.2.2.6:80 weight 1 check inter 1s fall 5

  

LBaasv2 能夠看作 OpenStack Neutron 對各類物理負載均衡器的虛擬化。它的概念能夠和 HAProxy 中的概念進行類比:併發

HAProxy 的概念 LBaasv2 的概念 說明
  Driver LBaas v2也是採起 driver 模型來支持多種物理的負載均衡器。LBaasv2 默認實現了 HAProxy driver,同時,它也支持多個其餘 Vendor driver。廠商驅動
Frontend Listener LBaasv2採用Listener方式將流量轉移到不一樣的pool中的member。
Backend Pool 表明Listener所監聽的負載後端的虛擬機池。
Backend server Member Member 對應的是 pool 裏面處理網絡請求的一個 OpenStack Nova 虛機
Health check Health monitor 它用來監測 pool 裏面 member 的狀態,支持 HTTP, TCP, 和 ping 等多種檢測方法。在 Nuetron 中這是可選的,若是沒有 Health monitor,pool 會一直認爲全部的 member 都是 ACTIVE 狀態,這樣全部的 member 會一直出如今 VIP 的分發列表中,哪怕 member 對應的實例不能響應網絡請求。這在實際應用中會形成負載均衡的響應異常。

LoadBalancerv2的使用場景?

 

 

​ 由上圖可知道,一個LoadBalancerv2能夠對應多個Pool,咱們另外又創建一個pool以下所示:

在/var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy.conf 中

 

# Configuration for loadbalance1
global
    daemon
    user nobody
    group haproxy  #能夠由配置項 user_group 指定,默認爲 nogroup
    log /dev/log local0
    log /dev/log local1 notice
    stats socket /var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy_stats.sock mode 0666 level user
        
defaults #不用管
    log global
    retries 3
    option redispatch
    timeout connect 5000
    timeout client 50000
    timeout server 50000
frontend 62ac018e-f6fc-4d60-80df-13b1e4cdc6f6
    option tcplog
    maxconn 100
    option forwardfor  # 當 mode 爲 」http「時,設置 forwardfor,使得經過 X-Forward-For 頭來保存原始的源 IP 地址
    bind 2.2.2.20:80 #監聽Listener的vip:port
    mode http #監聽Protocol
    default_backend 8d28b2c3-9c44-46e5-b2eb-7bd9b8d5faf6 #對應的監聽池
frontend bf144f31-cdbb-4426-b90b-4bdbc67501f1
    option tcplog
    maxconn 100
    option forwardfor
    bind 2.2.2.20:100
    mode http
    default_backend 8b50ed30-5290-421c-9d31-fb3751a26be2
backend 8b50ed30-5290-421c-9d31-fb3751a26be2
    mode http
    balance roundrobin
    server bef852d0-9164-46ee-ace5-92462e8d89ef 2.2.2.14:100 weight 1
   server 8aeb5cc2-7301-4931-ac3b-e0d0ca891e88 2.2.2.15:100 weight 1
    server 250a919f-dfc1-41b6-8378-2b4015f1acd0 2.2.2.16:100 weight 1
backend 8d28b2c3-9c44-46e5-b2eb-7bd9b8d5faf6
    mode http
    balance roundrobin
    timeout check 1
    option httpchk GET /index.html
    http-check expect rstatus 201|200|202
    server cc2230bf-f3b8-4beb-8584-71b0f3a0ba5c 2.2.2.4:80 weight 1 check inter 1s fall 5
	# member1 的配置,包括 ip,port(member 提供服務的端口,此時沒有指定check port,所以也是健康檢查的	 TCP端口),weight;check 指定作健康檢查;
     # inter 指定兩次連續檢查之間的間隔,默認2s (1s);fall 指定 Max Retries 或者連續幾回檢查失敗即認爲member 是 DOWN 的次數 (5) server d56fc582-33cd-4fc7-b95f-16534c8a4860 2.2.2.5:80 weight 1 check inter 1s fall 5 server b490cadb-cff1-4e7a-92c7-a134c0f8b321 2.2.2.6:80 weight 1 check inter 1s fall 5

  

訪問wget -O - http://2.2.2.2:80 和wget -O - http://2.2.2.2:100都成功。

以上是vip與pool的members同在一個subnet下,下面咱們驗證一下vip與pool的members不在同一個subnet。

咱們建立一個新的Loadbalance和一個listener,vip地址爲7.7.7.7,而後建立一個pool,注意一個虛擬機能夠加入多個pool,因此咱們還把上面的虛擬機加入這個新建的pool中。而後經過路由器subnet7.7.7.0/24和subnet2.2.2.0/24連通。也就是說vip7.7.7.7能與member2.2.2.4,2.2.2.5,2.2.2.6是聯通的。

配置以下/var/lib/neutron/lbaas/v2/5081116f-8928-40d7-8aaa-e30c336ca713/haproxy.conf

# Configuration for loadbalance3
global
    daemon
    user nobody
    group haproxy
    log /dev/log local0
    log /dev/log local1 notice
    stats socket /var/lib/neutron/lbaas/v2/5081116f-8928-40d7-8aaa-e30c336ca713/haproxy_stats.sock mode 0666 level user
defaults
    log global
    retries 3
    option redispatch
    timeout connect 5000
    timeout client 50000
    timeout server 50000
frontend 84800dd3-0507-4628-b54b-a23226bec4f8
    option tcplog
    maxconn 100
    option forwardfor
    bind 7.7.7.7:80
    mode http
    default_backend 3583deda-e9ca-40bb-ba23-0fec204c099f
backend 3583deda-e9ca-40bb-ba23-0fec204c099f
    mode http
    balance roundrobin
    server 48b36860-8e4d-476e-9196-ad052c317f44 2.2.2.5:80 weight 1
    server f8732b2a-bfaa-4e5f-b8bb-f88c9fed899b 2.2.2.4:80 weight 1
    server 004f7950-4031-4de3-98b2-ca30e39c4e4e 2.2.2.6:80 weight 1

  

也就是說只要vip與member可通訊便可,不必定要在同一個subnet中。

另外,若是要從外網訪問的話,則還須要建立一個 floating ip 而且把它關聯到 lb 的vip 上。 haproxy 所在的namespace 其實只有一個IP地址,分別接收外部鏈接以及和成員之間的鏈接。

LoadBalancerv2的多agent模式?

​ LoadBalancerv2服務能夠獨立部署在服務器上,包括2個服務,neutron-openvswitch-agent 和neutron-lbassv2-agent。假設有2個節點都部署了LoadBalancerv2服務,當neutron-server發出建立請求時,會在這兩個節點選擇一個建立對應得namespace空間。

LoadBalancerv2的流程分析?

​ 咱們以qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2爲例子來分析這個過程。

ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
9: tap83f82fcf-d1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
    link/ether fa:16:3e:d1:c8:b1 brd ff:ff:ff:ff:ff:ff
    inet 2.2.2.20/24 brd 2.2.2.255 scope global tap83f82fcf-d1  #vip的地址
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fed1:c8b1/64 scope link 
       valid_lft forever preferred_lft forever

  

​ 該接口tap83f82fcf-d1掛在ovs上,並被打上它所在network的vlan_id的:

Bridge br-int
       fail_mode: secure
       Port patch-tun
           Interface patch-tun
               type: patch
               options: {peer=patch-int}
       Port br-int
           Interface br-int
               type: internal
       Port "tap83f82fcf-d1"
           tag: 1
           Interface "tap83f82fcf-d1"
               type: internal

  ​ 對於LoadBalancerv2建立過程(在v2中指Create a load balancer和Create listener完成,咱們發現當只是完成Create a load balancer時候,並無出現namespace,當Create listener完成時纔會有namespace出現)咱們對等以下操做:

ovs-vsctl --if-exists del-port tap83f82fcf-d1 --add-port br-int tap83f82fcf-d1 --set Interface tap83f82fcf-d1 type=internal --set Interface tap83f82fcf-d1 external-ids:iface-id=83f82fcf-d141-4774-87a0-ace79196bc88 --set Interface tap83f82fcf-d1 external-ids:iface-status=active --set Interface tap83f82fcf-d1 external-ids:attached-mac=fa:16:3e:d1:c8:b1
#iface-id 和 attached-mac能夠在數據庫中查到
ip link set tap83f82fcf-d1 address fa:16:3e:d1:c8:b1
ip netns add qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2  
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 sysctl -w net.ipv4.conf.all.promote_secondaries=1
ip link set tap83f82fcf-d1 netns qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip link set lo up
ip link set tap83f82fcf-d1 netns qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip link set tap83f82fcf-d1 up
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip addr show tap83f82fcf-d1 permanent scope global
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip -4 addr add 2.2.2.20/24 brd 255.255.255.0 scope global dev tap83f82fcf-d1
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip route list dev tap83f82fcf-d1 scope link
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 route add default gw 2.2.2.1
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 arping -U -I tap83f82fcf-d1 -c 3 2.2.2.20

  

LoadBalancerv2的源碼解讀?

​ LoadBalancerv2的代碼結構以下:

1.Create a load balancer

2.Create a listener

3.Create a pool

4.Add member

5.Create a health monitor

相關文章
相關標籤/搜索