《Trino权威指南2》第五章:生产就绪部署

前文引用:
《Trino权威指南2》第一章:Trino介绍
《Trino权威指南2》第二章:安装和配置Trino
《Trino权威指南2》第三章:使用Trino
《Trino权威指南2》第四章:Trino的架构

在第 2 章中从 tar.gz 存档中安装 Trino,并在第 4 章中对 Trino 架构有了新的了解后,现在您准备好更深入地了解安装 Trino 集群的详细信息。然后,您可以运用这些知识,努力实现一个带有协调器和多个工作节点的 Trino 集群的生产就绪部署。

配置细节

Trino 的配置由多个文件管理,这些文件在以下各节中进行了讨论。这些文件默认都位于安装目录中的 etc 目录中。 此文件夹的默认位置以及每个单独的配置文件的位置可以通过传递给启动脚本的参数进行覆盖,有关详细信息请参阅“启动器”部分。

服务器配置

文件 etc/config.properties 提供了 Trino 服务器的配置。Trino 服务器可以充当协调器、工作节点或同时兼具两者功能。一个集群必须设置为只有一个协调器。将一个单独的服务器专门用于协调器工作,并添加若干其他服务器作为专用工作节点,可以提供最佳性能并创建一个 Trino 集群。 该文件的内容至关重要,特别是因为它们确定服务器作为工作节点或协调器的角色,从而影响资源使用和配置。

以下是允许的基本 Trino 服务器配置属性。在后面的章节中,当我们讨论身份验证、授权和资源组等功能时,我们将涵盖其他可选属性。

  • coordinator=true|false:允许此 Trino 实例充当协调器,因此接受来自客户端的查询并管理查询执行。默认值为 true。将值设置为 false 将服务器专用为工作节点。
  • node-scheduler.include-coordinator=true|false:允许在协调器上调度工作。默认值为 true。对于较大的集群,建议将此属性设置为 false。在协调器上处理工作可能会影响查询性能,因为服务器资源无法用于调度、管理和监视查询执行的关键任务。
  • http-server.http.port=8080http-server.https.port=8443:指定服务器用于 HTTP/HTTPS 连接的端口。Trino 对所有内部和外部通信都使用 HTTP。
  • discovery.uri=http://localhost:8080:发现服务器的 URI,相当于协调器,包括正确的端口。此 URI 可以是协调器和集群节点的网络中的本地 URI,并且不能以斜杠结尾。

日志记录

可选的 Trino 日志配置文件 etc/log.properties 允许设置命名记录器层次结构的最小日志级别。每个记录器都有一个名称,通常是使用记录器的 Java 类的完全限定名称。记录器使用 Java 类层次结构。Trino 所有组件的包可以在源代码中找到,该源代码在“源代码、许可和版本”部分讨论过。

例如,考虑以下日志级别文件:

io.trino=INFO
io.trino.plugin.postgresql=DEBUG

第一行将 io.trino 内所有类的最小级别设置为 INFO,包括嵌套包,如 io.trino.spi.connector 和 io.trino.plugin.hive。默认级别是 INFO,因此前面的示例实际上不会更改第一行中任何包的日志记录。将默认级别包含在文件中只是使配置更明确。然而,第二行覆盖了 PostgreSQL 连接器的日志配置,将其设置为 DEBUG 级别。

有四个级别,DEBUG、INFO、WARN 和 ERROR,按照降低的冗长性排序。在本书中,我们在讨论诸如在 Trino 中进行故障排除等主题时可能会提到设置日志记录。

在启动 Trino 后,您会在安装目录中的 var/log 目录中找到各种日志文件,除非您在 etc/node.properties 文件中指定了其他位置:

  • launcher.log:由启动器创建(参见“启动器”),与服务器的标准输出(stdout)和标准错误(stderr)流相连接。它包含一些来自服务器初始化的日志消息,以及 JVM 生成的任何错误或诊断信息。
  • server.log:这是 Trino 使用的主要日志文件。如果服务器在初始化期间失败,它通常包含相关信息,以及有关应用程序实际运行、与数据源的连接等大多数信息。
  • http-request.log:这是 HTTP 请求日志,其中包含服务器接收到的每个 HTTP 请求。这些请求包括 Web UI、Trino CLI 的所有使用,以及第 3 章中讨论的 JDBC 或 ODBC 连接,因为它们都使用 HTTP 连接。它还包括身份验证和授权日志。

