Doris FE負載均衡配置


0 背景概述

 

Doris完全兼容了mysql協議,並且Doris FE本身通過多follower選舉機制選舉出master,可以保證fe本身的高可用性,也可以通過加入observer fe節點來提高fe的讀並發能力。但是對於前端連接來講,還是需要顯示執行要連接的fe的url(jdbc)或host ip地址.通過這種方式,如果要訪問的fe掛掉的話,上面的應用層就會出錯。通過這種方式來訪問Doris提供的服務,應用層代碼是不夠健壯的。Doris官方提供了幾種fail over和load balance的方案,總結如下:

1. 自己在應用層代碼進行重試和負載均衡。比如發現一個連接掛掉,就自動在其他連接上進行重試。應用層代碼重試需要應用自己配置多個doris前端節點地址。

2. 如果使用 mysql jdbc connector 來連接Doris,可以使用 jdbc 的自動重試機制:

jdbc:mysql://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...

3. 應用可以連接到和應用部署到同一機器上的mysql proxy,通過配置mysql proxy的failover和loadbalance功能來達到目的。

 

對比這幾種方案

1. 有點是不需要部署復雜的組件來支持,直接在應用層進行處理,缺點是將fe節點的部署情況和應用層代碼進行了耦合,不利於系統的擴展。

2. 同方案1,只是將這種耦合轉移到了jdbc的連接字符串上面了,而且這種方案還不通用,僅限於使用mysql jdbc jar包的方式來進行訪問的Dodis的情況,對於其他的訪問方式,如odbc,這種方案就不可用了。

3. 此方案個人認為是這幾種方案中最好的解決方案,對上層應用處理來講,透明化了,擴展性也比較強,缺點是必須部署更多的組件。

 

本文將通過構建一個haproxy+keepalived 組合的FE負載均衡集群的方式來講方案3的具體應用。

1. 集群規划:

192.168.1.101   palo101           CentOS 7.4    FE observer + BE+Haproxy 
192.168.1.102   palo102           CentOS 7.4    FE observer + BE+Haproxy+KeepAlived 
192.168.1.103   palo103           CentOS 7.4    FE observer + BE+Haproxy+KeepAlived 
192.168.1.104                                   LoadBalancer VIP

說明:

a) 其中 192.168.1.101, 192.168.1.102,192.168.1.103上的Doris FE和Doris BE均已安裝好,具體安裝請參見Doris官方文檔或者本人的前期博文,這里不再贅述。本文的范疇是構建fe的負載均衡器。

b) 192.168.1.104僅僅是一個可用的ip地址資源,沒有被任何主機占用。負載均衡器在主備的時候會選舉一個vip loadbalance,並在此地址上提供負載均衡服務,也就是說上層應用層代碼均通過連接此地址來使用Doris提供的服務。

 

2. 安裝HaProxy

 Haproxy是一個開源的高性能的反向代理或者說是負載均衡服務軟件之一,它支持雙機熱備、虛擬主機、基於TCP和HTTP應用代理等功能。其配置簡單,而且擁有很好的對服務器節點的健康檢查功能(相當於keepalived健康檢查),當其代理的后端服務器出現故障時,Haproxy會自動的將該故障服務器摘除,當服務器的故障恢復后Haproxy還會自動將RS服務器。

HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

Haproxy軟件引入了frontend,backend的功能,frontend(acl規則匹配)可以根據任意HTTP請求頭做規則匹配,然后把請求定向到相關的backend(server pools等待前端把請求轉過來的服務器組)。通過frontend和backup,我們可以很容易的實現haproxy的7層代理功能,haproxy是一款不可多得的優秀代理服務軟件。

2.1 在192.168.1.101,192.168.1.102,192.168.1.103三台機器上分別安裝haproxy

yum -y install haproxy 

配置如下:

sudo vim  /etc/haproxy/haproxy.cfg

輸入如下內容:

global

    log         127.0.0.1 local2         #日志定義級別
    chroot      /var/lib/haproxy         #當前工作目錄
    pidfile     /var/run/haproxy.pid     #進程id
    maxconn     4000                     #最大連接數
    user        haproxy                  #運行改程序的用戶
    group       haproxy
    daemon                               #后台形式運行
    stats socket /var/lib/haproxy/stats

