容器中的 Tableau Server - 疑难解答

简介

“容器中的 Tableau Server”是 Tableau 的第一款基于容器的服务器产品。“容器中的 Tableau Server”是在 Linux Docker 容器内运行的一体化 Tableau Server 实例。换句话说,“容器中的 Tableau Server”是运行整个自包含 Tableau Server 应用程序的 Docker 映像。“容器中的 Tableau Server”是我们为在基于容器的环境中运行的 Tableau Server 提供支持的许多步骤中的第一个步骤。了解“容器中的 Tableau Server”概念的最简单方法是将其看作一个预装了 Tableau Server 的 VM。映像以 UBI 8 映像(适用于版本 2022.1 及更低版本的 CentOS 7.x)为基础,并在容器内运行 supervisord(而不是 systemd)。容器启动 supervisord 后,将立即尝试初始化和启动 Tableau Server。此处的大部分文档旨在描述如何提供配置和利用自动化,以便您可以在 Docker 环境中运行 Tableau Server。

“容器中的 Tableau Server”映像设置工具可帮助您创建和自定义容器映像以包括自定义包和项目。该工具的主要功能之一是构建容器映像并安装自定义数据连接器。

若要在概念验证方案中快速测试“容器中的 Tableau Server”映像,请参见容器中的 Tableau Server - 快速入门

限制

  • “容器中的 Tableau Server”仅支持使用 Server ATR 的许可证激活,这要求容器具有 Internet 访问权限。因此,无法在隔离网络的环境中进行脱机激活。
  • “容器中的 Tableau Server”当前不支持 Resource Monitoring Tool (RMT) 代理。
  • “容器中的 Tableau Server”不支持 Kerberos

疑难解答

如果您在运行 Tableau Server 时遇到问题,可以通过多种途径找到解决方案。此部分涵盖一般 Tableau Server 疑难解答建议,例如在哪里可以找到日志及其含义。它还涵盖了一些特定的已知场景和缓解途径。

如果您正在与 Tableau 支持部门合作调试问题,则提供以下信息可能会有所帮助:

  • Tableau Server 日志(收集这些日志的说明如下)。
  • Docker 容器 stdout 日志。
  • Tableau Server 的 Dockerfile(如果进行了任何自定义)。
  • 包含以下内容的部署:

    • Kubeconfig (或任何等效的部署配置)。
    • 用于配置 Tableau Server 容器的静态配置文件。

安装和初始化失败

如果您是第一次初始化 Tableau Server,或者您在容器内进行了全新安装,则服务器不会通过简单地重新启动容器来恢复。每次安装尝试都应使用干净的数据目录。这可能意味着从以前的容器运行中删除持久卷数据。如果您这样做,请确保保存可能对调试有用的日志和信息。

调试失败的安装

Tableau Server 容器设计为在遇到安装失败时退出。这种模式可以很容易地自动化和识别何时发生安装故障。但是,它会使调试变得具有挑战性,因为容器将退出并且不会留下任何可检查的运行时状态。如果您希望在初始化期间失败的正在运行的容器中进行调试会话,请执行以下步骤:

  1. 准备全新的“容器中的 Tableau Server”部署。
  2. 配置容器以使用 TSM_ONLY=1 环境变量运行。TSM_ONLY=1 环境变量指示 Tableau Server 仅初始化 TSM。这相当于只在标准非容器安装中运行 initialize-tsm 脚本。
  3. 运行 Tableau Server 容器。
  4. 在容器内打开 shell。
  5. 您现在可以运行 TSM 命令,即使 Tableau Server 尚未初始化。若要恢复在初始化期间正常发生的自动化,请执行 tsm-commands 脚本: "${DOCKER_CONFIG}"/config/tsm-commands

Tableau 支持和 Kubernetes

“容器中的 Tableau Server”可以使用 Kubernetes 运行,但并不要求这样做。我们的预期是,大多数客户将使用 Kubernetes 或其关联的托管云环境之一(EKS、AKS 或 GKS)来运行和管理“容器中的 Tableau Server”。