所有日志文件都会自动进行轮转,并且还可以在大小和压缩方面进行更详细的配置。

节点配置

节点属性文件 etc/node.properties 包含特定于服务器上单个已安装的 Trino 实例(Trino 集群中的一个节点)的配置。 以下是一个小型示例文件:

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/trino/data

以下是允许的 Trino 配置属性:

  • node.environment=demo:环境的必需名称。在集群中的所有 Trino 节点必须具有相同的环境名称。该名称显示在 Trino Web UI 标题中。
  • node.id=some-random-unique-string:此 Trino 安装的可选唯一标识符。每个节点都必须具有唯一的标识符。此标识符应在 Trino 重新启动或升级时保持一致,因此应该被指定。如果省略,每次重新启动时都会创建一个随机标识符。
  • node.data-dir=/var/trino/data:Trino 存储日志文件和其他数据的可选文件系统路径。默认为安装目录内的 var 文件夹。

JVM 配置

JVM 配置文件 etc/jvm.config 包含一系列用于启动运行 Trino 的 JVM 的命令行选项。 文件的格式是一行一个选项。这些选项不会被 Shell 解释,因此不应该对包含空格或其他特殊字符的选项使用引号。 以下提供了创建 etc/jvm.config 的一个良好起点:

-server
-Xmx4G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics

由于 OutOfMemoryError 通常使 JVM 处于不一致的状态,我们为调试目的写入堆转储,并在发生此错误时强制终止进程。 -Xmx 选项是此文件中的一个重要属性。它设置 JVM 的最大堆空间。这决定了 Trino 进程可用的内存量。 允许 JDK/JVM 附加到自身的配置对于 Trino 的使用是必需的。 有关内存和其他 JVM 设置的更多信息,请参见第 12 章。

启动器

正如在第 2 章中提到的,Trino 包含在 bin 目录中启动和管理 Trino 的脚本。这些脚本需要 Python。

run 命令可用于启动 Trino 作为前台进程。

在生产环境中,通常将 Trino 作为后台守护进程启动:

$ bin/launcher start
Started as 48322

在此示例中看到的数字 48322 是分配的进程 ID(PID)。每次启动时都会有所不同。

您可以停止正在运行的 Trino 服务器,使其正常关闭:

$ bin/launcher stop
Stopped 48322

当 Trino 服务器进程被锁定或遇到其他问题时,可以使用 kill 命令强制停止它:

$ bin/launcher kill
Killed 48322

您可以使用 status 命令获取 Trino 的状态和 PID:

$ bin/launcher status
Running as 48322

如果 Trino 未运行,status 命令将返回该信息:

$ bin/launcher status
Not running

除了前面提到的命令外,启动器脚本还支持许多选项,可用于自定义配置文件位置和其他参数。 --help 选项可用于显示完整的详细信息:

$ bin/launcher --help
Usage: launcher [options] command

Commands: run, start, stop, restart, kill, status

Options:
  -h, --help               show this help message and exit
  -v, --verbose            Run verbosely
  --etc-dir=DIR            Defaults to INSTALL_PATH/etc
  --launcher-config=FILE   Defaults to INSTALL_PATH/bin/launcher.properties
  --node-config=FILE       Defaults to ETC_DIR/node.properties
  --jvm-config=FILE        Defaults to ETC_DIR/jvm.config
  --config=FILE            Defaults to ETC_DIR/config.properties
  --log-levels-file=FILE   Defaults to ETC_DIR/log.properties
  --data-dir=DIR           Defaults to INSTALL_PATH
  --pid-file=FILE          Defaults to DATA_DIR/var/run/launcher.pid
  --launcher-log-file=FILE Defaults to DATA_DIR/var/log/launcher.log (only in
                           daemon mode)
  --server-log-file=FILE   Defaults to DATA_DIR/var/log/server.log (only in
                           daemon mode)
  -J OPT                   Set a JVM option
  -D NAME=VALUE            Set a Java system property