defaults
    mode                    tcp           #haproxy運行模式(http | tcp | health)
    log                     global
    option                  dontlognull
    option                  redispatch    #serverId對應的服務器掛掉后,強制定向到其他健康的服務器
    option                  tcp-smart-accept
    option                  tcp-smart-connect
    retries                 3             #三次連接失敗則服務器不用
    timeout http-request    15s
    timeout queue           5m
    timeout connect         10s           #連接超時
    timeout client          480m          #客戶端超時
    timeout server          480m          #服務器超時
    timeout http-keep-alive 10s
    timeout check           10s           #心跳檢測
    maxconn                 900           #最大連接數

listen stats                              #配置haproxy狀態頁(用來查看的頁面)
    mode http
    bind :8888                            #web前端監控頁面的監聽端口
    stats enable
    stats hide-version                    #隱藏haproxy版本號
stats uri     /haproxyadmin?stats         #一會用於打開狀態頁的uri
    stats realm   Haproxy\ Statistics     #輸入賬戶密碼時的提示文字
    stats auth    admin:admin             #用戶名:密碼

frontend  main
bind 0.0.0.0:3306                        #使用3306端口。監聽前端端口【表示任何ip訪問3306端口都會將數據輪番轉發到mysql服務器群組中】
    default_backend             palofe   #后端服務器組名

backend palofe
    #balance     leastconn                 //使用最少連接方式調度
    balance roundrobin #設置默認負載均衡方式,輪詢方式
    server  palofe161   192.168.1.101:9030 check port 9030  maxconn 300 inter 5000 fall 3 rise 3 #轉發到101的9030端口,並監聽9030端口,監聽間隔為5秒鍾,如果連續兩次檢測不到活躍,則從ha群組中剔除,如果連續兩次成功,則恢復到群組中來
    server  palofe164   192.168.1.102:9030 check port 9030  maxconn 300 inter 5000 fall 3 rise 3
    server  palofe046   192.168.1.103:9030 check port 9030  maxconn 300 inter 5000 fall 3 rise 3

說明: Doris FE我們使用的默認端口9030,而mysql默認端口為3306,為了使mysql客戶端連接負載均衡器時的使用習慣和mysql保持兼容,我們的設置haproxy的監聽端口為3306.(使用mysql客戶端連接時,如果不輸入端口號,默認為3306)

這個體現在配置中就是:

bind 0.0.0.0:3306 #使用3306端口。監聽前端端口【表示任何ip訪問3306端口都會將數據輪番轉發到doris fe集群群組中】

我們在haproxy的backend中進行了端口映射,把訪問3306端口的請求轉發到Doris FE的9030端口,采用的是輪詢roundrobin 分配算法。

 

2.2 啟動haproxy並設置開啟啟動

sudo systemctl start haproxy     #啟動
sudo systemctl enable haproxy   #設置開機啟動

2.3 測試haproxy

在192.168.1.101上用瀏覽器打開http://192.168.1.101:8888/haproxyadmin?stats,用戶名密碼為admin:admin(在上面haproxy.conf文件中配置的),其他機器可以更換IP地址,操作亦同。如果出現以下界面,則表明haproxy安裝成功。

 

注:如果是要通過tar包安裝的haproxy,最好創建haproxy.service(通過rpm包或者yum安裝的不需要做此操作),操作如下:

sudo /usr/lib/systemd/system/haproxy.service

填寫以下內容:

