跳至正文

【Tableau Server】金融客户Gateway网关故障处理日志(bug 未解)

XILEJUN
喜乐君 Tableau Visionary ✦ 5
📊 业务数据分析「专家」· 敏捷 BI 布道师
📚 《数据可视化分析》《业务可视化分析》多本书作者
🎓 中国地质大学(武汉)经管学院 MBA 校外导师
🤝 以 Tableau 会友,致力于构建业务分析通识框架

📚 本文配套课程 · 数据可视化分析系列

🎬 B 站课程:数据可视化分析:Tableau/SQL 原理与实践  —  https://www.bilibili.com/cheese/play/ss8093


  • 之前版本:20221.23.1012.1130(2022.1),或者2020.4.X
  • 新版本:20231.24.0424.0800 (对应2023.1.12版本)

关键总结:

1、本文建议:金融客户,操作系统可能存在定制调整。升级,或者新装后增加配置时,可能出现网关错误!

2、不要自行创建 tableau 和 tsmadmin 账户,更不要把它们用来作为操作系统层面管理,它们是 Tableau 内置特需账号,可能影响正常升级!

3、 wheel的群组权限很重要!增加到 wheel 相当于间接授予 sudo 权限。

4、不要贸然选择降级,Tableau 不对备份文件的降级恢复提供保证。

关于网关 Gateway 故障

这几天给一家银行升级服务器,原本计划从 tableau 2021.1升级到2023.1,预估两个工作日即可完成。岂料最终临门一脚,差点踢碎了我的心。在最终初始化之后,出现了 网关无法启动的情况!如下图所示:

在网关的日志文件中(tableau/data/tabsvc/logs/httpd/)中,可以发现如下的 Permission Denied 的报错。

涉及到网关的问题,通常有几个问题需要排查:端口、网络、应用权限

  • 端口是否可用,特别是默认的80和8850,通常与一个服务器部署多个业务系统有关,可以用 lsof 查看端口状态
  • 如果是外部无法访问,检查防火墙和网络设置
  • 网关对应的 httpd.pid 文件异常丢失,或者权限错误,需要重新生成或赋权。

举个形象的比喻,我去你家,第一要告诉我门牌号(端口)、第二要有可行的交通工具抵达(Wi-Fi、有线或其他网络可达),第三你还要真有接待我的诚意,不能进门把我绑了什么都不让干(权限)

1、如何检查 Tableau 的端口

相对而言,端口是最容易检查的部分,可以使用 lsof (list open files) 命令查看。

在上图中,80端口没有返回任何信息,说明没有被占用(因为我的网关没有启动);而8850端口则很明显被使用了,只要是管理进程可用,这个端口就持续被监听。

知识参考:Linux 查看端口占用情况 lsof

在这里,80端口不可用是结果,需要进一步检查其他可能的线索,特别是相关日志。

【风险提示】在上面的图片中可以看出,8850的访问似乎被重定向到了另一个地址的指定端口。这也许就是8850页面无法访问的原因。这个话题不在文中讨论。

2、如何从网关日志中找到线索

tableau 网关虽然名叫 gateway,但是各种内部文件都是 httpd,在不同系统中默认路径如下:

在这个路径中,有多个文件,其中 error 记录错误信息,startup.log记录启动信息,还有一个 gateway.log记录全量信息。 我从 starup.log 中找到了前面的关键报错:启动时没有权限。

在日志中,我们可以看到如下的报错。 httpd反复启动失败。假设另一个 httpd 程序正在运行,请 kill 掉它。(但服务器中没有这样的程序)

3、尝试解决思路(上):调整用户权限

上述权限问题导致的直观结果是,错误节点中无法生产 http.pid 文件,如下图所示,在数据目录中/data/tabsvc/httpd 下面,应该有一个 httpd.pid 的文件,记录了网关所分配的端口值。这个文件的权限远低于其他文件。

但是,在上述网关错误的节点中,该文件夹中只有 htdocs 和 temp 文件夹,无法生成 httpd.pid 文件。 理论上,setcap CAP_NET_BIND_SERVICE=+eip方法,就是解决这个文件的创建权限。我在 tablau community 中发现多年前一个人完全相同的问题,如下所示:

在 community 中,被提问者证明有效的方式是使用 set-cap 赋予非 root 账户权限(Allowing non root port bounding solved the issue.)CAP_NET_BIND_SERVICE额外参考:非root用户使用1024以下端口

sudo setcap CAP_NET_BIND_SERVICE=+eip /opt/tableau/tableau_server/packages/<apache build>/bin/httpd