其他安装方法使用这些选项来修改路径。例如,RPM 包,在“RPM 安装”中讨论,调整路径以更好地符合 Linux 文件系统层次结构标准和约定。您可以根据需要使用它们,例如符合特定企业标准,使用特定的存储挂载点,或简单地使用 Trino 安装目录之外的路径以便于升级。

集群安装

在第 2 章中,我们讨论了在单台机器上安装 Trino,而在第 4 章中,您了解了 Trino 是如何设计和在分布式环境中使用的。

除了演示目的外,实际使用时,您需要在一组机器上安装 Trino。幸运的是,安装和配置与在单台机器上的操作类似。每台机器都需要进行 Trino 安装,可以手动安装,也可以使用像 Ansible 这样的部署自动化系统。

迄今为止,您已经部署了一个单独的 Trino 服务器进程,充当协调器和工作节点。对于集群安装,您需要安装和配置一个协调器和多个工作节点。只需将下载的 tar.gz 存档复制到集群中的所有机器并进行解压。

与之前一样,必须添加包含相关配置文件的 etc 文件夹。一组用于协调器和工作节点的示例配置文件可在书籍支持存储库的 cluster-installation 目录中找到;请参阅“书籍存储库”。配置文件需要存在于您希望成为集群一部分的每台机器上。

协调器和工作节点的配置与简单安装相同,但有一些重要的区别:

  • config.properties 中的协调器属性在协调器上设置为 true,在工作节点上设置为 false。
  • node-scheduler 被设置为排除协调器。
  • discovery.uri 属性必须在所有工作节点和协调器本身上指向协调器的 IP 地址或主机名。

主配置文件 etc/config.properties 适用于协调器:

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
discovery.uri=http://<coordinator-ip-or-host-name>:8080

注意配置文件 etc/config.properties,适用于工作节点:

coordinator=false
http-server.http.port=8080
discovery.uri=http://<coordinator-ip-or-host-name>:8080

安装和配置了一组节点上的 Trino 后,您可以使用启动器在每个节点上启动 Trino。通常,最好首先启动 Trino 协调器,然后是 Trino 工作节点:

$ bin/launcher start

与之前一样,您可以使用 Trino CLI 连接到 Trino 服务器。在分布式设置的情况下,您需要使用 --server 选项指定 Trino 协调器的地址。如果您直接在 Trino 协调器节点上运行 Trino CLI,则无需指定此选项,因为它默认为 localhost:8080:

$ trino --server <coordinator-ip-or-host-name>:8080

现在,您可以验证 Trino 集群是否正常运行。节点系统表包含当前属于集群的所有活动节点的列表。您可以使用 SQL 查询查询它:

trino> SELECT * FROM system.runtime.nodes;

列表包括集群中的协调器和所有连接的工作节点。协调器和每个工作节点通过 REST API 在端点 /v1/info 上公开状态和版本信息;例如, http://worker-or-coordinator-host-name/v1/info。

您还可以通过使用 Trino Web UI 确认活动工作节点的数量。

RPM 安装

Trino 可以通过 RPM 软件包管理器(RPM)在各种 Linux 发行版上进行安装,如 CentOS、Red Hat Enterprise Linux 等。

RPM 软件包可在 Maven Central Repository 的 repo.maven.apache.org/maven2/io/t… 上找到。在具有所需版本的文件夹中找到 RPM 并下载它。

您可以使用 wget 下载存档;例如,对于版本 392:

$ wget https://repo.maven.apache.org/maven2/io/trino/trino-server-rpm/392/trino-server-rpm-392.rpm

在具有管理员访问权限的情况下,您可以使用存档以单节点模式安装 Trino:

$ sudo rpm -i trino-server-rpm-*.rpm --nodeps

使用 --no-deps 选项使 rpm 即使未安装或不可用的声明的依赖关系,也会安装软件包。通常,这是必要的,因为打包的 Python 和 Java 版本通常不适用。您可以首先尝试不使用该选项进行安装,但对于大多数发行版,您需要使用该标志,并单独安装所需的 Python 和 Java 版本。

