为什么推荐将 IoTDB 服务地点设置为 HostName 而非 IP?

打印 上一主题 下一主题

主题 803|帖子 803|积分 2409


  设置主机名启动 IoTDB 可在不修改设置环境下,在差别环境运行 IoTDB 并实现多次摆设。
  01
  前言
  IoTDB 在设置启动时有两种方式:
  1. 通过设置 HostName(主机名)的方式来启动 IoTDB(推荐方式);
  2. 通过设置 IP 的方式来启动 IoTDB。
  因为设置主机名要修改 hosts 文件多一步操纵,以是可能有的用户更风俗于设置 IP 的方式来启动 IoTDB。本文将结合一个典型场景:集群迁徙,来解答这些用户可能会产生的困惑:
  

  • 什么是 HostName(主机名)?和 IP 的关系是怎样的?
  

  • IoTDB 启动为什么推荐利用主机名?利用主机名相较于 IP 会带来什么样的好处?
  02
  集群迁徙配景
  集群迁徙:在摆设 IoTDB 后,可能会遇到某些环境导致必要将部门/全部的 IoTDB 节点从旧呆板迁徙到新呆板上。
  IoTDB 迁徙影响最大的是网络,因为几乎所有的集群在启动时都会更改:
  

  • cn/dn_internal_address 参数(IoTDB 内部通讯必要利用的网络地点);
  

  • cn/dn_seed_config_node 参数(seed_config_node 的网络地点。初次启动时利用,所有的节点都必须向其发送注册信息,以此来表示本身要加入该集群);

  

  • dn_rpc_address参数(Session 和 Cli 毗连 DataNode 利用的网络地点)。
  而这三个参数都是启动后不可修改的参数
  
假如你尝试去关闭一个 ConfigNode/DataNode,修改 cn/dn_internal_address 并重新启动,是会报出如下错误的:

  

  这主要是因为对于一个 IoTDB 集群来说,集群间的节点 RPC 通讯必要通过网络,因此在 IoTDB 内部维护了一张节点编号->网络地点的表。节点重启并不会改变该节点的编号,但是假如更改了网络地点,那么会和已经存在的表辩论,进而导致启动的失败。
  03
  主机名与 IP
  (1)IoTDB 用 IP 来做什么? 
  如图所示,IoTDB 节点间通讯是通过 thrift RPC 来实现的,在 thrift 的传输层(Transport)时利用 Socket,Socket 的创建必要 IP 与 port。
  

  (2)IP 、域名、主机名、DNS
  IP:一个 32 位的二进制数(IPv4)用于在一个在网络通讯中用于确定一台主机。但是其可读性却比较差,并且无现实寄义,倒霉于影象。因此设计出了主机名、域名以及域名解析系统(DNS)来办理这一问题。
  主机名:辨认网络上的主机。
  域名:辨认网站。主机名是域名的最前部门(比方 www.timecho.com 是域名,其中 www 是主机名)。
  无论是主机名还是域名,都是为了方便人去访问网络上的其他装备,都可以理解为 IP 地点的别名。
  DNS:是将域名和主机名解析成对应 IP 地点的服务器。
  
