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的方案,總結以下:mysql

1. 本身在應用層代碼進行重試和負載均衡。好比發現一個鏈接掛掉,就自動在其餘鏈接上進行重試。應用層代碼重試須要應用本身配置多個doris前端節點地址。web

2. 若是使用 mysql jdbc connector 來鏈接Doris,可使用 jdbc 的自動重試機制:redis

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

3. 應用能夠鏈接到和應用部署到同一機器上的mysql proxy,經過配置mysql proxy的failover和loadbalance功能來達到目的。sql

 

對比這幾種方案vim

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

相關文章
相關標籤/搜索