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

148421cb4267f84273de39f7abf3ef8c.jpeg

设置主机名启动 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 并重新启动,是会报出如下错误的:

2c2528c6abdfa940626edda4a5164a38.png

这主要是因为对于一个 IoTDB 集群来说,集群间的节点 RPC 通信需要通过网络,因此在 IoTDB 内部维护了一张节点编号->网络地址的表。节点重启并不会改变该节点的编号,但是如果更改了网络地址,那么会和已经存在的表冲突,进而导致启动的失败。

03

主机名与 IP

(1)IoTDB 用 IP 来做什么? 

如图所示,IoTDB 节点间通信是通过 thrift RPC 来实现的,在 thrift 的传输层(Transport)时使用 Socket,Socket 的建立需要 IP 与 port。

04fff8cdb195a5a492309ca7aab80180.png

(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 文件

650b6a377c8e816a903dddff0fdb53e6.png

(3hosts 文件

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

  • Windows 系统,hosts 文件位置:

C:\Windows\System32\drivers\etc\hosts
  • Linux 系统,hosts 文件位置:

/etc/hosts

04

主机名启动 IoTDB 

与 IP 启动 IoTDB 的区别

我们可以很容易理解设置 IP 地址可以让 Socket 建立,进而使得 IoTDB 节点间能够通信,进而启动 IoTDB。

(1)主机名为什么能启动 IoTDB 呢?

前文已经说过,IoTDB 启动后会维护节点编号->网络地址的表。之所以用主机名也能表示网络地址,主要是 java.net 中 InetAddress 类支持解析主机名。如下所示,调用 NameService 就会通过 DNS 解析(用到 hosts 文件)的方式得到其 IP 地址。  

/etc/hostsprivate static InetAddress[] getAddressesFromNameService(String host, InetAddress reqAddr) throws UnknownHostException {... ...if ((addresses = checkLookupTable(host)) == null) { // 是否正在解析该host ?等待try {for (NameService nameService : nameServices) {try {addresses = nameService.lookupAllHostAddr(host); // 向该域名服务请求域名解析success = true;break; // 只要有一个域名服务成功解析host则退出循环} catch (UnknownHostException uhe) {// 1. 若host = localhost,则addresses = [loopbackAdress] & 退出循环// 2. 否则准备抛异常(addresses = unknown_array & success = false & 记录uhe) & 继续循环                    ... ...}}// 若reqAddr不为空 && addresses中存在与reqAddr相等的InetAddress,则将该InetAddress挪到第一个位置            ... ...cacheAddresses(host, addresses, success); // 缓存记录// 域名解析失败则抛异常uhe            ... ...} finally {updateLookupTable(host); // 唤醒所有等待解析该host的线程        }}return addresses;
}

这样对于 IoTDB 来说,表保留 IP 地址或者主机名都能够成功的建立网络连接

(2)两种启动方式的区别

假设我们启动了一个 1C1D 的 IoTDB。

IP 启动

0 号节点是 ConfigNode,1 号节点是 DataNode。各自有一张表记录节点编号->网络地址。通过 IP 来使 Socket 连接,达成通信。

64a36899230c512db198e986ed2ff259.png

主机名启动

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

437368d9a8b1129bfef42a26debc5dc6.png

小结

正所谓遇到不好解决的问题的时候,多加一层就可以解决。多加的这层就是主机名的解析,通过这层解析,做到在不修改 IoTDB 内部网络通信表的情况下,访问不同的 IP 地址(就像前文中访问 www.timecho.com 的例子一样)。

05

集群迁移步骤

接下来通过一个实际的集群迁移步骤来说明两种启动方式在集群迁移过程中的区别。

(1)集群迁移(通过 HostName 启动 IoTDB)

如果通过 HostName 启动 IoTDB,只需要在新的机器上修改 hosts 文件中 域名 对应的 IP 地址,启动 IoTDB 即可,详细步骤如下:

1. 假设已经通过 1.3.x 集群版 IoTDB 安装部署了一个 3C3D 的 IoTDB 集群,其 hosts 文件内容如下:

28a37c5a907d063bc66b2a833412dfd0.png

(部署教程可见:

https://timecho.com/docs/zh/UserGuide/latest/QuickStart/ClusterQuickStart.html)

2. 启动 3C3D 集群,这里通过 IP 地址连接(也可以通过 -h iotdb 2),验证我们所连接集群的 IP 地址。

ff596bd7ae0400ba34dff5d685de3e61.png

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

79ea79ce6cf44b957ce251d7b47a69f5.png

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

ec529710f48ff15b06023eff3ed805d5.png

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

c29211fe5e70dd3714263931f6b90a8b.png

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

9cbc1258ed651f1a4bc8e0c461230d88.png

(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!

重要的事情说三遍。

2d9bd0a0bb298e315b9a61e25f7db0ac.gif

a87b947c85c3bbc64ea658da8a57d62a.jpeg

d6ffed08cc808508da78c3c7347991d4.jpeg

814a9e68d36cd4823fb3f38c008b7b36.jpeg

9f1d1f56605d3c067709b716fc71f39e.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lua 判断字符串是否包含子字符串(点符号查找)

一、string.find 方法 lua代码 function containsDot(str) local pos string.find(str, ".") if pos then return true else return false end end -- 测试函数 local testString1 "hello.world" local testString2 "helloworld&quo…

SpringBoot集成jasypt对yml文件指定参数加密并自定义@bean隐藏密钥

1、查看SpringBoot和jasypt对应版本。 Jasypt 1.9.x 通常与 Spring Boot 1.5.x 相对应。 Jasypt 2.1.x 通常与 Spring Boot 2.0.x 相对应。 Jasypt 3.x 通常与 Spring Boot 2.1.x相对应。 2、引入maven <dependency><groupId>com.github.ulisesbocchio</groupI…

CSS - 选择器

目录 一、CSS的基本语法格式&#xff1a; 二、常见的CSS选择器 ​编辑1.标签选择器 2.类选择器 3.id选择器 4.复合选择器 5.通用选择器 三、常见的CSS样式 1.color 2.font-size 3.border 4.width/height 5.padding 6.margin 四、CSS的引入方式 1.行内引入 …

Tableau-BI仪表盘搭建

目录 经营数据总览 经营数据详情 每日营收数据 每日流量数据 新老客占比 平台占比 门店占比 投放情况 订单分布 配送分布 汇总搭建仪表板 构思仪表盘布局 经营数据总览 数据总览表&#xff0c;显示的是数据&#xff0c;就拖入文本中&#xff0c;其他同样加入到已经…

开源免费的定时任务管理系统:Gocron

Gocron&#xff1a;精准调度未来&#xff0c;你的全能定时任务管理工具&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发&#xff0c;是一个轻量级定时任务集中调度和管理系统&#xff0c;用于替代L…

JavaEE初阶-多线程5

文章目录 一、线程池1.1 线程池相关概念1.2 线程池标准类1.3 线程池工厂类1.4 实现自己的线程池 二、定时器2.1 java标准库中的定时器使用2.2 实现一个自己的定时器2.2.1 定义任务类2.2.2 定义定时器 一、线程池 1.1 线程池相关概念 池这个概念在计算机中比较常见&#xff0c…

[笔试训练](十九)

目录 055:小易的升级之路 056:礼物的最大价值 057:对称之美 055:小易的升级之路 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 根据题意简单模拟即可&#xff0c;可单独写gcd函数求最大公因数。 int gcd(int a, int b) { if (…

抖音抖加如何投放效果最好?

抖音平台上的抖加投放是一种有效的推广方式,但对于一些新手来说,可能会遇到投放效果不佳的情况。为了帮助大家提高抖加投放的效,下面分享一些抖音抖加投放技巧。 一、选择合适的投放模式 抖音抖加有三种投放模式:系统智能投放、自定义定向投放以及达人相似粉丝投放。不同…

Redis——Redis数据分片的三种算法

Redis的数据分片通常是为了实现水平扩展&#xff0c;将数据分散到多个Redis节点上&#xff0c;以提高系统的容量和性能。在Redis的不同实现和集群方案中&#xff0c;数据分片的算法有所不同。以下是Redis数据分片的三种常见算法&#xff1a; 哈希取模分片&#xff08;Hash Modu…

数字水印 | 基于小波变换的数字水印技术

&#x1f34d;原文&#xff1a; 基于小波变换的数字水印技术 &#x1f34d;写在前面&#xff1a; 本文属搬运博客&#xff0c;自己留存学习。 正文 小波变换 把一个信号分解成由基本小波经过移位和缩放后的一系列小波&#xff0c;它是一种 “时间——尺度” 信号的多分辨率分…

Python中如何将小数转化为百分数进行输出

小数转化为百分数 Python中如何将小数转化为百分数进行输出基本概念使用字符串格式化1. 使用字符串格式化操作符 %2. 使用str.format()方法3. 使用f-string&#xff08;格式化字符串字面量&#xff09; **重点内容**&#xff1a;**无论是通过使用%格式化操作符、str.format()方…

AtCoder Beginner Contest 310 E题 NAND repeatedly

E题&#xff1a;NAND repeatedly 标签&#xff1a;动态规划题意&#xff1a;给定一个长度为 n n n的 01 01 01字符串 A i A_i Ai​&#xff0c;给定规则&#xff1a; 0 ⊼ 0 1 , 0 ⊼ 1 1 , 1 ⊼ 0 1 , 1 ⊼ 1 0 0⊼01,0⊼11,1⊼01,1⊼10 0⊼01,0⊼11,1⊼01,1⊼10。 求 ∑…

Linux进程间通信——匿名管道和命名管道

文章目录 一、引言二、管道的基本原理1、管道的定义与结构2、管道的工作原理 三、匿名管道&#xff08;Anonymous Pipe&#xff09;1、匿名管道的概念2、匿名管道的创建与使用3、匿名管道的读写规则4、匿名管道的特点5、使用匿名管道实现进程池 四、命名管道&#xff08;Named …

MySQL的复合查询

多表查询 MySQL中的多表查询是一个强大的功能&#xff0c;允许你在一个查询中组合来自多个表的数据。这通常通过JOIN语句实现&#xff0c;但也可以使用子查询或集合操作符&#xff08;如UNION&#xff09;。下面我将介绍几种常见的多表查询方式及其用途。 INNER JOIN&#xf…

学习java第六十八天

在AOP术语中&#xff0c;切面的工作被称为通知。通知实际上是程序运行时要通过Spring AOP框架来触发的代码段。 Spring切面可以应用5种类型的通知&#xff1a; 前置通知&#xff08;Before&#xff09;&#xff1a;在目标方法被调用之前调用通知功能&#xff1b; 后置通知&a…

计算机视觉——基于改进UNet图像增强算法实现

1. 引言 在低光照条件下进行成像非常具有挑战性&#xff0c;因为光子计数低且存在噪声。高ISO可以用来增加亮度&#xff0c;但它也会放大噪声。后处理&#xff0c;如缩放或直方图拉伸可以应用&#xff0c;但这并不能解决由于光子计数低导致的低信噪比&#xff08;SNR&#xff…

Oracle如何实现rsa加密和例子

在Oracle数据库中实现RSA加密通常需要使用Java编写的存储过程&#xff0c;因为Oracle自身并不直接支持RSA加密的原生函数。下面是一个基本的例子&#xff0c;说明如何在Oracle中使用Java存储过程来实现RSA加密。 首先&#xff0c;你需要一个Java类&#xff08;比如我们称之为R…

【Spring】@ServerEndpoint 与 Spring 是如何集成的

文章目录 前言表象理解后记更多文章 前言 最近工作需要用到 Websocket 协议。好奇来自 Jdk 包的 ServerEndpoint 是如何与 Spring Boot 集成的&#xff0c;特此记录一下结论。 表象 如果要暴露形如 ws://${ip}:${port}/ws 的服务地址&#xff0c;用于websocket 通信&#xf…

STC8增强型单片机开发——串口调试UART

一、什么是串口 串口是一种在数据通讯中广泛使用的通讯接口&#xff0c;通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter)&#xff0c;其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中&#xff0c;串口常用于与外部设备…

关于Speech processing Universal PERformance Benchmark (SUPERB)基准测试及衍生版本

Speech processing Universal PERformance Benchmark &#xff08;SUPERB&#xff09;是由台湾大学、麻省理工大学&#xff0c;卡耐基梅隆大学和 Meta 公司联合提出的评测数据集&#xff0c;其中包含了13项语音理解任务&#xff0c;旨在全面评估模型在语音处理领域的表现。这些…