Presto是一個Facebook開源的分布式SQL查詢引擎,適用于交互式分析查詢,數(shù)據(jù)量支持GB到PB字節(jié)??蛻粼谑褂肞resto的時候發(fā)現(xiàn)單個集群不能滿足業(yè)務(wù)需求,而建立多個Presto集群之后,如何在集群間調(diào)度任務(wù)就成為一個問題。在Presto中,一個Query執(zhí)行周期內(nèi)需要客戶端和服務(wù)端進行多次的HTTP請求,在多集群模式下,如何保證同一個Query的請求都分發(fā)到同一個集群呢?
通過測試,使用AWSALB作為分發(fā)會導(dǎo)致前后HTTP請求被轉(zhuǎn)發(fā)到不同的集群,從而無法得到查詢結(jié)果。使用AWS NLB可以正常的執(zhí)行查詢,但是單個客戶端的請求在短時間會集中轉(zhuǎn)發(fā)給一個集群,無法分散。
幸好,Lyft為解決這個問題而開發(fā)了presto-gateway這個工具,并將它開源出來。(https://github.com/lyft/presto-gateway)
Presto-gateway是在多個Presto集群前的一個有狀態(tài)Load-balancer,Proxy和Router,它提供了透明的訪問方法。如下圖:(內(nèi)容來自于https://eng.lyft.com/presto-infrastructure-at-lyft-b10adb9db01)

Presto-gateway通過追蹤查詢ID來保證后續(xù)請求轉(zhuǎn)到原來的集群上。
Presto-gateway使用MySQL來記錄后端Presto集群和查詢歷史,所以我們需要先準備一臺MySQL服務(wù)器,自建或者托管的RDS均可。
創(chuàng)建一個數(shù)據(jù)庫prestogateway:
CREATE DATABASE prestogateway
根據(jù)https://github.com/lyft/presto-gateway/blob/master/gateway-ha/src/main/resources/gateway-ha-persistence.sql文件內(nèi)容創(chuàng)建表。
準備一臺服務(wù)器,編譯環(huán)境需要JDK1.8和Maven,在Amazon Linux 2上,JDK已經(jīng)默認安裝了,Maven可以通過 ?sudo yum install maven來完成安裝。
先用gitclone代碼:
??????? git clone https://github.com/lyft/presto-gateway.git
用Maven編譯:
??????? cd presto-gateway
mvn clean install
先更改gateway-ha目錄下配置文件 gateway-ha-config.yml,行10到14部分,修改MySQL地址和用戶名密碼:
dataStore:
? jdbcUrl:jdbc:mysql://:3306/prestogateway
? user:
? password:
? driver:com.mysql.cj.jdbc.Driver
然后就可以啟動pesto-gateway服務(wù)了:
cd gateway-ha/target/
java -jar gateway-ha-1.8.8-SNAPSHOT-jar-with-dependencies.jarserver ../gateway-ha-config.yml
如果需要長期運行,可以通過 nohup &方式來執(zhí)行。
可以通過兩種方式來將Presto集群添加進來,如果名字相同,則可以更新現(xiàn)有信息。
1.通過CURL命令:
curl -X POST
http://localhost:8080/entity?entityType=GATEWAY_BACKEND \
?-d '{?"name": "presto1",
??????? "proxyTo":"http://172.31.201.65:8889",
??????? "active": true,
??????? "routingGroup":"adhoc"
??? }'
2.通過Web UI:
http://<server-ip>:8090/entity

同樣可以通過CURL命令和Web UI兩種方法來查詢:
? ? ? ? curl -X GET http://localhost:8080/entity/GATEWAY_BACKEND
[
??? {
???????"active": true,
???????"externalUrl": "http://172.31.201.65:8889",
???????"name": "presto1",
???????"proxyTo": "http://172.31.201.65:8889",
???????"routingGroup": "adhoc"
??? },
??? {
???????"active": true,
???????"externalUrl": "http://172.31.201.117:8889",
???????"name": "presto2",
???????"proxyTo": "http://172.31.201.117:8889",
???????"routingGroup": "adhoc"
??? },
]
或者訪問: http://:8090/viewgateway

在刪除presto集群前,可以先將它deactivate,這樣新的查詢就不會轉(zhuǎn)到該集群,能夠更優(yōu)雅的將集群移除。
curl -X POST http://localhost:8080/gateway/backend/deactivate/presto2
通過WebUI更新該集群的active屬性為false也能完成同樣目的。
再通過以下命令完成刪除:
curl -X POST -d "presto2"
http://localhost:8080/gateway/backend/modify/delete
刪除操作無法在WebUI上完成。
在添加Presto集群之后,客戶端就可以通過:8080來提交查詢請求,就像連接原來的Presto一樣。提交查詢之后,就可以在Web UI上看到歷史:http://:8080/
從底部的統(tǒng)計可以看到查詢平均分發(fā)到兩個集群上。

10.? ? ? ? 健康檢查
Presto-gateway每分鐘會檢查后端Presto集群是否健康,如果發(fā)現(xiàn)不正常,它會自動發(fā)送郵件通知,相關(guān)設(shè)置在配置文件 gateway-ha-config.yml中,如下:
notifier:
? smtpHost: localhost
? smtpPort: 587
? sender:presto-gw-monitor-noreply@lyft.com
? recipients:
??? - prestodev@yourorg.com
11.? ? ? ? 路由規(guī)則引擎
Presto-gateway提供了用戶可以自定義路由規(guī)則的功能來重定向請求到不同集群,這個規(guī)則可以通過修改配置文件來設(shè)置。
routingRules:
? rulesEngineEnabled: true
? rulesConfigPath:"src/test/resources/rules/routing_rules.yml" # replace with path toyour rules config file
參考鏈接:
https://github.com/lyft/presto-gateway
https://medium.com/pinterest-engineering/presto-at-pinterest-a8bda7515e52
https://eng.lyft.com/presto-infrastructure-at-lyft-b10adb9db01