Kubernetes 可能是一个复杂的运行和调试环境,通常包括对个别公司基础设施和设置的依赖。因此,Tableau 支持无法帮助客户解决与在运行“容器中的 Tableau Server”相关的 Kubernetes(或基础架构部署)问题。但是,Tableau 确实支持在 Docker 容器中运行 Tableau Server。因此,如果您在使用 Kubernetes 运行“容器中的 Tableau Server”时遇到问题,Tableau 支持只能验证 Docker 容器本身是否正常工作。

有关如何使用 Kubernetes 运行“容器中的 Tableau Server”的详细信息,请参见此 Github 站点:https://github.com/tableau/tableau-server-in-kubernetes(链接在新窗口中打开)

日志

日志是在 Tableau Server 中查找、理解和解决问题的重要资源。它们有助于帮助我们的支持团队找到您遇到的问题的根本原因。日志也可用于您自己的调试和故障排除。

提取所有日志

如果您需要提取所有日志以进行进一步调试或发送给我们的支持团队,有几种方法可以检索此信息。

Ziplog

TSM 可以创建包含所有相关服务器日志的压缩存档。您可以通过运行 tsm maintenance ziplogs 命令来触发此操作。当命令完成时,它将报告日志存档的文件路径。您需要使用最适合您情况的任何文件传输方法来复制存档。有关 ziplog 的详细信息,请参见tsm maintenance ziplogs

在容器内执行的命令示例:

tsm maintenance ziplogs
手动 Tar 命令

如果您无法运行 ziplogs 命令,举例来说,如果服务器无法达到一致状态,您仍然可以通过在容器内执行 tar 命令来检索日志。您需要使用最适合您情况的任何文件传输方法来复制出存档。

在容器内执行的示例命令(将 tar 写入容器数据目录中的临时目录):

tar -zcvf /var/opt/tableau/tableau_server/temp/<archive_name>.tar.gz \
/var/opt/tableau/tableau_server/data/tabsvc/logs/. \
/var/opt/tableau/tableau_server/supervisord/ \
/var/opt/tableau/tableau_server/data/tabsvc/config/ \
/docker/.metadata.conf \
--exclude='*keystores' --exclude='*.jks' --exclude='*.tks' \
--exclude='*asset_keys.yml' --exclude='*.ks' --exclude='*.ts' \
--exclude='*.crt' --exclude='*cacerts' --exclude='*.key'
导航日志和调试提示

可通过一些常见步骤来诊断 Tableau Server 中的大多数问题。如果您正在考虑查看服务器日志,根据错误发生在服务器生命周期中的哪个位置,分解要查找的信息会很有帮助。

启动容器(初始/安装)

如果容器立即崩溃或无法安装或初始化,请检查以下资源:

容器 stdout

检查 docker 容器的 stdout 。这通常可以通过查看容器编排系统(例如 Kubernetes)收集的容器输出来访问。由于 Tableau Server 是在容器内运行的多进程系统,因此 stdout 通常没有用,并且不会报告问题的根本原因,除非启动时出现灾难性故障。在深入研究 Tableau Server 日志之前,建议您检查故障容器的 stdout

示例:

docker logs <container-name>

Tableau Server 容器启动日志

Tableau Server 容器启动日志捕获初始化、配置和启动 Tableau Server 的自动化操作的输出。如果您发现容器在第一次启动或运行时遇到问题,以下是要检查的第一个日志:

/var/opt/tableau/tableau_server/supervisord/run-tableau-server.log

检查日志底部,看看是否有报告的故障。有时会报告错误并且在日志中显而易见。如果日志中的错误不清晰,则根本原因可能仅在特定于阶段或特定于服务的日志文件中可见。下面列出的日志涵盖了这些可能性。

Tableau Server 安装日志

如果启动日志表明自动化处理初始化 TSM 阶段存在问题,请检查此日志:

/var/opt/tableau/tableau_server/logs/app-install.log

Tableau Server 控制器日志

如果启动日志表明初始化和启动 Server 阶段存在问题(仅限 CLI),请检查 tabadmincontroller 服务日志:

/var/opt/tableau/tableau_server/data/tabsvc/logs/tabadmincontroller/tabadmincontroller_node1-0.log

