论数据分片技术及其应用

356 阅读7分钟

说明:这是我在备考软考高级时写的练习论文,仅供参考。如有不当之处欢迎指正及讨论

摘要

我所在的单位是国内一家民营工业制造企业,作为单位的技术骨干之一,我从2020年7月开始主持了我司工业互联网云平台的开发。随着工业互联网的发展,为了进一步提高能效,优化成本,需要通过工业互联网云平台来实现工业设备的数字化,生产过程的数字化。我司有大量的工业生产设备,包括仪表,开关和各类传感器等,这些工业设备每天都产生了大量的数据。平台主要使用redis存储实时数据,使用Clickhouse存储历史数据。对于实时数据通过hash实现数据分片,对于历史数据,通过时间范围实现数据分片,在这个项目里我们按每个月一个数据分片。经过一段时间的测试及设备数据实际接入运行,目前的数据分片技术能够满足我司当下在工业务互联网领域的数据分片存储及及时有效读取的需求。但在数据压缩,成本控制上,还需要进一步优化。

正文

我司是一个集团公司,旗下有众多的传统制造业企业,随着产业升级及工业互联网近年来的发展,为了更好的提高效能,提高产品品质,降低生产成本,公司组建了云平台研究院,重点研究工业互联网,打造企业自己的工业互联网平台,促进产业的全面数字化转型。

我司从2020年7月开始打造工业互联网平台,平台支持多租户,多项目。主要的功能包括:1)数据接入:支持MQTT,COAP,HTTP等协议的数据接入,支持通过界面配置实现协议内容解析,支持设备远程控制。2)数据分析:支持大数据分析,支持数据统计分析3)数据可视化:支持拖拽的方式生成可视化大屏,支持设备实时数据,历史数据可视化查看。4)自动表单流程,支持快速的自动表单,同时可以定义表单流程。

   在项目中,我作为承担了需求分析,架构设计及部分代码开发的工作。我和产业公司的同事沟通他们在实际生产过程中遇到的问题,整理成平台的需求。基于需求的基础上设计平台的技术架构。

对于工业互联网平台,数据是重中之重。集团的工业设备有数百万,设备发送的数据量非常大,数据分片是平台必须处理好的需求。Hash分片,一致性Hash分片和按照数据范围分片是三种常用的数据分片方式。Hash分片是指按某个业务标识的哈希值范围,把数据分成不同的分片,比如取设备ID的哈希值,对数字3取模,就可以把数据分成3个分片。一致性Hash分片,是在哈希的基础上,增加一个哈希值与物理存储的映射,便于扩展;还是以设备ID为例,我们可以对设备ID的哈希值此,对数字256取模,然后我们定义0-84属于第一分片,85-169属于第二分片,170-255属于第三分片。如果我需要增加一个分片,则可以从原来的三个分片中,各抽取一部分映射到新的第4分片,减少因分片数量调整而需要迁移的数据量。按数值范围分片是指不同的数值大小,按一定的区间分开存储。比如按时间来分片,每年一个分片或者每月一个分片。

对于我们平台而言,设备实时数据是一个重要的数据,我们需要快速的查找设备的多个实时数据,比如我们需要在一个大屏上,看到各个逆变器(一种光伏发电设备)的实时发电功率。实时数据的存储量相对历史数据而言,需要的存储空间要小,对于每个设备的每个点位,只需要存储一个最新值。这里的一个点位是指设备的一个测量值,比如设备的电压是一个点位,电流也是一个点位。经过选型比较,我们选择了Redis做为实时值的存储中间件。Redis是一个开源的,优秀的基于Hash算法的内存存储中间件。对于实时数据的存储,我们按对点位标识取哈希,再对数字256取模,然后按范围分成0-84,85-169,170-255分为三个分片。对应了三组redis服务器,每一组redis服务器,为了提高可用性,我们采用了master-slave架构。

接下来我们看历史数据的处理。一个工业设备通常会隔一段时间,发送一次设备的当前状态。比如逆变器会每隔5分钟发送一次当前电流到服务器。我们把这些保存下来,就可以查看这个逆变器一天的历史电流曲线。这样的数据有两个特点:1)它是不可变更的,某一个时间点,它的值一经测定,就不会再发生变化。2)它是按时间递增的,而且每一个时刻只会有一个值。基于上述两个特点,这一类数据特别合适按时间范围来分片,我们在项目时采用的就是按时间来分片,每个月一个数据分片。实现上我们采用了 Clickhouse数据库集群。Clickhouse是一个开源的基于列式存储的数据库,它有以下特点:

1)已添加到数据库的数据不能修改。

2)对于读取,从数据库中提取相当多的行,但只提取列的一小部分。

3)宽表,即每个表包含着大量的列

4)查询相对较少(通常每台服务器每秒查询数百次或更少)

5)列中的数据相对较小:数字和短字符串

6)处理单个查询时需要高吞吐量

7)事务不是必须的

8)对数据一致性要求低

基于上述特点,它特别合适用来存储历史数据。而且它支持按时间分片。

上述数据分片方案实施下来,效果明显,无论是数据写入还是数据读取都能做到高效可靠。在项目初期,redis只用了单节点的存储方案,出现过单节点故障导致的数据丢失及不可用的情况,后来采用了 master-slave结构,提高了可用性的保障。在项目实施过程中出现过一次历史数据响应时间特别慢的情况,超过8秒。后来经过排查发现,有一个表由于配置失误,没有采用按时间字段分片,导致部分请求响应时间过长,经过时间分片后,减少了数据检索行数,大大提升了响应时间。

总的来讲数据分片在工业互联网有着实在的实际应用,也能解决生产过程中遇到的实际问题。通过数据分片能够有效的处理数据的写入及查询问题。