一、influxdb1、安装与下载待补充2、cpu爆满解决方案症状:influxdb运行几分钟后内存达到3.3G,内存占比占95%cpu也达到90%以上线索:2.1、快速定位在你的InfluxDB服务器上执行以下两个命令告诉我结果我就能立刻判断出主攻方向1、看线程执行top -H -p $(pgrep influxdb)截图或描述看看是有很多个CPU核心都在工作还是只有1-2个核心的CPU使用率特别高接近100%其他核心很空闲判断依据如果只有2个核心忙说明是写入IO线程不够这是InfluxDB默认配置的通病高并发写入时的典型表现-4-7。2.2、解决方案根本原因高序列基数现象SHOW SERIES CARDINALITY返回的数字非常高。原因你的数据结构设计有问题。可能是将日志信息、唯一ID、用户手机号等高可变性的信息作为了标签导致序列数量爆炸式增长占满内存解决方案这是需要优先排查和解决的问题。识别“罪魁祸首”运行Flux查询统计每个标签的唯一值数量找出那个值比其他标签高几个数量级的标签。优化数据结构将高基数的标签改为字段field。字段不会被索引因此不会消耗那么多内存。如果必须作为标签需要重新审视业务场景看是否能通过合并或聚合来降低基数。清理旧数据如果某些高基数数据不再需要可以考虑直接删除整个存储桶bucket或特定时间范围的数据。根本原因IO线程不足写入瓶颈现象运行top -H后发现只有2个CPU核心满载其他核心空闲。原因InfluxDB处理网络写入请求的IO线程数默认只有2个。在写入并发较高时这2个线程会成为瓶颈不仅CPU利用率上不去内存也可能因为请求堆积而升高。解决方案调整启动配置增加IO线程数。例如如果你的服务器有16核可以尝试设置为2.3、其他原因若以上两个命令输出结果都是正常的话那要考虑是否改动了什么导致的我的原因是废弃的服务器里面的采集服务(之前关闭的)开启了导致采集数据量加倍二、tdengine实践文档一、创建超级表和存库1、创建历史和报警数据超级表--历史数据超级表 CREATE STABLE tjdk.udf(ts timestamp,val float,standval float,maxval float,minval float,states int,outMaxVal float,outMinVal float) TAGS (head_code nchar(20),acq_point nchar(20)); --报警数据超级表 CREATE STABLE tjdk.alaudf(ts timestamp,val float,standval float,maxval float,minval float,states int,outMaxVal float,outMinVal float) TAGS (head_code nchar(20),acq_point nchar(20));2、自动创建表存库msg.sql insert into ; const dbname tjdk;//数据库名称 Object.entries(msg.rtdata).forEach(function ([key, v]) { let tname dbname . msg.head_code _ key; msg.sql tname using dbname .udf tags( msg.head_code , key ) values(now,; msg.sql v[0] ,; msg.sql v[1] ,; msg.sql v[2] ,; msg.sql v[3] ,; msg.sql v[4] ,; msg.sql v[5] ,; msg.sql v[6] ); }); msg.payload msg.sql ;; return msg;二、查询语句集合1、分组条件查询SELECT last(*) from gw_test.udf where ts now-10m and head_code in (thDev,noiceDev,airDev,preDev) GROUP by head_code,acq_point;3、联合查询需求 一次获取超级表下面几个子表联合数据SELECT a.val as v1,b.val as v2 from tldk.jy01_temp a,tldk.jy01_rev b where a.ts b.ts and a.ts now -3m;返回数据格式{ res: true, count: 18, data: [ { v1: 418.6, v2: 10.974856 }, { v1: 417.8, v2: 10.993713 }, { v1: 416.6, v2: 10.996858 }, { v1: 416.4, v2: 11.006286 }, { v1: 416.2, v2: 11.003141 }, { v1: 415.8, v2: 10.993713 }, { v1: 414.8, v2: 11.018857 }, { v1: 414.7, v2: 10.981142 }, { v1: 415.4, v2: 10.984286 }, { v1: 414.6, v2: 11.006286 }, { v1: 414.4, v2: 11.025143 }, { v1: 413.6, v2: 11.028285 }, { v1: 413.1, v2: 11.025143 }, { v1: 417.1, v2: 11.037714 }, { v1: 421, v2: 11.050285 }, { v1: 421.2, v2: 11.07857 }, { v1: 419, v2: 11.069143 }, { v1: 417.1, v2: 11.040856 } ] }4、GROUP BY 查询的 LIMIT/OFFSET 作用于分组内部而非全局结果集**错误原因**在tdengine中GROUP BY 查询的 LIMIT 和 OFFSET 作用于**每个分组内部**这里是每个 60 秒时间窗口而非全局结果集。因此当存在多个时间窗口时返回数据量为 窗口数 × LIMIT而非预期的全局总行数。**正确做法**使用子查询将聚合结果先计算出来再在外层应用全局 LIMIT/OFFSET。SELECT * FROM ( SELECT last(val) AS val, last(iwtemp) AS iwtemp, last(diff) AS diff, last(diffmax) AS diffmax, last(diffmin) AS diffmin, last(states) AS states, ts FROM tldk.alatemp WHERE ts 2026-01-05 00:00:00 AND ts 2026-01-06 20:00:00 GROUP BY acq_point, time(60s) ORDER BY ts DESC ) LIMIT 2 OFFSET 45、设备OEE计算计算机头当天的【有效开机时间】和【运转率】 ① 查数据库统计有效数据条数 从数据表中统计 当天、线速度 200 的记录数量 sql SELECT count(*) FROM table WHERE ts 当天 AND val 200 → 得到 有效采集点数acq_num ② 查采集频率 查最后一条数据的时间间隔知道 多久采一次数据 sql SELECT diff(ts) / 1000 FROM tljx.${msg.head_code}_ssxr ORDER BY ts DESC LIMIT 1; ③ 计算机头 OEE 运转指标 有效运转率rate 有效开机时间effTime 无效时间ineffTime 2. 最终算出 4 个结果 acq_num 当天线速度 200 的有效数据条数 rate 有效运转率0~1保留两位小数 effTime 当天有效开机时间单位分钟 一天最多 1440 分钟 ineffTime 当天无效停机时间1440 - 有效时间 3. 计算公式超级简化版 plaintext 有效运转率 有效数据条数 / 当天理论应采集总条数 有效开机时间 运转率 × 1440 分钟 无效时间 1440 - 有效时间6、批量插入数据时时间戳重复导致只存最后一条时间戳是数据库的主键必须唯一。批量插入时如果全部用NOW所有数据时间戳都一样数据库会自动覆盖最后只留下一条记录。// 在 Node-RED 的 Function 节点中使用 function saveDeviceStatusToTD(data) { let insertSql INSERT INTO tldk.device_status_detail (ts, headCode, head_type, param_type) VALUES ; let valuesArr []; const baseTs Date.now() - 8 * 60 * 60 * 1000; let offset 0; for (const key in data) { const param_type key.includes(normalDev) ? 1 : 2; const head_type key.includes(udf) ? 1 : 2; for (let headCode of data[key]) { headCode headCode.length 1 ? headCode 炉 : headCode; headCode headCode.toUpperCase(); // 使用基准时间 偏移量确保每条记录时间戳不同 valuesArr.push((${baseTs offset}, ${headCode}, ${head_type}, ${param_type})); offset; } } insertSql valuesArr.join(, ); return insertSql; }7、DISTINCT对单个或多个数据列进行去重SELECT DISTINCT headCode FROM tldk.device_status_detail WHERE ts NOW - 1d AND head_type 1 AND param_type 1;四、数据库数据迁移1、数据库迁移把windows上的tdengine数据迁移到linux系统的tdengine库1.1、taosdumptaosdump -H 127.0.0.1 -u root -p taosdata -D tjdk -S 2026-02-01 00:00:00 -E 2026-03-08 23:59:59 -o C:\juxin\td_backup1.2、程序读取旧库存新库[ { id: bd6adaa5521b32c0, type: taos-query, z: f6f2187d.f17ca8, server: bb86570570d747eb, database: tjdk, sql: , x: 540, y: 340, wires: [ [ adce2ab7a8392fbf ] ] }, { id: 63b02d7acafba141, type: function, z: f6f2187d.f17ca8, name: sql, func: msg.head_code y902;\nmsg.acq_point msg.acq_points[msg.a];\nmsg.payload \n select * from ${msg.head_code}_${msg.acq_point} ;\n;\nreturn msg;, outputs: 1, timeout: 0, noerr: 0, initialize: , finalize: , libs: [], x: 350, y: 340, wires: [ [ bd6adaa5521b32c0 ] ] }, { id: adce2ab7a8392fbf, type: function, z: f6f2187d.f17ca8, name: res, func: msg.res msg.payload;\nreturn msg;, outputs: 1, timeout: 0, noerr: 0, initialize: , finalize: , libs: [], x: 730, y: 340, wires: [ [ 769962b26edf7b37 ] ] }, { id: 769962b26edf7b37, type: array-loop, z: f6f2187d.f17ca8, name: loop, key: r, keyType: msg, reset: false, resetValue: value-null, array: res, arrayType: msg, x: 890, y: 340, wires: [ [ e9603cb7d3a5f412 ], [ 2634b5563b822a61 ] ] }, { id: 2634b5563b822a61, type: function, z: f6f2187d.f17ca8, name: insert, func: const d msg.res[msg.r];\nconst ts getTime(d[0]);\nmsg.payload insert into tjdk.${msg.head_code}_${msg.acq_point} using tjdk.udf tags(${msg.head_code},${msg.acq_point}) \n values(${ts},${d[1]},${d[2]},${d[3]},${d[4]},${d[5]},${d[6]},${d[7]});;\nreturn msg;\nfunction getTime(utc){\n// 一步到位转时区 去掉T和Z\nconst res new Date(new Date(utc).getTime() 8 * 3600 * 1000).toISOString().replace(/T|Z/g, ).trim();\nreturn res;\n}, outputs: 1, timeout: 0, noerr: 0, initialize: , finalize: , libs: [], x: 850, y: 460, wires: [ [ 886893fdf3103991 ] ] }, { id: 886893fdf3103991, type: taos-query, z: f6f2187d.f17ca8, server: 216d9e608a07b6fd, database: tjdk, sql: , x: 1020, y: 460, wires: [ [ 769962b26edf7b37 ] ] }, { id: d0493f165da6620d, type: inject, z: f6f2187d.f17ca8, name: , props: [ { p: payload }, { p: topic, vt: str } ], repeat: , crontab: , once: false, onceDelay: 0.1, topic: , payload: , payloadType: date, x: 170, y: 240, wires: [ [ ca1fdb09be40fde9 ] ] }, { id: ca1fdb09be40fde9, type: function, z: f6f2187d.f17ca8, name: acq_points, func: msg.acq_points [\rev\,\temp\,\electricity\,\boilflow1\,\boilflow2\,\botemp\,\gctemp\,\uwttemp\,\pwttemp\,\crwflow\,\sbflow\,\eciwtemp\,\ecowtemp\,\ectflow\,\ecpflow\,\citemp\,\trtemp\,\tcatemp\,\pcatemp\,\vsxzl1\,\ssxr1\,\vsxzl2\,\ssxr2\,\cww2\,\ewyield\,\psizea\,\psizeb\,\psizec\,\psized\,\motorp\,\motorr\,\ttemp\,\ptemp\,\pdtemp1\,\pdtemp2\,\irwtemp\,\pre\]\nreturn msg;, outputs: 1, timeout: 0, noerr: 0, initialize: , finalize: , libs: [], x: 350, y: 240, wires: [ [ e9603cb7d3a5f412 ] ] }, { id: e9603cb7d3a5f412, type: array-loop, z: f6f2187d.f17ca8, name: , key: a, keyType: msg, reset: false, resetValue: value-null, array: acq_points, arrayType: msg, x: 580, y: 240, wires: [ [], [ 63b02d7acafba141 ] ] }, { id: bb86570570d747eb, type: taos-config, host: 192.168.131.69, port: 6041, username: root, password: taosdata }, { id: 216d9e608a07b6fd, type: taos-config, host: 192.168.131.125, port: 6041, username: root, password: taosdata } ]五、docker安装redis现在docker镜像资源被禁用了所以我从已经安装redis的docker容器里面导出镜像导出镜像的命令如下docker save -o redis.tar swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/redis:7.2.6把镜像下载下来上传到要安装redis的linux服务上[rootlocalhost ~]# cd /home/juxin/ [rootlocalhost juxin]# docker load -i redis7.2.0.tar 511780f88f80: Loading layer [] 77.81MB/77.81MB 90413ed13ba6: Loading layer [] 11.26kB/11.26kB c44e5d4e8bf9: Loading layer [] 4.151MB/4.151MB ae989b5eb6a6: Loading layer [] 60.17MB/60.17MB f9e931d9415a: Loading layer [] 2.048kB/2.048kB 6b45f041a0f4: Loading layer [] 4.096kB/4.096kB Loaded image: redis:latest [rootlocalhost juxin]#启动容器[rootlocalhost juxin]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE node_red4.0.3 latest 6f7c5546526e 8 months ago 760MB redis latest 506734eb5e71 2 years ago 138MB [rootlocalhost juxin]# [rootlocalhost juxin]# [rootlocalhost juxin]# docker run -d --name redis -p 6379:6379 -v /data/redis/data:/data redis:latest redis-server --appendonly yes 57cee3e8d81b67c3e32cf30182a31d8510e6b48167553cc8cc80747003dfc621
influxdb/tdengine数据库白皮书
一、influxdb1、安装与下载待补充2、cpu爆满解决方案症状:influxdb运行几分钟后内存达到3.3G,内存占比占95%cpu也达到90%以上线索:2.1、快速定位在你的InfluxDB服务器上执行以下两个命令告诉我结果我就能立刻判断出主攻方向1、看线程执行top -H -p $(pgrep influxdb)截图或描述看看是有很多个CPU核心都在工作还是只有1-2个核心的CPU使用率特别高接近100%其他核心很空闲判断依据如果只有2个核心忙说明是写入IO线程不够这是InfluxDB默认配置的通病高并发写入时的典型表现-4-7。2.2、解决方案根本原因高序列基数现象SHOW SERIES CARDINALITY返回的数字非常高。原因你的数据结构设计有问题。可能是将日志信息、唯一ID、用户手机号等高可变性的信息作为了标签导致序列数量爆炸式增长占满内存解决方案这是需要优先排查和解决的问题。识别“罪魁祸首”运行Flux查询统计每个标签的唯一值数量找出那个值比其他标签高几个数量级的标签。优化数据结构将高基数的标签改为字段field。字段不会被索引因此不会消耗那么多内存。如果必须作为标签需要重新审视业务场景看是否能通过合并或聚合来降低基数。清理旧数据如果某些高基数数据不再需要可以考虑直接删除整个存储桶bucket或特定时间范围的数据。根本原因IO线程不足写入瓶颈现象运行top -H后发现只有2个CPU核心满载其他核心空闲。原因InfluxDB处理网络写入请求的IO线程数默认只有2个。在写入并发较高时这2个线程会成为瓶颈不仅CPU利用率上不去内存也可能因为请求堆积而升高。解决方案调整启动配置增加IO线程数。例如如果你的服务器有16核可以尝试设置为2.3、其他原因若以上两个命令输出结果都是正常的话那要考虑是否改动了什么导致的我的原因是废弃的服务器里面的采集服务(之前关闭的)开启了导致采集数据量加倍二、tdengine实践文档一、创建超级表和存库1、创建历史和报警数据超级表--历史数据超级表 CREATE STABLE tjdk.udf(ts timestamp,val float,standval float,maxval float,minval float,states int,outMaxVal float,outMinVal float) TAGS (head_code nchar(20),acq_point nchar(20)); --报警数据超级表 CREATE STABLE tjdk.alaudf(ts timestamp,val float,standval float,maxval float,minval float,states int,outMaxVal float,outMinVal float) TAGS (head_code nchar(20),acq_point nchar(20));2、自动创建表存库msg.sql insert into ; const dbname tjdk;//数据库名称 Object.entries(msg.rtdata).forEach(function ([key, v]) { let tname dbname . msg.head_code _ key; msg.sql tname using dbname .udf tags( msg.head_code , key ) values(now,; msg.sql v[0] ,; msg.sql v[1] ,; msg.sql v[2] ,; msg.sql v[3] ,; msg.sql v[4] ,; msg.sql v[5] ,; msg.sql v[6] ); }); msg.payload msg.sql ;; return msg;二、查询语句集合1、分组条件查询SELECT last(*) from gw_test.udf where ts now-10m and head_code in (thDev,noiceDev,airDev,preDev) GROUP by head_code,acq_point;3、联合查询需求 一次获取超级表下面几个子表联合数据SELECT a.val as v1,b.val as v2 from tldk.jy01_temp a,tldk.jy01_rev b where a.ts b.ts and a.ts now -3m;返回数据格式{ res: true, count: 18, data: [ { v1: 418.6, v2: 10.974856 }, { v1: 417.8, v2: 10.993713 }, { v1: 416.6, v2: 10.996858 }, { v1: 416.4, v2: 11.006286 }, { v1: 416.2, v2: 11.003141 }, { v1: 415.8, v2: 10.993713 }, { v1: 414.8, v2: 11.018857 }, { v1: 414.7, v2: 10.981142 }, { v1: 415.4, v2: 10.984286 }, { v1: 414.6, v2: 11.006286 }, { v1: 414.4, v2: 11.025143 }, { v1: 413.6, v2: 11.028285 }, { v1: 413.1, v2: 11.025143 }, { v1: 417.1, v2: 11.037714 }, { v1: 421, v2: 11.050285 }, { v1: 421.2, v2: 11.07857 }, { v1: 419, v2: 11.069143 }, { v1: 417.1, v2: 11.040856 } ] }4、GROUP BY 查询的 LIMIT/OFFSET 作用于分组内部而非全局结果集**错误原因**在tdengine中GROUP BY 查询的 LIMIT 和 OFFSET 作用于**每个分组内部**这里是每个 60 秒时间窗口而非全局结果集。因此当存在多个时间窗口时返回数据量为 窗口数 × LIMIT而非预期的全局总行数。**正确做法**使用子查询将聚合结果先计算出来再在外层应用全局 LIMIT/OFFSET。SELECT * FROM ( SELECT last(val) AS val, last(iwtemp) AS iwtemp, last(diff) AS diff, last(diffmax) AS diffmax, last(diffmin) AS diffmin, last(states) AS states, ts FROM tldk.alatemp WHERE ts 2026-01-05 00:00:00 AND ts 2026-01-06 20:00:00 GROUP BY acq_point, time(60s) ORDER BY ts DESC ) LIMIT 2 OFFSET 45、设备OEE计算计算机头当天的【有效开机时间】和【运转率】 ① 查数据库统计有效数据条数 从数据表中统计 当天、线速度 200 的记录数量 sql SELECT count(*) FROM table WHERE ts 当天 AND val 200 → 得到 有效采集点数acq_num ② 查采集频率 查最后一条数据的时间间隔知道 多久采一次数据 sql SELECT diff(ts) / 1000 FROM tljx.${msg.head_code}_ssxr ORDER BY ts DESC LIMIT 1; ③ 计算机头 OEE 运转指标 有效运转率rate 有效开机时间effTime 无效时间ineffTime 2. 最终算出 4 个结果 acq_num 当天线速度 200 的有效数据条数 rate 有效运转率0~1保留两位小数 effTime 当天有效开机时间单位分钟 一天最多 1440 分钟 ineffTime 当天无效停机时间1440 - 有效时间 3. 计算公式超级简化版 plaintext 有效运转率 有效数据条数 / 当天理论应采集总条数 有效开机时间 运转率 × 1440 分钟 无效时间 1440 - 有效时间6、批量插入数据时时间戳重复导致只存最后一条时间戳是数据库的主键必须唯一。批量插入时如果全部用NOW所有数据时间戳都一样数据库会自动覆盖最后只留下一条记录。// 在 Node-RED 的 Function 节点中使用 function saveDeviceStatusToTD(data) { let insertSql INSERT INTO tldk.device_status_detail (ts, headCode, head_type, param_type) VALUES ; let valuesArr []; const baseTs Date.now() - 8 * 60 * 60 * 1000; let offset 0; for (const key in data) { const param_type key.includes(normalDev) ? 1 : 2; const head_type key.includes(udf) ? 1 : 2; for (let headCode of data[key]) { headCode headCode.length 1 ? headCode 炉 : headCode; headCode headCode.toUpperCase(); // 使用基准时间 偏移量确保每条记录时间戳不同 valuesArr.push((${baseTs offset}, ${headCode}, ${head_type}, ${param_type})); offset; } } insertSql valuesArr.join(, ); return insertSql; }7、DISTINCT对单个或多个数据列进行去重SELECT DISTINCT headCode FROM tldk.device_status_detail WHERE ts NOW - 1d AND head_type 1 AND param_type 1;四、数据库数据迁移1、数据库迁移把windows上的tdengine数据迁移到linux系统的tdengine库1.1、taosdumptaosdump -H 127.0.0.1 -u root -p taosdata -D tjdk -S 2026-02-01 00:00:00 -E 2026-03-08 23:59:59 -o C:\juxin\td_backup1.2、程序读取旧库存新库[ { id: bd6adaa5521b32c0, type: taos-query, z: f6f2187d.f17ca8, server: bb86570570d747eb, database: tjdk, sql: , x: 540, y: 340, wires: [ [ adce2ab7a8392fbf ] ] }, { id: 63b02d7acafba141, type: function, z: f6f2187d.f17ca8, name: sql, func: msg.head_code y902;\nmsg.acq_point msg.acq_points[msg.a];\nmsg.payload \n select * from ${msg.head_code}_${msg.acq_point} ;\n;\nreturn msg;, outputs: 1, timeout: 0, noerr: 0, initialize: , finalize: , libs: [], x: 350, y: 340, wires: [ [ bd6adaa5521b32c0 ] ] }, { id: adce2ab7a8392fbf, type: function, z: f6f2187d.f17ca8, name: res, func: msg.res msg.payload;\nreturn msg;, outputs: 1, timeout: 0, noerr: 0, initialize: , finalize: , libs: [], x: 730, y: 340, wires: [ [ 769962b26edf7b37 ] ] }, { id: 769962b26edf7b37, type: array-loop, z: f6f2187d.f17ca8, name: loop, key: r, keyType: msg, reset: false, resetValue: value-null, array: res, arrayType: msg, x: 890, y: 340, wires: [ [ e9603cb7d3a5f412 ], [ 2634b5563b822a61 ] ] }, { id: 2634b5563b822a61, type: function, z: f6f2187d.f17ca8, name: insert, func: const d msg.res[msg.r];\nconst ts getTime(d[0]);\nmsg.payload insert into tjdk.${msg.head_code}_${msg.acq_point} using tjdk.udf tags(${msg.head_code},${msg.acq_point}) \n values(${ts},${d[1]},${d[2]},${d[3]},${d[4]},${d[5]},${d[6]},${d[7]});;\nreturn msg;\nfunction getTime(utc){\n// 一步到位转时区 去掉T和Z\nconst res new Date(new Date(utc).getTime() 8 * 3600 * 1000).toISOString().replace(/T|Z/g, ).trim();\nreturn res;\n}, outputs: 1, timeout: 0, noerr: 0, initialize: , finalize: , libs: [], x: 850, y: 460, wires: [ [ 886893fdf3103991 ] ] }, { id: 886893fdf3103991, type: taos-query, z: f6f2187d.f17ca8, server: 216d9e608a07b6fd, database: tjdk, sql: , x: 1020, y: 460, wires: [ [ 769962b26edf7b37 ] ] }, { id: d0493f165da6620d, type: inject, z: f6f2187d.f17ca8, name: , props: [ { p: payload }, { p: topic, vt: str } ], repeat: , crontab: , once: false, onceDelay: 0.1, topic: , payload: , payloadType: date, x: 170, y: 240, wires: [ [ ca1fdb09be40fde9 ] ] }, { id: ca1fdb09be40fde9, type: function, z: f6f2187d.f17ca8, name: acq_points, func: msg.acq_points [\rev\,\temp\,\electricity\,\boilflow1\,\boilflow2\,\botemp\,\gctemp\,\uwttemp\,\pwttemp\,\crwflow\,\sbflow\,\eciwtemp\,\ecowtemp\,\ectflow\,\ecpflow\,\citemp\,\trtemp\,\tcatemp\,\pcatemp\,\vsxzl1\,\ssxr1\,\vsxzl2\,\ssxr2\,\cww2\,\ewyield\,\psizea\,\psizeb\,\psizec\,\psized\,\motorp\,\motorr\,\ttemp\,\ptemp\,\pdtemp1\,\pdtemp2\,\irwtemp\,\pre\]\nreturn msg;, outputs: 1, timeout: 0, noerr: 0, initialize: , finalize: , libs: [], x: 350, y: 240, wires: [ [ e9603cb7d3a5f412 ] ] }, { id: e9603cb7d3a5f412, type: array-loop, z: f6f2187d.f17ca8, name: , key: a, keyType: msg, reset: false, resetValue: value-null, array: acq_points, arrayType: msg, x: 580, y: 240, wires: [ [], [ 63b02d7acafba141 ] ] }, { id: bb86570570d747eb, type: taos-config, host: 192.168.131.69, port: 6041, username: root, password: taosdata }, { id: 216d9e608a07b6fd, type: taos-config, host: 192.168.131.125, port: 6041, username: root, password: taosdata } ]五、docker安装redis现在docker镜像资源被禁用了所以我从已经安装redis的docker容器里面导出镜像导出镜像的命令如下docker save -o redis.tar swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/redis:7.2.6把镜像下载下来上传到要安装redis的linux服务上[rootlocalhost ~]# cd /home/juxin/ [rootlocalhost juxin]# docker load -i redis7.2.0.tar 511780f88f80: Loading layer [] 77.81MB/77.81MB 90413ed13ba6: Loading layer [] 11.26kB/11.26kB c44e5d4e8bf9: Loading layer [] 4.151MB/4.151MB ae989b5eb6a6: Loading layer [] 60.17MB/60.17MB f9e931d9415a: Loading layer [] 2.048kB/2.048kB 6b45f041a0f4: Loading layer [] 4.096kB/4.096kB Loaded image: redis:latest [rootlocalhost juxin]#启动容器[rootlocalhost juxin]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE node_red4.0.3 latest 6f7c5546526e 8 months ago 760MB redis latest 506734eb5e71 2 years ago 138MB [rootlocalhost juxin]# [rootlocalhost juxin]# [rootlocalhost juxin]# docker run -d --name redis -p 6379:6379 -v /data/redis/data:/data redis:latest redis-server --appendonly yes 57cee3e8d81b67c3e32cf30182a31d8510e6b48167553cc8cc80747003dfc621