[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target

[Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000
Type=forking
ExecStart=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg

[Install]
WantedBy=multi-user.target

其中ExecStart=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg 記得修改成自己實際的路徑

 

3. 安裝Keepalived

 keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議。

虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N台提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。

keepalived主要有三個模塊,分別是core、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。

3.1. 在192.168.1.101,192.168.1.102,192.168.1.103三台機器上分別安裝keepalived

sudo yum install -y keepalived 

3.2 配置keepalived

sudo vim  /etc/keepalived/keepalived.conf

輸入如下配置信息:

#簡單的頭部,這里主要可以做郵件通知報警等的設置,此處就暫不配置了;
global_defs {
        #notificationd LVS_DEVEL
        router_id palo101
}
#預先定義一個腳本,方便后面調用,也可以定義多個,方便選擇;
vrrp_script chk_haproxy {
    script "/etc/keepalived/chk.sh"  #具體腳本路徑
    interval 2  #腳本循環運行間隔
    timeout 2
    fall 3
}
#VRRP虛擬路由冗余協議配置
vrrp_instance VI_1 {       #VI_1 是自定義的名稱;
    state BACKUP           #MASTER表示是一台主設備,BACKUP表示為備用設備【我們這里因為設置為開啟不搶占,所以都設置為備用】
    nopreempt              #開啟不搶占
    interface ens192       #指定VIP需要綁定的物理網卡
    virtual_router_id 11   #VRID虛擬路由標識,也叫做分組名稱,該組內的設備需要相同
    priority 130           #定義這台設備的優先級 1-254;開啟了不搶占,所以此處優先級必須高於另一台

    advert_int 1           #生存檢測時的組播信息發送間隔,組內一致
    authentication {       #設置驗證信息,組內一致
        auth_type PASS     #有PASS 和 AH 兩種,常用 PASS
        auth_pass edw      #密碼
    }
    virtual_ipaddress {
        192.168.1.104 #指定VIP地址,組內一致,可以設置多個IP
    }
    track_script {         #使用在這個域中使用預先定義的腳本,上面定義的
        chk_haproxy   
    }

    notify_backup "/etc/keepalived/restart_haproxy.sh" #表示當切換到backup狀態時,要執行的腳本 
notify_fault
"/etc/keepalived/restart_haproxy.sh" #故障時執行的腳本
}

注意: 幾台機器的priority要設置為不同,以便可以進行搶占工作。 在本例中101-103的priority分別設置為 110,120,130 

 

在上述配置中用到了chk.sh文件,用於檢測本機的haproxy是否alive,並在檢測haproxy死亡時出發處理動作,所以我們創建chk.sh文件

sudo vim /etc/keepalived/chk.sh

輸入以下內容:

#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
       /usr/bin/systemctl  stop keepalived
fi

授權chk.sh執行權限

sudo chmod +x /etc/keepalived/chk.sh

創建文件restart_haproxy.sh

sudo vim /etc/keepalived/restart_haproxy.sh

填寫內容如下:

/usr/bin/systemctl restart haproxy

授權restart_haproxy.sh執行權限

sudo chmod +x /etc/keepalived/restart_haproxy.sh

這里對haproxy活躍檢測失敗的處理是停止掉本機的keepalived進程,出讓vip

 

3.3 設置keepalived開機啟動並啟動keepalived

sudo systemctl enable keepalived    #設置開機啟動
sudo systemctl start  keepalived    #啟動keepalived

 

4. 負載均衡測試

 4.1 測試通過3306端口可以訪問到Doris

a) 所有三台機器的haproxy,keepalived,doris fe全部開啟

b) 使用mysql客戶端連接192.168.1.104,並且不帶參數-P 3306指定端口

mysql -h 192.168.1.104 -uroot -proot

測試效果如下:

說明: 3306端口在虛擬機器上監聽成功。(192.168.1.104實際上並沒有安裝任何實際的機器,完全由負載均衡器選舉產生的訪問資源,是一個虛擬的活躍vip負載均衡器)

 

4.2  停止掉102.168.1.102,192.168.1.103上的keepalived,並使用mysql客戶端通過3306端口訪問負載均衡器,連接失敗

sudo systemctl stop keepalived   #停止keepalived
mysql -h 192.168.1.104 -uroot -proot
Warning: Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.104' (113)

 

4.3 高可用測試

4.3.1 啟動三台機器上的haproxy, 並啟動192.168.1.102,192.168.1.103上的keepalived

首先查看三台機器的相關進程id

192.168.1.101

[edw@palo101 ~]$ ps -e | grep haproxy
 9084 ?        00:00:00 haproxy-systemd
 9085 ?        00:00:00 haproxy
 9086 ?        00:00:04 haproxy

192.168.1.102

[edw@palo102 keepalived]$ ps -e | grep haproxy
16592 ?        00:00:00 haproxy-systemd
16593 ?        00:00:00 haproxy
16594 ?        00:00:00 haproxy
[edw@palo102 keepalived]$ ps -e | grep keepalived
16580 ?        00:00:00 keepalived
16581 ?        00:00:00 keepalived
16582 ?        00:00:00 keepalived

192.168.1.103

