在 CDP 中,有一些服務是透過 Active-Standby 的方式來實作 HA 機制,但有些服務則是透過把自己複製多份 (replication) 來實作 HA 機制,其中最常用的,即為 Hive 與 Impala。
由於 Hive 可以利用 ZooKeeper 實作服務發現的連線機制,這也有部份 HA 的作用,故此,我們要介紹在 CDP 中為 Impala 設定 HA 與 LB 的機制,以及常見的坑。
客戶端有 6 台 worker node,6 台上都有 Impala daemon 以分散查詢運算資源,使用者若要使用 Impala daemon 查詢,得隨機選一台 Impala daemon 的主機來登入,這會造成使用者認知與維運上的複雜度,因此需要一個前置的 VIP (Virtual IP) 替代這 6 台的 IP,讓使用者單從這個 VIP 登入,減輕認知及維運負擔。
由於 Impala daemon 通常設於 worker node,而 worker node 大多不會開放使用者登入。在 CDP 中,使用者進入點通常稱為 gateway 或 edge。
使用者從 gateway 主機登入後,若單單執行 impala-shell -k
(假設使用者已經取得憑證),往往會無法連到任何一個 Impala daemon,因為 Impala 並未像 Hive 那樣,透過 ZooKeeper 實作服務發現機制,就可以有單一的進入點:
於是使用者必須在 6 台 worker node 的 IP 當中選擇其一,久而久之就會發現這 6 台 worker node 其中某幾台 loading 特別重,特別是第一台。
為要簡化使用者的登入流程,我們在叢集中挑選了兩台主機,建置 keepalived 與 haproxy。
建置 keepalived 的目的是為了讓兩台主機相互備援,綁定一個虛擬 IP (VIP),於是我們得先安裝 keepalived,順便把 haproxy 也裝起來:
dnf install -y keepalived haproxy
接著我們設定 keepalived,假設我們使用 192.168.30.60
這個 IP 為 VIP,那麼 keepalived 的設定 ( /etc/keepalived/keepalived.conf
) 大概會是這樣:
global_defs {
router_id LVS_DEVEL
enable_script_security
script_user keepalived_script
}
vrrp_script chk_health {
script "systemctl is-active --quiet cloudera-scm-agent"
interval 2
weight 2
fall 3
rise 2
}
vrrp_instance VI_SIT {
state MASTER
# state BACKUP
interface ens18
virtual_router_id 60
mcast_src_ip 192.168.30.51
priority 100
# priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass athemaster
}
virtual_ipaddress {
192.168.30.60/24
}
track_script {
chk_health
}
}
通常 keepalived 會有一主一備,因此另一台主機,就只需要把 state BACKUP
跟 priority 90
這組設定註解打開、做相反的操作即可。
此外,mcast_src_ip
這欄需要改為主機自己的 IP,interface
也要改為自己網卡的名稱。
接著,我們要在兩台主機裡,各建立一個執行腳本用的帳號:
useradd -r -s /sbin/nologin keepalived_script
這樣就可以先啟動 keepalived,看 MASTER 的那台主機是否有拿到多一個 IP。
再來是設定 HAProxy,我們編輯 /etc/haproxy/haproxy.cfg
設定:
global
log /dev/log local0 debug
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option dontlognull
option redispatch
retries 3
timeout queue 1m
timeout client 1m
timeout server 1m
timeout connect 10s
timeout check 10s
maxconn 3000
listen impalashell
bind 192.168.30.60:21000
mode tcp
option tcplog
balance leastconn
server cdp-w1 cdp-w1:21000 check
server cdp-w2 cdp-w2:21000 check
server cdp-w3 cdp-w3:21000 check
server cdp-w4 cdp-w4:21000 check
server cdp-w5 cdp-w5:21000 check
server cdp-w6 cdp-w6:21000 check
HAProxy 的設定方面,可以用 frontend 搭配 backend,或者用 listen 區塊整個統包設定。
啟動前不需像 keepalived 那樣新增帳號,直接使用 systemctl 啟動即可。
接著我們得去 CM 上,設定 Impala 的 Load Balancer 位置:
輸入這個 VIP 或者 VIP 的 FQDN 之後,它會告訴你有設定要撒下去,因此要重啟服務。
讓它重啟服務後,就可以在 CDP 叢集中,使用這個 VIP 了,如:
impala-shell -k -i 192.168.30.60:21000
即可進入 Impala Daemon 做查詢。
如果在 CM 上開啟 TLS 功能,它會為 Impala Daemon 掛上 TLS/SSL 憑證,這個憑證的內容,若沒包含 VIP 或它的 FQDN,則會使得進入時,因憑證驗證而失敗。
建議如果要開 TLS,需先把憑證準備、簽發好,再搭配 HAProxy 的 SSL 設定來進行。
由於這是內部叢集,我們為減少設定複雜度,多半是關掉 CM 的 AutoTLS 功能來執行的。