关于docker:在Docker环境下TDengine的客户端为什么连不上集群

30次阅读

共计 3003 个字符,预计需要花费 8 分钟才能阅读完成。

作者|陈玉

最近,在 TDengine 的一个社区群中突发了一场重大的灌水事件。几位群友不眠不休地聊天,能够说是废寝忘食。那么到底是什么话题能让他们凌晨四点还在忘我地探讨?

这个话题就是——如何欠缺 Docker 环境下 TDengine 的集群搭建。“什么?除了你们官网本人人之外,怎么会有用户加班加点地探讨如何欠缺 Docker 环境的集群搭建,这也太假了。”

好吧,咱们抵赖:其实是有一个叫 Oliver(群昵称)的用户遇到了这样的问题——辛辛苦苦搭起来 Docker 环境下的 TDengine 集群在客户端连不上了。接下来,就引发了群里的二位热心大佬的探讨不休,直到想出最初的解决方案。

事件的通过是这样的:

该用户的数据库集群装在这台 Linux 服务器上(ip:10.0.31.2),容器 ip 所在的网络是由 Docker 在宿主机创立的虚构网络 172.19.0.0/16。三个容器的 hostname 和节点 ip 别离:taosnode1(172.19.0.41)、taosnode2(172.19.0.42)、taosnode3(172.19.0.43)。

各个节点配置如下:

taosnode1: firstEp=taosnode1:6030,secondEp=taosnode2:6030,fqdn=taosnode1; 端口映射:16030-16042:6030-6042(tcp/udp)taosnode2: firstEp=taosnode1:6030,secondEp=taosnode2:6030,fqdn=taosnode2; 端口映射:26030-26042:6030-6042(tcp/udp)taosnode3: firstEp=taosnode1:6030,secondEp=taosnode2:6030,fqdn=taosnode3; 端口映射:36030-36042:6030-6042(tcp/udp)

依照官网文档的批示致力折腾一番后,Oliver 终于搭起了这个集群。增加完节点之后,他忐忑地敲下了“show dnodes”,随着三个 READY 映入眼帘后———舒坦了。

服务端没有问题,接下来该客户端了。他关上了本人的一台 ip 为 10.0.31.5(与集群宿主机同一网段)的 Windows 主机,迅速地在下面装置了个 TDengine 客户端,增加 hosts 信息,做好路由,2.8MB,傻瓜式装置,轻松便捷,连贯集群零打碎敲。“show dnodes”随着三个 READY 再次映入眼帘后———又舒坦了。

Oliver 十分满意,然而,他马上发现事件可能并不像设想中的那么简略。

因为业务须要,他还须要实现客户端(10.0.2.61)跨网段连贯服务端集群(基于 ip:10.0.31.2 的 Docker 环境下的集群)。ping 得通宿主机,telnet 得通集群映射进去的端口,应用 taos 连贯集群,一样的操作也和此前一样顺利。于是他再次敲下“show dnodes”——万万没想到,这时令所有 TDengine 用户都疾恶如仇的“DB error:Unable to establish connection”呈现了。于是,他便在群中抛出了本人的问题。

上文说到的两位热心的同学就是在这个时候呈现的。一位是 TDengine 的内部 Contributor——Freemine。另一位是路见问题拔刀相助的热心大佬 pigwing。

因为集群自身没有任何应用问题,惟一的区别就是客户端连贯服务器的形式变成了跨网段。所以,一开始大家的思路就是——既然走宿主机的端口不行,那就试试间接连到 Docker 环境下的 ip 吧。遗憾的是,跨网段连贯 Docker 环境下外部 ip 的想法没能实现。

接着大家揣测:TDengine 靠的是 EndPoint(EP)来辨认数据节点,而 EP=FQDN+ 端口。可客户端连贯曾经胜利,只是无奈对数据操作,在 FQDN 无误的状况下,大家猜想是集群内的端口呈现了问题,从而没拿到集群的拓扑信息。接下来,从最后的理解环境,到一步一步的排查问题,三个持之以恒的工程师在群里从 4 月 22 日探讨到 4 月 25,最晚的时候凌晨 4 点多都有人在线。

终于,在三人的通力合作屡次试错下,4 月 24 日凌晨 1 点——freemine 提出了一个卓有成效的最终解决方案(文字过多只截图要害局部)

功败垂成,通过测试后,一切顺利!

那么,freemine 的集群搭建计划和最后的集群搭建有什么区别呢?

尽管过程波折,然而最初咱们认真比照一下两者的计划就会发现,它们的区别就只有在端口配置这一块不一样。freemine 的计划是在每一个单机的 serverport 都批改了不一样的值。taosnode1 节点的 serverport 为 6030—映射主机的 6030 端口;taosnode2 节点的 serverport 为 7030–映射主机的 7030 端口;taosnode3 节点的 serverport 为 8030–映射主机的 8030 端口。

而提问者 Oliver 最后的各个节点的 serverport 都是没做批改的默认 6030,映射到宿主机的时候是 16030,26030,36030。就是这样的配置在客户端与集群宿主机的同网段连贯时并没有产生问题,而是在跨网段连贯时呈现问题。

看起来一丝小小的改变竟然有这么大的区别?Why?

其实是这样,当客户端与服务端同属一个网段的时候,在增加路由后,客户端是能够间接拜访到 Docker 外部的。这样一来,IP 地址就能够依据须要被正确地解析进去。如:taosnode1(172.19.0.41)、taosnode2(172.19.0.42)、taosnode3(172.19.0.43)。在不同的 IP 地址下,即使端口都是一样的 6030,TDengine 还是能够实现不同节点的辨别。

然而,当跨网段之后就不一样了。对于不同网段的客户端和服务端而言,客户端要通过实在路由去连贯服务端,但实在路由中并没有注册咱们设置的 Docker 外部网络,所以客户端天然就拜访不了 Docker 外部的网络。因而,当 taosc 须要失去集群提供的不同节点的信息时,FQDN 曾经无奈正确解析 IP 地址了。这时候,就须要通过端口来实现不同节点的辨别。

这就是不能再在 Docker 环境下的节点中同时应用 6030 端口的起因。

因而,当你应用了 Docker 主机内外统一的端口映射,且每个节点的 serverPort 参数不雷同的设置时,集群就能够通过不同的端口来辨别不同的节点。这样一来,客户端才能够拿到拓扑信息进行集群的顺利操作。

这就是整个“案件”的最终答案。

总结一下,对于用户应用而言,Docker 环境下搭建 TDengine 集群的水还是颇深。因为环境的绝对简单,所以咱们也并不是非常举荐大家应用这种形式搭建集群。所以,对于 TDengine 在 Docker 环境的应用,大家还是要小心谨慎。

最初咱们想说的是,作为一个开源的产品,社区的沉闷与业余是咱们涛思数据最为关注的中央。尽管目前官网上并没有对于 Docker 环境下 TDengine 集群搭建的文档。然而这些社区用户们的沉闷思考显然很大水平填补了这样的一个空白。

真心感激 Oliver,freemine,pigwing 三位敌人。非常心愿日后能够持续看到你们在物联网大数据技术前沿群中的沉闷身影,同时咱们也心愿有更多的敌人们可能参加进来。

点击“这里”,查看 Oliver 整顿的 TDengine 在 Docker 环境下的集群搭建笔记。

正文完
 0