Presto是一个Facebook开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。客户在使用Presto的时候发现单个集群不能满足业务需求,而建立多个Presto集群之后,如何在集群间调度任务就成为一个问题。在Presto中,一个Query执行周期内需要客户端和服务端进行多次的HTTP请求,在多集群模式下,如何保证同一个Query的请求都分发到同一个集群呢?
通过测试,使用AWSALB作为分发会导致前后HTTP请求被转发到不同的集群,从而无法得到查询结果。使用AWS NLB可以正常的执行查询,但是单个客户端的请求在短时间会集中转发给一个集群,无法分散。
幸好,Lyft为解决这个问题而开发了presto-gateway这个工具,并将它开源出来。(https://github.com/lyft/presto-gateway)
Presto-gateway是在多个Presto集群前的一个有状态Load-balancer,Proxy和Router,它提供了透明的访问方法。如下图:(内容来自于https://eng.lyft.com/presto-infrastructure-at-lyft-b10adb9db01)
Presto-gateway通过追踪查询ID来保证后续请求转到原来的集群上。
Presto-gateway使用MySQL来记录后端Presto集群和查询历史,所以我们需要先准备一台MySQL服务器,自建或者托管的RDS均可。
创建一个数据库prestogateway:
CREATE DATABASE prestogateway
准备一台服务器,编译环境需要JDK1.8和Maven,在Amazon Linux 2上,JDK已经默认安装了,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服务了:
cd gateway-ha/target/
java -jar gateway-ha-1.8.8-SNAPSHOT-jar-with-dependencies.jarserver ../gateway-ha-config.yml
如果需要长期运行,可以通过 nohup &方式来执行。
可以通过两种方式来将Presto集群添加进来,如果名字相同,则可以更新现有信息。
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,这样新的查询就不会转到该集群,能够更优雅的将集群移除。
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/
从底部的统计可以看到查询平均分发到两个集群上。
10. 健康检查
Presto-gateway每分钟会检查后端Presto集群是否健康,如果发现不正常,它会自动发送邮件通知,相关设置在配置文件 gateway-ha-config.yml中,如下:
notifier:
smtpHost: localhost
smtpPort: 587
sender:presto-gw-monitor-noreply@lyft.com
recipients:
- prestodev@yourorg.com
11. 路由规则引擎
Presto-gateway提供了用户可以自定义路由规则的功能来重定向请求到不同集群,这个规则可以通过修改配置文件来设置。
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