举个例子:假如没有 DNS,你要访问天谋科技的主页必要通过在导航栏输入 123.56.10.29(IP),而通过 DNS 只必要输入 www.timecho.com (域名)即可访问。域名将通过 DNS 解析成对应的 IP。假如有一天可能由于某些原因更换了官网的 IP 地点,你仍旧可以通过域名访问天谋科技的主页,因为 DNS 会将其解析成新的 IP 地点。

  一个 DNS 的解析过程如下图所示,先尝试进行本地的解析工作,之后再由本地 DNS 服务器去迭代的解析。本地解析优先级会高于 DNS 解析,这样会加速整体的解析过程,在本地解析的过程中,会去查看 hosts 文件
  

  (3hosts 文件
  hosts 文件:保存主机名IP 的映射关系。
  

  • Windows 系统,hosts 文件位置:
  1. C:\Windows\System32\drivers\etc\hosts
复制代码


  • Linux 系统,hosts 文件位置:
  1. /etc/hosts
复制代码
04
  主机名启动 IoTDB 
  与 IP 启动 IoTDB 的区别
  我们可以很容易理解设置 IP 地点可以让 Socket 创建,进而使得 IoTDB 节点间可以或许通讯,进而启动 IoTDB。
  (1)主机名为什么能启动 IoTDB 呢?
  前文已经说过,IoTDB 启动后会维护节点编号->网络地点的表。之以是用主机名也能表示网络地点,主要是 java.net 中 InetAddress 类支持解析主机名。如下所示,调用 NameService 就会通过 DNS 解析(用到 hosts 文件)的方式得到其 IP 地点。  
  1. /etc/hostsprivate static InetAddress[] getAddressesFromNameService(String host, InetAddress reqAddr) throws UnknownHostException {
  2.    ... ...
  3.    if ((addresses = checkLookupTable(host)) == null) { // 是否正在解析该host ?等待try {
  4.            for (NameService nameService : nameServices) {
  5.                try {
  6.                    addresses = nameService.lookupAllHostAddr(host); // 向该域名服务请求域名解析
  7.                    success = true;
  8.                    break; // 只要有一个域名服务成功解析host则退出循环
  9.                } catch (UnknownHostException uhe) {
  10.                    // 1. 若host = localhost,则addresses = [loopbackAdress] & 退出循环
  11.                    // 2. 否则准备抛异常(addresses = unknown_array & success = false & 记录uhe) & 继续循环                    ... ...
  12.                }
  13.            }
  14.            // 若reqAddr不为空 && addresses中存在与reqAddr相等的InetAddress,则将该InetAddress挪到第一个位置            ... ...
  15.            cacheAddresses(host, addresses, success); // 缓存记录
  16.            // 域名解析失败则抛异常uhe            ... ...
  17.        } finally {
  18.            updateLookupTable(host); // 唤醒所有等待解析该host的线程        }
  19.    }
  20.    return addresses;
  21. }
复制代码
这样对于 IoTDB 来说,表保存 IP 地点大概主机名都可以或许成功的创建网络毗连
  (2)两种启动方式的区别
  假设我们启动了一个 1C1D 的 IoTDB。
  IP 启动
  
0 号节点是 ConfigNode,1 号节点是 DataNode。各自有一张表记载节点编号->网络地点。通过 IP 来使 Socket 毗连,达成通讯。

  

  主机名启动
  
同样 0 号节点是 ConfigNode,1 号节点是 DataNode。各自有一张表记载节点编号->网络地点。Socket 通过主机名访问 hosts 文件解析出真实的 IP 地点后创建 Socket 毗连。

  

  小结
  正所谓遇到不好办理的问题的时间,多加一层就可以办理。多加的这层就是主机名的解析,通过这层解析,做到在不修改 IoTDB 内部网络通讯表的环境下,访问差别的 IP 地点(就像前文中访问  www.timecho.com 的例子一样)。
  05
  集群迁徙步调
  接下来通过一个现实的集群迁徙步调来阐明两种启动方式在集群迁徙过程中的区别。
  (1)集群迁徙(通过 HostName 启动 IoTDB)
  假如通过 HostName 启动 IoTDB,只必要在新的呆板上修改 hosts 文件中 域名 对应的 IP 地点,启动 IoTDB 即可,详细步调如下:
  1. 假设已经通过 1.3.x 集群版 IoTDB 安装摆设了一个 3C3D 的 IoTDB 集群,其 hosts 文件内容如下:
  

  (摆设教程可见:
  集群版_天谋IoTDB)
  2. 启动 3C3D 集群,这里通过 IP 地点毗连(也可以通过 -h iotdb 2),验证我们所毗连集群的 IP 地点。
  

  3. 向三个节点分别插入数据,并验证此时的数据是可以查询的。
  

  4. 关闭 3C3D 集群,并将他们上传至新的呆板上,新呆板的 hosts 文件内容如下:
  

  5. 在新呆板上启动 3C3D 集群,这里通过 IP 地点毗连(也可以通过 -h iotdb 2),验证我们所毗连集群的 IP 地点。
  

  6. 查询 region 和数据,均可查,阐明集群迁徙成功
  

  (2)集群迁徙(通过 IP 启动 IoTDB)
  假如通过 IP 地点启动了 IoTDB 集群,由于网络参数项不可更改,想迁徙某个节点只能通过:
  1. 在旧呆板上 remove 该节点(假如该节点含有大量的数据,所有的数据都必要迁徙进别的节点);
  2. 在新呆板上启动一个全新的节点(此时所有的负载均衡均必要重新计算)。
  假如是迁徙整个集群,就得在所有的节点上实行上述的操纵,整个操纵非常的繁琐并且浪费了大量的资源进行节点间的数据迁徙。并且在上述迁徙 3C3D 集群的例子中,你甚至无法通过该方式迁徙,因为迁徙前后的两个集群网络上不通。此时只能将 3C3D 的所有数据信息(tsfile)分别 load 进新的集群。做一个数据迁徙,而非集群迁徙
  06
  总结
  希望读者能通过这篇文章能理解网络毗连在 IoTDB 启动过程中的作用,能清楚设置主机名启动和设置 IP 启动两种方式在 IoTDB 创建网络毗连时的接洽和区别。
  通过设置主机名启动实现了不修改 IoTDB 的设置,能在差别环境上运行相同的 IoTDB,不但可以直接将整个 IoTDB 打包多次摆设,也可以在遇到问题时将打包发给开发人员调试问题。
  强力推荐所有的 IoTDB 用户都通过设置主机名的方式来启动 IoTDB!
  强力推荐所有的 IoTDB 用户都通过设置主机名的方式来启动 IoTDB!
  强力推荐所有的 IoTDB 用户都通过设置主机名的方式来启动 IoTDB!
  重要的事变说三遍。
  

  

  

  

  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表