可惜的是,我按照这个操作之后,依然没有丝毫好转。

【补充】在社区提问之后,有人提供了一个更加完整的方法,那就是先getcap ,确认之后在 set cap。(感谢LE SAULNIER DE SAINT JOUAN Emeric

# Fix: Allowing non root port bounding

# checked the capabilities

sudo getcap /opt/tableau/tableau_server/packages/apache.XXXXX.XX.XXXX.XXXX/bin/httpd

# should give the following output

> /opt/tableau/tableau_server/packages/apache.XXXXX.XX.XXXX.XXXX/bin/httpd = cap_net_bind_service+ep

# if not, Fix:

sudo setcap ‘CAP_NET_BIND_SERVICE=+eip’ /opt/tableau/tableau_server/packages/apache.XXXXX.XX.XXXX.XXXX/bin/httpd

Then you can enable / disable gateway directly or restart the whole instance.

在完成上述操作后,我尝试手动启动 httpd,竟然还出现了依赖包不对的情况。

尝试安装了一下,也不行。

4、谨慎:关于文件和文件夹权限的调整

【注意】社区友人提示,不应该赋予 root 的权限,因此这里要特别注意。

即便我在参考一个运行完全正常的环境,修改了 httpd.pid 文件所在的文件夹权限之后,依然如旧。

另一个权限问题,可能处在 httpd 程序上,位置在 /tableau/tableau_server/data/tabsvc/services/gateway_XXXXX/apache/bin/httpd

这个文件对应的权限,如果没有执行权,那么可能导致失败。从正常节点来看,它的 group 是 tableau,而所属用户是 root。如下所示:

但错误的节点中,group 和 用户都是 root(如下图所示) ,因此使用 chgrp 修改它的归属组。

另外,官方说明,这个文件的权限应该是755,如果较低,需要修改。

可惜,也没有解决问题!

参考附录2 : Gateway Process Failed To Start Permission Error=13, Permission Denied 24 Aug 2022

5、使用全新环境验证版本 bug或者操作系统 嫌疑

在多次解决无果之后,我和另一位 Tableau Server 顾问(@志冲)尝试在一个全新环境中安装2021.1.23,而后升级到2023.1.12版本,升级一切顺利。

我们(过早地)以为 Tableau Server 2023.1.12版本没有问题!

但是,就在当晚我在8850中增加一个 IP 信任地址并应用更改(需要tsm 先关闭、应用而后启动)时,系统出现了非常相似的问题——只是这次是网关无法关闭,而之前是网关无法启动。

于是我去查看了服务器日志(httpd 下的 startup.log),发现如下的问题:

(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down

和我在升级时遇到的问题如此之像,让我既高兴,又不安。 这似乎是版本的 bug……当然也可以能操作系统环境,这就超过了tableau我的控制范围之内。

当我视图手动启动一下这个进程时发现,它已经正在运行,而且和 httpd.pid 文件一致。我有点担心的是 httpd.pid 对应的群组和属主都是 root,可能有所影响。

我尝试修改一下这个 httpd.pid 的所属权限(参见附录3),然后重新试一下,还是不行,无法启动,如下:

在 httpd/的 error.log 日志中,有如下说明:

[Fri May 31 00:09:18.592075 2024] [proxy:error] pid 98378:tid 139931242460928Connection refused: AH00957: http: attempt to connect to 127.0.0.1:8285 (:80) failed [Fri May 31 00:09:18.592131 2024] [proxy_http:error] [pid 98378:tid 139931242460928] [client 127.0.0.1:44894] AH01114: HTTP: failed to make connection to backend: localhost [Fri May 31 00:10:18.592299 2024] [proxy:error] pid 98378:tid 139931150141184Connection refused: AH00957: http: attempt to connect to 127.0.0.1:8285 (:80) failed
[Fri May 31 00:10:18.592359 2024] [proxy_http:error] [pid 98378:tid 139931150141184] [client 127.0.0.1:45254] AH01114: HTTP: failed to make connection to backend: localhost

在附录4的官方帮助中,还提到了手动删除 httpd.pid 文件的方式。之前我是无法创建,这里大概率是无法移除,因此我手动移除路径tableau/data/tabsvc/httpd/ 下面的 httpd.pid 文件。

当然,这个问题可能有更深层的原因是我无法验证的:来自账号方面的权限冲突。不过鉴于在新环境依然如此,我更倾向于认为是产品的 bug 了。

参考

netstat -anbo | findstr :80

Log Error Message:(38)Function not implemented: AH00141: Could not initialize random number generator

May 31, 2024 喜乐君 update
Jun 19, 2024 喜乐君 补充