在第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=8080
和http-server.https.port=8443
:指定服务器用于HTTP/HTTPS连接的端口。Trino对所有内部和外部通信都使用HTTP。discovery.uri=http://localhost:8080
:发现服务器的URI,相当于协调器,包括正确的端口。此URI可以是协调器和集群节点的网络中的本地URI,并且不能以斜杠结尾。
日志记录
可选的Trino日志配置文件 etc/log.properties 允许设置命名记录器层次结构的最小日志级别。每个记录器都有一个名称,通常是使用记录器的Java类的完全限定名称。记录器使用Java类层次结构。Trino所有组件的包可以在源代码中找到,该源代码在"源代码、许可和版本"部分讨论过。
例如,考虑以下日志级别文件:
ini
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集群中的一个节点)的配置。 以下是一个小型示例文件:
ini
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
的一个良好起点:
ruby
-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作为后台守护进程启动:
python
$ bin/launcher start
Started as 48322
在此示例中看到的数字48322是分配的进程ID(PID)。每次启动时都会有所不同。
您可以停止正在运行的Trino服务器,使其正常关闭:
shell
$ bin/launcher stop
Stopped 48322
当Trino服务器进程被锁定或遇到其他问题时,可以使用 kill
命令强制停止它:
shell
$ bin/launcher kill
Killed 48322
您可以使用 status
命令获取Trino的状态和PID:
python
$ bin/launcher status
Running as 48322
如果Trino未运行,status
命令将返回该信息:
lua
$ bin/launcher status
Not running
除了前面提到的命令外,启动器脚本还支持许多选项,可用于自定义配置文件位置和其他参数。 --help
选项可用于显示完整的详细信息:
ini
$ 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适用于协调器:
ini
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
discovery.uri=http://<coordinator-ip-or-host-name>:8080
注意配置文件etc/config.properties,适用于工作节点:
ini
coordinator=false
http-server.http.port=8080
discovery.uri=http://<coordinator-ip-or-host-name>:8080
安装和配置了一组节点上的Trino后,您可以使用启动器在每个节点上启动Trino。通常,最好首先启动Trino协调器,然后是Trino工作节点:
shell
$ bin/launcher start
与之前一样,您可以使用Trino CLI连接到Trino服务器。在分布式设置的情况下,您需要使用 --server 选项指定Trino协调器的地址。如果您直接在Trino协调器节点上运行Trino CLI,则无需指定此选项,因为它默认为 localhost:8080:
css
$ trino --server <coordinator-ip-or-host-name>:8080
现在,您可以验证Trino集群是否正常运行。节点系统表包含当前属于集群的所有活动节点的列表。您可以使用SQL查询查询它:
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:
shell
$ wget https://repo.maven.apache.org/maven2/io/trino/trino-server-rpm/392/trino-server-rpm-392.rpm
在具有管理员访问权限的情况下,您可以使用存档以单节点模式安装Trino:
css
$ sudo rpm -i trino-server-rpm-*.rpm --nodeps
使用 --no-deps 选项使rpm即使未安装或不可用的声明的依赖关系,也会安装软件包。通常,这是必要的,因为打包的Python和Java版本通常不适用。您可以首先尝试不使用该选项进行安装,但对于大多数发行版,您需要使用该标志,并单独安装所需的Python和Java版本。
rpm安装将创建基本的Trino配置文件和一个服务控制脚本来控制服务器。该脚本被配置为在操作系统启动时自动启动服务。在从RPM安装Trino后,您可以使用service命令管理Trino服务器:
arduino
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文件会自动配置为设置以下两个附加属性:
ini
catalog.config-dir=/etc/trino/catalog
plugin.dir=/usr/lib/trino/plugin
配置
RPM软件包默认安装的Trino充当协调器和工作节点,与tar.gz存档完全相同。要创建一个工作集群,您可以手动更新集群中节点上的配置文件,或使用通用配置管理和配置工具,如Ansible。
卸载Trino
如果使用RPM安装Trino,您可以使用与删除其他RPM软件包相同的方式卸载它:
ruby
$ 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版本和平台。
-
在首选的Kubernetes平台中从云提供商创建一个Kubernetes集群。请记住,Trino的典型要求包括比通常部署在Kubernetes上的典型无状态应用程序更高的CPU和内存量。
-
配置kubectl以指向新的集群。
-
将Trino Helm图表存储库添加到您的配置中:
csharphelm repo add trino https://trinodb.github.io/charts/
-
创建一个名为myvalues.yaml的自定义YAML文件,其中包含您的集群配置。这包括内存、config.properties、catalog属性文件、工作节点数量以及Helm图表支持的任何其他配置的特定配置。您可以通过复制图表附带的模板并根据需要修改值来开始。
-
使用您的自定义配置将图表安装到集群中:
csshelm upgrade --install \ --values myvalues.yaml \ mycluster \ trino/trino \ --version 0.8.0
-
通过配置端口转发或使用loadBalancer或ingress等方法,在Kubernetes集群之外暴露协调器和默认端口8080。
-
此时,集群已经启动运行,您可以使用Trino CLI或任何其他客户端工具进行连接和查询。您还可以在协调器URL处访问Trino Web UI。 以下简单的YAML文件配置了使用Trino 392的集群,包含五个工作节点,以及一个额外的abyss catalog,其中包含黑洞连接器,就像在存档安装中使用的一样:
yaml
image:
tag: "392"
server:
workers: 5
additionalCatalogs:
abyss: |-
connector.name=blackhole
对集群的任何后续更改都通过更新YAML配置文件并再次运行helm upgrade命令执行。 您可以看到,Kubernetes和Helm图表提供了一种非常灵活和高效的方法来安装和管理Trino集群。Kubernetes平台为您管理所有底层基础设施方面的事务,如硬件、网络等,使您能够专注于配置用于数据源连接的目录和编写SQL查询。
集群规模考虑
将Trino部署起来的一个重要部分是确定集群的规模。从长远来看,您甚至可能会为不同的用例努力构建多个集群。确定Trino集群的规模是一项复杂的任务,遵循与其他应用程序相同的模式和步骤:
- 根据初步估算和可用基础设施确定初始规模。
- 确保集群的工具和基础设施能够扩展集群。
- 启动集群并逐渐增加使用量。
- 监控利用率和性能。
- 根据发现的情况通过更改集群规模和配置来做出反应。
了解Trino的架构对于初始规模至关重要。具体来说,您需要知道Trino不是一种依赖于集群中许多小型无状态服务器节点的典型横向扩展应用程序。Trino协调器和工作节点是整体查询处理架构的有状态部分。大量的数据从数据源传输到工作节点,工作节点之间以及到协调器。所有这些传输和相关的数据处理都在所有工作节点上并行进行,同时在每个节点的JVM中的多个线程中进行。
由于这些需求,典型节点的初始建议规模比无状态架构中要大得多。一个节点通常具有16个虚拟CPU和64 GiB内存或更多。通常,与许多较小的节点相比,拥有较少但更大的节点更好。一个静态的生产部署应该至少启动四个工作节点和一个专用的协调器。
关于监控、调整和持续使用的反馈循环使您能够深入了解Trino部署的行为。
许多因素影响您的集群性能,这些因素的组合对每个Trino部署都是特定的:
- 每个节点的CPU和内存等资源
- 集群内部以及与数据源和存储之间的网络性能
- 连接的数据源的数量和特性
- 针对数据源的查询及其范围、复杂性、数量和产生的数据量
- 数据源的存储读/写性能
- 活跃用户及其使用模式
一旦您部署了初始集群,请确保充分利用Trino Web UI进行监控。第12章提供了更多的建议。
总结
正如您现在了解的,Trino的安装和运行集群只需一些配置文件和属性。根据您的实际基础设施和管理系统,您可以建立一个强大的Trino集群,甚至可以是多个。在第13章中,查看实际应用的例子。
当然,您仍然缺少配置Trino的一个主要要素。那就是与外部数据源的连接,用户随后可以使用Trino和SQL对其进行查询。在第6章和第7章中,您将全面了解各种数据源、用于访问它们的连接器以及通过连接器指向特定数据源的目录的配置。