此日志文件用于名为 tabadmincontroller 的特定服务。Tabadmincontroller 负责编排 Server 中的初始化和启动功能。此日志可能复杂而冗长。此日志文件中的错误可能仍未指向根本原因。有时错误是由 tabadmincontroller 完成某项任务所依赖的服务引起的。有关更多详细信息,请查看下面的“Server 运行时”部分。

服务日志 - Server 运行时

如果 Tableau Server 在正常运行时遇到问题,或遇到服务无法完成任务或关闭的问题,您可以查看服务日志来了解详细信息。作为 Tableau Server 的一部分运行的每个服务都有一个服务日志文件。如果您知道要检查哪个服务,则可以在此常规目录下找到该服务的日志:

/var/opt/tableau/tableau_server/data/tabsvc/logs/<service_name>

在文件路径的 <service_name> 参数中提供服务的名称。任何服务都可以写入多种日志文件。此外,如果您有多个相同的服务在运行(多个实例),所有服务日志将写入同一服务目录。

一般服务特定的日志文件分类

此表涵盖了 Tableau Server 服务最常见的服务日志文件名、类型和描述。“故障类型”列指示哪些日志文件可能在给定的故障情况下有用。

名称文件名格式描述故障类型示例
Control-Appcontrol_<service_name>_<node_id>-<instance_id>.log包含负责安装和配置服务的 control-app 进程的信息。这通常是与服务相关的第一个日志。对于服务安装和配置故障,请先查看此处。安装、配置、状态control_backgrounder_node1-0.log
服务日志<service_name>_<node_id>-<instance_id>.log正在运行的服务的主日志。大多数情况下,此日志包含来自 spring/java 应用程序层的输出。启动、运行时、状态backgrounder_node1-1.log
Stdout 日志stdout_<service_name>_<instance_id>.log包含服务的 stdout 输出。大多数服务不会将太多内容输出到 stdout ,而是写入主日志。有时,当服务退出时,此日志可能包含有用的信息。启动、停止stdout_backgrounder_0.log
NativeAPI 日志nativeapi_<service_name>_<instance_id>.txt某些服务运行本机代码层。此日志捕获应用程序运行时的该部分。许可、启动、运行时、状态nativeapi_backgrounder_1-1_2021_05_10_00_00_00.txt
Tomcat 日志tomcat_<service_name>_<node_id>-<instance_id>.log这仅适用于在 tomcat 容器内运行并包含 tomcat 日志的服务。它很少提供有关服务故障的信息。它在调试一些网络问题可能很有用。网络、启动tomcat_backgrounder_node1-0.2021-05-10.log
停止的容器

如果容器已停止或难以在其中执行命令,并且服务器的数据目录已外部化到挂载的卷,您仍然可以查看日志。否则,只有容器的 stdout 将在容器的编排系统中可检查,这通常不会包含根本原因。

设置身份验证属性失败

在没有先设置身份存储的情况下,在 Tableau Server 中设置身份验证属性似乎存在问题。若要解决此问题,只需在初始化前挂钩中设置身份存储。

  1. 在 Tableau Server 映像构建工具 customer-files 目录中创建一个名为 ./customer-files/pre_init_command 的文件,并编辑它以包含:

    #!/bin/bash
    tsm configuration set -k wgserver.authenticate -v local --force-keys
  2. 将脚本设置为可执行。

    chmod +x ./customer-files/pre_init_command
  3. 构建并运行映像。

全新启动期间失败(例如,为何 Tableau Server 未启动?)

  • 如果您在 Tableau Server 初始化或启动时遇到问题,则有许多疑难解答选项可能有助于发现该问题。
  • 如果容器完全无法启动,则需要使用 docker logs <container-name> 命令检查 PID 1 进程中的 stdout。
  • 如果容器正在运行,但 Tableau Server 似乎未正确初始化或运行,则检查错误的第二个位置是此文件:
${DATA_DIR}/supervisord/run-tableau-server.log

示例:

docker exec -it <container-name> bash -c 'cat $DATA_DIR/supervisord/run-tableau-server.log'