[edw@palo103 keepalived]$ ps -e | grep haproxy
19910 ?        00:00:00 haproxy-systemd
19911 ?        00:00:00 haproxy
19912 ?        00:00:00 haproxy
[edw@palo103 keepalived]$ ps -e | grep keepalived
19975 ?        00:00:00 keepalived
19976 ?        00:00:00 keepalived
19977 ?        00:00:00 keepalived

 

4.3.2 瀏覽器打開http://192.168.1.104:8888/haproxyadmin?stats

注意:我們打開的是104的url,也就是部署在102和103上的keepalived選舉出的vip loadbalancer的ip地址.

目前是102獲得了vip load balancer

4.3.3 在192.168.1.102上關閉haproxy

sudo kill -9 16594

刷新4.3.2中打開的瀏覽器頁面,

我們發現目前取得vip的地址轉移到了103上,實現了高可用,一台機器上的負載均衡器掛了之后,另外一台依然可用。實現了對負載均衡器的vip主備功能。(實際上,http://192.168.1.104:8888/haproxyadmin?stats該url依然可以打開,就說明負載均衡器依然活着)

並且在三個haproxy中,發現了一台掛的,也就是圖中黃色的條目,就是代表102的機器

 

4.3.4 在192.168.1.102上啟動haproxy

[edw@palo102 keepalived]$ sudo systemctl start haproxy
[edw@palo102 keepalived]$ ps -e | grep haproxy
20228 ?        00:00:00 haproxy-systemd
20229 ?        00:00:00 haproxy
20230 ?        00:00:00 haproxy

 

4.4.5 刷新4.3.2中打開的頁面http://192.168.1.104:8888/haproxyadmin?stats

發現vip依然在103上,沒有發生vip負載均衡器的更換,並且三個負載均衡器均處於活躍狀態,即當vip宕機之后,vip發生轉移,但是之前掛掉的vip(現在已經選舉出了新的vip了)重新online后,不會發生控制權的轉移。

 

4.4 負載測試

安裝抓包工具tcpdump

sudo yum install -y  tcpdump

在192.168.1.101,192.168.1.102,192.168.1.103分別啟動抓包

sudo tcpdump -n -i ens192 host 192.168.1.101 and 192.168.1.104  #101機器上,注意ens192為當前機器的活躍mac網卡的名稱,各個機器可能會不一樣,請注意根據自己的實際情況修改
sudo tcpdump -n -i ens192 host 192.168.1.102 and 192.168.1.104  #102機器上,注意ens192為當前機器的活躍mac網卡的名稱,各個機器可能會不一樣,請注意根據自己的實際情況修改
sudo tcpdump -n -i ens192 host 192.168.1.103 and 192.168.1.104  #103機器上,注意ens192為當前機器的活躍mac網卡的名稱,各個機器可能會不一樣,請注意根據自己的實際情況修改

 抓包結果:

192.168.1.101

[edw@palo101 ~]$ sudo tcpdump -n -i ens192 host 192.168.1.101 and 192.168.1.104
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes

192.168.1.102

[edw@palo102 keepalived]$ sudo tcpdump -n -i ens192 host 192.168.1.102 and 192.168.1.104
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes

192.168.1.103

[edw@palo103 keepalived]$ sudo tcpdump -n -i ens192 host 192.168.1.103 and 192.168.1.104
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes

使用mysql客戶端連接mysql -h 192.168.1.104 -uroot -proot 負載均衡器,並進行一些操作。由於我們采用的是roundrobin輪詢算法,所以結果很明顯,三台機器都抓到了請求包,說明負載均衡起作用了。

 

4.5 測試任意一台fe宕機,該fe會被移出haproxy群組

4.5.1 在192.168.1.101中,執行下面命令停止palo_fe

[edw@palo101 ~]$ sudo supervisorctl stop palo_fe
palo_fe: stopped
[edw@palo101 ~]$ sudo supervisorctl status palo_fe
palo_fe                          STOPPED   Dec 10 05:47 PM

刷新4.3.2中的頁面http://192.168.1.104:8888/haproxyadmin?stats

監控頁面中101服務器顯示為down狀態,后續請求將不會轉發到該節點。

 

4.5.2 在192.168.1.101中啟動palo_fe,查看該節點的fe又重新已經被加入到服務群組中來了

[edw@palo101 ~]$ sudo supervisorctl start palo_fe
palo_fe: started
[edw@palo101 ~]$ sudo supervisorctl status palo_fe
palo_fe                          RUNNING   pid 31924, uptime 0:00:07

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM