使用presto-gateway在多个presto集群间调度任务

1.    概述

Presto是一个Facebook开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。客户在使用Presto的时候发现单个集群不能满足业务需求,而建立多个Presto集群之后,如何在集群间调度任务就成为一个问题。在Presto中,一个Query执行周期内需要客户端和服务端进行多次的HTTP请求,在多集群模式下,如何保证同一个Query的请求都分发到同一个集群呢?

通过测试,使用AWSALB作为分发会导致前后HTTP请求被转发到不同的集群,从而无法得到查询结果。使用AWS NLB可以正常的执行查询,但是单个客户端的请求在短时间会集中转发给一个集群,无法分散。

幸好,Lyft为解决这个问题而开发了presto-gateway这个工具,并将它开源出来。(https://github.com/lyft/presto-gateway)

2.   Presto-gateway介绍

Presto-gateway是在多个Presto集群前的一个有状态Load-balancer,Proxy和Router,它提供了透明的访问方法。如下图:(内容来自于https://eng.lyft.com/presto-infrastructure-at-lyft-b10adb9db01)


Presto-gateway通过追踪查询ID来保证后续请求转到原来的集群上。


3.    准备工作

Presto-gateway使用MySQL来记录后端Presto集群和查询历史,所以我们需要先准备一台MySQL服务器,自建或者托管的RDS均可。

创建一个数据库prestogateway:

CREATE DATABASE prestogateway

根据https://github.com/lyft/presto-gateway/blob/master/gateway-ha/src/main/resources/gateway-ha-persistence.sql文件内容创建表。

4.    编译presto-gateway

准备一台服务器,编译环境需要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


5.    运行presto-gateway

先更改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 &方式来执行。

6.   增加和修改presto集群

可以通过两种方式来将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://:8090/entity



7.    查询presto集群

同样可以通过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


8.   删除presto集群

在删除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上完成。


9.    查询历史

在添加Presto集群之后,客户端就可以通过:8080来提交查询请求,就像连接原来的Presto一样。提交查询之后,就可以在Web UI上看到历史:http://:8080/

从底部的统计可以看到查询平均分发到两个集群上。


10.        健康检查

Presto-gateway每分钟会检查后端Presto集群是否健康,如果发现不正常,它会自动发送邮件通知,相关设置在配置文件 gateway-ha-config.yml中,如下:

notifier:

  smtpHost: localhost

  smtpPort: 587

  sender:[email protected]

  recipients:

    - [email protected]

11.        路由规则引擎

Presto-gateway提供了用户可以自定义路由规则的功能来重定向请求到不同集群,这个规则可以通过修改配置文件来设置。

routingRules:

  rulesEngineEnabled: true

  rulesConfigPath:"src/test/resources/rules/routing_rules.yml" # replace with path toyour rules config file


12.        附录

参考链接:

https://github.com/lyft/presto-gateway

https://medium.com/pinterest-engineering/presto-at-pinterest-a8bda7515e52

https://eng.lyft.com/presto-infrastructure-at-lyft-b10adb9db01

你可能感兴趣的:(使用presto-gateway在多个presto集群间调度任务)