此日志文件包含由 tableau 容器初始化服务编排的所有事件,该服务正在处理 Tableau Server 的启动,以及执行您可能在容器中提供的任何设置脚本或自定义配置。大多数启动错误都将在此处报告问题。有时,如果错误与 TSM 或 Tableau Server 进程相关,它将建议查看另一个日志文件来了解更多详细信息。

使用现有数据重新启动或启动容器期间失败

服务器不会启动 Postgres(或其他进程)

如果数据保留在容器外部,并且您使用该旧数据启动另一个 Tableau Server 容器映像实例,请务必注意,新容器的内部主机名必须与初始化持久数据的容器的主机名匹配。Tableau Server 不能很好地处理动态主机名更改,并且使用不同的内部主机名启动新容器实际上是导致这种情况的原因。

补救措施是简单地确保容器的主机名设置为与以前使用该数据运行的容器相同的值。这不会与多节点混淆,工作服务器可以(而且可能应该)彼此具有不同的主机名。重要的是当给定容器重新启动或终止时,后续容器必须具有与其前置容器相同的主机名。

部署配置举例

Docker

“容器中的 Tableau Server”基本用法
docker run \
-e LICENSE_KEY=<key>
-p 8080:8080
--hostname=<static (internal) name of host machine> \
-d <Tableau Server in a Container image ID or tag>
具有自动化初始管理员用户的“容器中的 Tableau Server”基本用法
docker run \
-e LICENSE_KEY=<key> \
-e TABLEAU_USERNAME=<myadmin> \
-e TABLEAU_PASSWORD_FILE=/etc/tableau-admin-secret \
-v <full-path-to-pw-file>:/etc/tableau-admin-secret \
--hostname=<static (internal) name of host machine> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
仅 TSM 模式
docker run \
-e TSM_ONLY=1 \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
多节点基本用法
初始节点

选项 1:如果服务器配置 (CONFIG_FILE ) 指定多节点拓扑,则使用此选项:

docker run \
-v <network-shared-directory>:/docker/config/bootstrap \
-v <full-path-to-config-file>:/docker/config/config.json:ro \
-e LICENSE_KEY=<key> \
-p 8080:8080 -p 8800-9000:8800-9000 -p 27000-27010:27000-27010 \
--hostname=<name-of-host-machine> \
-d <Tableau Server in a Container image ID or tag>

选项 2:如果您想要多节点部署,即使服务器配置未指定多节点拓扑,也可以使用此选项:

docker run \
-v <network-shared-directory>:/docker/config/bootstrap \
-e LICENSE_KEY=<key> -e ALWAYS_WRITE_BOOTSTRAP_FILE=1 \
-p 8080:8080 -p 8800-9000:8800-9000 -p 27000-27010:27000-27010 \
--hostname=<name-of-host-machine> \
-d <Tableau Server in a Container image ID or tag>
附加节点
docker run \
-v <network-shared-directory>:/docker/config/bootstrap \
-e BOOTSTRAP_INSTALL=1 \
-p 8080:8080 -p 8800-9000:8800-9000 \
--hostname=<static (internal) name of host machine> \
-d <Tableau Server in a Container image ID or tag>
外部化数据用法
docker run \
-v <empty-data-dir>:/var/opt/tableau \
-e LICENSE_KEY=<key> \
---hostname=<static (internal) name of host machine> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
初始化容器基本用法

初始化容器

docker run \
-v <empty-data-dir>:/var/opt/tableau \
-e LICENSE_KEY=<key> \
-e INIT_CONTAINER=1 \
--hostname=<static (internal) name of host machine> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>

运行容器

docker run \
-v <empty-data-dir>:/var/opt/tableau \
--hostname=<static (internal) name of host machine> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
基本备份还原:单节点
docker run \
-v <full-path-to-backup-file>:/docker/config/backup/backup-file.tsbak \
-v <full-path-to-config-only-file>:/docker/config/config.json:ro \
-e LICENSE_KEY=<key> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>

Docker-Compose

version: '3.2'
services:
    tableau-server:
         hostname: localhost
         volumes:
              - <your-tsm-command-file>:/docker/config/tsm-commands:ro
              - <your-config-file >:/docker/config/config.json:ro
         ports:
              - "8080:8080"
         image: ${IMAGE_NAME}
         environment:
              - LICENSE_KEY=<license-key>