rpm 安装将创建基本的 Trino 配置文件和一个服务控制脚本来控制服务器。该脚本被配置为在操作系统启动时自动启动服务。在从 RPM 安装 Trino 后,您可以使用 service 命令管理 Trino 服务器:

service trino [start|stop|restart|status]

安装目录结构

使用基于 RPM 的安装方法时,Trino 将安装在更符合 Linux 文件系统层次结构标准的目录结构中。这意味着并非所有内容都包含在迄今为止所见的单个 Trino 安装目录结构中。服务被配置为使用启动器脚本将正确的路径传递给 Trino:

  • /usr/lib/trino/:该目录包含运行该产品所需的各种库。插件位于嵌套的插件目录中。
  • /etc/trino:此目录包含一般配置文件,如 node.properties、jvm.config 和 config.properties。目录配置位于嵌套的 catalog 目录中。
  • /etc/trino/env.sh:此文件设置所使用的 Java 安装路径。
  • /var/log/trino:此目录包含日志文件。
  • /var/lib/trino/data:这是数据目录。
  • /etc/rc.d/init.d/trino:此目录包含用于控制服务器进程的服务脚本。

由于我们的目录结构与 Trino 使用的默认目录结构不同,node.properties 文件会自动配置为设置以下两个附加属性:

catalog.config-dir=/etc/trino/catalog
plugin.dir=/usr/lib/trino/plugin

配置

RPM 软件包默认安装的 Trino 充当协调器和工作节点,与 tar.gz 存档完全相同。要创建一个工作集群,您可以手动更新集群中节点上的配置文件,或使用通用配置管理和配置工具,如 Ansible。

卸载 Trino

如果使用 RPM 安装 Trino,您可以使用与删除其他 RPM 软件包相同的方式卸载它:

$ rpm -e trino

在卸载 Trino 时,除了日志目录 /var/log/trino 外,所有文件和配置都将被删除。如果您希望保留任何内容,请创建备份副本。

云中安装

Trino 的典型安装涉及至少运行一个包含协调器和多个工作节点的集群。随着时间的推移,集群中的工作节点数量以及集群的数量可以根据用户的需求而变化。

连接的数据源的数量和类型,以及它们的位置,也对选择在何处安装和运行 Trino 集群产生重大影响。通常希望 Trino 集群与数据源具有高带宽、低延迟的网络连接。

Trino 的简单要求(在第 2 章中讨论)使您能够在许多情况下运行 Trino。您可以在不同的机器上运行它,例如物理服务器或虚拟机器,以及 Docker 容器。 已知 Trino 可在私有云部署上运行,也可在许多公共云提供商上运行,包括亚马逊网络服务(AWS)、谷歌云、微软 Azure 等。 使用容器可以使您在 Kubernetes(K8s)集群上运行 Trino,例如亚马逊弹性 Kubernetes 服务(Amazon EKS)、微软 Azure Kubernetes 服务(AKS)、谷歌 Kubernetes 引擎(GKE)、红帽 OpenShift,以及任何其他 Kubernetes 部署。

这些云部署的优势在于可能形成一个高度动态的集群,其中工作节点根据需要创建和销毁。为这类用例创建了不同用户的工具,包括将 Trino 嵌入其产品中的云供应商以及提供 Trino 工具和支持的其他供应商。

Helm Chart 用于 Kubernetes 部署

Kubernetes 是一种越来越受欢迎的、对于某些用例甚至是默认的在云环境中部署任何使用容器镜像的软件的方法。Helm 是广泛采用的 Kubernetes 包管理器。Trino 项目提供了一个简单的 Helm 图表,适用于管理您的集群。 在安装必要的客户端工具(包括 helm 和 kubectl)之后,启动 Kubernetes 上的 Trino 集群需要以下高级步骤。具体的细节取决于所选择的 Kubernetes 版本和平台。

  1. 在首选的 Kubernetes 平台中从云提供商创建一个 Kubernetes 集群。请记住,Trino 的典型要求包括比通常部署在 Kubernetes 上的典型无状态应用程序更高的 CPU 和内存量。
  2. 配置 kubectl 以指向新的集群。

将 Trino Helm 图表存储库添加到您的配置中:

helm repo add trino https://trinodb.github.io/charts/
    1. 创建一个名为 myvalues.yaml 的自定义 YAML 文件,其中包含您的集群配置。这包括内存、config.properties、catalog 属性文件、工作节点数量以及 Helm 图表支持的任何其他配置的特定配置。您可以通过复制图表附带的模板并根据需要修改值来开始。

使用您的自定义配置将图表安装到集群中:

helm upgrade --install \
  --values myvalues.yaml \
  mycluster \
  trino/trino \
  --version 0.8.0
  1. 通过配置端口转发或使用 loadBalancer 或 ingress 等方法,在 Kubernetes 集群之外暴露协调器和默认端口 8080。
  2. 此时,集群已经启动运行,您可以使用 Trino CLI 或任何其他客户端工具进行连接和查询。您还可以在协调器 URL 处访问 Trino Web UI。 以下简单的 YAML 文件配置了使用 Trino 392 的集群,包含五个工作节点,以及一个额外的 abyss catalog,其中包含黑洞连接器,就像在存档安装中使用的一样:
image:
  tag: "392"
server:
  workers: 5
additionalCatalogs:
  abyss: |-
    connector.name=blackhole

对集群的任何后续更改都通过更新 YAML 配置文件并再次运行 helm upgrade 命令执行。 您可以看到,Kubernetes 和 Helm 图表提供了一种非常灵活和高效的方法来安装和管理 Trino 集群。Kubernetes 平台为您管理所有底层基础设施方面的事务,如硬件、网络等,使您能够专注于配置用于数据源连接的目录和编写 SQL 查询。

集群规模考虑

将 Trino 部署起来的一个重要部分是确定集群的规模。从长远来看,您甚至可能会为不同的用例努力构建多个集群。确定 Trino 集群的规模是一项复杂的任务,遵循与其他应用程序相同的模式和步骤:

  1. 根据初步估算和可用基础设施确定初始规模。
  2. 确保集群的工具和基础设施能够扩展集群。
  3. 启动集群并逐渐增加使用量。
  4. 监控利用率和性能。
  5. 根据发现的情况通过更改集群规模和配置来做出反应。

了解 Trino 的架构对于初始规模至关重要。具体来说,您需要知道 Trino 不是一种依赖于集群中许多小型无状态服务器节点的典型横向扩展应用程序。Trino 协调器和工作节点是整体查询处理架构的有状态部分。大量的数据从数据源传输到工作节点,工作节点之间以及到协调器。所有这些传输和相关的数据处理都在所有工作节点上并行进行,同时在每个节点的 JVM 中的多个线程中进行。

由于这些需求,典型节点的初始建议规模比无状态架构中要大得多。一个节点通常具有 16 个虚拟 CPU 和 64 GiB 内存或更多。通常,与许多较小的节点相比,拥有较少但更大的节点更好。一个静态的生产部署应该至少启动四个工作节点和一个专用的协调器。

关于监控、调整和持续使用的反馈循环使您能够深入了解 Trino 部署的行为。

许多因素影响您的集群性能,这些因素的组合对每个 Trino 部署都是特定的:

  • 每个节点的 CPU 和内存等资源
  • 集群内部以及与数据源和存储之间的网络性能
  • 连接的数据源的数量和特性
  • 针对数据源的查询及其范围、复杂性、数量和产生的数据量
  • 数据源的存储读/写性能
  • 活跃用户及其使用模式

一旦您部署了初始集群,请确保充分利用 Trino Web UI 进行监控。第 12 章提供了更多的建议。

总结

正如您现在了解的,Trino 的安装和运行集群只需一些配置文件和属性。根据您的实际基础设施和管理系统,您可以建立一个强大的 Trino 集群,甚至可以是多个。在第 13 章中,查看实际应用的例子。

当然,您仍然缺少配置 Trino 的一个主要要素。那就是与外部数据源的连接,用户随后可以使用 Trino 和 SQL 对其进行查询。在第 6 章和第 7 章中,您将全面了解各种数据源、用于访问它们的连接器以及通过连接器指向特定数据源的目录的配置。

发表回复