1、223移动扫码阅读CoalMines,2023.54(8):223-227ZHANG Hongliang.Design of high density data acquisition system based on NoSQL databaseJ.Safety in张洪亮.基于NoSQL数据库的度数据采集系统设3):223-227.SafetyinCoalMinesAug.20232023年8 月煤药发全No.8Vol.54第8 期第54卷D0I:10.13347/ki.mkaq.2023.08.030基于NoSQL数据库的高密度数据采集系统设计张洪亮1,2(1.中煤科工集团沈阳研究院有限公
2、司,辽宁抚顺11312 2;2.煤矿安全技术国家重点实验室,辽宁抚顺11312 2)摘要:针对目前大部分工矿企业都在数字化转型,数字化后的安全生产监控数据具有实时性强,数据体量庞大等特点,部分系统的数据量如钢丝绳探伤系统每秒钟高达几十万条,常用的SQL数据库已经无法胜任如此庞大的数据存储、分析任务。研究通过NoSQL数据库、负载均衡、多线程、SOCKET等技术体系,构建基于NoSQL的具备高并发、高密度数据处理能力的高密度数据采集系统;实现工矿企业安全生产相关数据的高密度接入,满足高密度数据采样周期的硬性需求。关键词:NoSQL;SOCKET;高密度;高并发;负载均衡;多线程;监控数据中图分类
3、号:TD679文献标志码:B文章编号:10 0 3-49 6 X(2023)08-0223-05Design of high density data acquisition system based on NoSQL databaseZHANG Hongliangl:2(1.China Coal Technology and Engineering Group Shenyang Research Institute,Fushun 113122,China;2.State Key Laboratory of Coal Mine Safety Technology,Fushun 113122,C
4、hina)Abstract:In view of the fact that most industrial and mining enterprises are in digital transformation at present,the digitizedsafety production monitoring data has the characteristics of strong real-time and huge data volume.The data volume of somesystems,such as steel wire rope flaw detection
5、 system,is up to several hundred thousand pieces per second.The commonly usedSQL database has been unable to cope with such a huge data storage and analysis task.A high-density data acquisition systemwith high concurrency and high density data processing capability based on NoSQL is constructed thro
6、ugh NoSQL database,loadbalancing,multithreading,SOCKET and other technical systems.The system realizes the high-density access of safety productionrelated data of industrial and mining enterprises,and meets the hard demand of high-density data sampling cycle.Key words:NoSQL;SOCKET;high-density;high
7、concurrency;load balancing;multi-threading;monitoring data作为工矿企业的数字化,在安全监控领域的应用更加广泛,伴随着各类传感器的飞速发展及测量精度的不断提升;所需采集的数据量也以几何级数增长,秒级的数据采集量甚至高达几十万条;并且要实时存储、实时显示与历史数据分析等。面对如此庞大的数据体量,使用常规的数据处理手段很难从容应对。通常开发的各类系统大多使用SQL关系型数据库进行数据的存储,由于关系型数据库具有规范的SQL语法结构对数据库进行操作,能够帮助开发人员快速构建数据模型、关系模型,轻松实现各类信息化系统的构建,SQL的优势即在于此;
8、然而面对每秒几十万条的数据存储,SQL会先得力不从心,会出现存储延迟,并且逐步累积大量待处理数据,最终导致内存溢出。为了解决此问题,只能另辟蹊径,将与SQL截然不同的NoSQL数据库作为重点的研究目标,用以解决该类问题。收稿日期:2 0 2 3-0 5-2 9责任编辑:李力欣基金项目:中煤科工集团沈阳研究院有限公司重点资助项目(SYZD-2023-03)作者简介:张洪亮(19 8 0),男,辽宁葫芦岛人,副研究员,学士,从事煤矿安全相关系统软件技术工作。E-mail:224Safety in Coal MinesAug.20232023年8 月No.8Vo1.54煤砺发全第8 期第54卷NoS
9、QL数据库并没有对应固定用于保存数据的结构化数据表,从技术上讲,所有非关系型数据库统称为NoSQL数据库。不同于关系型数据库,NoSQL数据库不但可以被快速地构建,并且只需极少量的预先设计(pre-planning)。常见的NoSQL数据库有MongoDB、D y n a mo D B、Si mp l e D B、Co u c h D B、CouchBase、O r i e n t D B、In f i n i t e G r a p h、Ne o 4j、Fl o c k D B、Cassandra、以及HBase等。NoSQL的优势:查询速度:由于NoSQL查询是非规范化的,而特定查询所需的
10、所有信息通常会被存储在一起,因此开发者能够对正在处理的大量数据进行轻松地查询,无需担心出现重复的数据,同时,NoSQL对于简单查询的响应也非常快;高可用性:对于NoSQL数据库而言,由于数据可分布在不同的区域和多个服务器上,因此,NoSQL数据库不但消除了单点故障,减少了停机时间,而且更具有扩展性、稳定性及持续可用性;敏捷:NoSQL数据库通过为开发人员提供了足够的灵活性,以协助提高他们的生产力和创造力,它们不但不会受到行和列的约束,并且其模式也不需要预先定义。此外,由于NoSQL数据库是动态的,因此它可以处理包括:多态化、半结构化、结构化及非结构化等各种类型的数据。应用程序开发人员可以直接构
11、建并开始使用NoSQL数据库,而无需花费精力和时间去进行前期规划;当需求发生变化或需要添加新的数据类型时,它能够按需修改,以满足不同数据类型和不断变化的功能需求I-51系统总体架构及关键技术1.1总体架构以钢丝绳无损探伤为例进行数据采集系统的设计,首先进行NoSQL数据库的选型,不同的NoSQL数据库适合处理的数据类型也不尽相同,例如:MongoDB数据库适合处理文档型数据,Redis适合处理键值型数据,GraphDB适合处理图形数据。因此,首先需要考虑数据类型和应用场景,选择最适合的NoSQL数据库。NoSQL数据库通常适合存储海量数据和半结构化数据。如果数据量非常大,需要考虑分布式存储和分
12、布式计算能力;如果数据结构非常复杂,需要选择支持复杂数据结构的NoSQL数据库,例如支持图形数据结构的GraphDB。数据一致性方面,由于NoSQL数据库通常采用分布式架构,数据一致性成为一个重要问题。不同的NoSQL数据库采用不同的数据一致性模型,例如,CAP定理的AP模型、CP模型和CA模型,需要根据自已的应用场景选择最适合的数据一致性模型。性能方面,NoSQL数据库通常具有高性能和高可扩展性的特点,但不同的数据库在性能方面有所差异,需要考虑读写性能、响应时间和吞吐量等指标,选择最适合自已应用场景的NoSQL数据库。钢丝绳无损探伤高密度数据采集系统需要将每次采集的数据值、状态、时间等信息存
13、入数据库,同时需要单次存人多个数据点的数据,考虑通过IList这样的数据结构一次存人采集到的所有数据,MongoDB数据库比较适合处理此种类型的数据,因此选用MongoDB数据库作为数据存储介质,具有存储速度快的特点。那么为何不选用时序数据库作为存储介质呢,因为钢丝绳探伤系统的数据值跟钢丝绳的测量距离密切相关,而非时间,因此时序数据库在本系统发挥不出它的优势,因此选用MongoDB数据库 6 1.2关键技术关键技术涉及并发编程技术、SOCKET数据通信技术、数据缓存技术、NoSQL数据存储技术等 7-8 。1.2.1并发编程技术线程是一个独立的运行单元,每个进程内部有多个线程,每个线程可以各自
14、同时执行指令。每个线程有自已独立的栈,但是与进程内的其他线程共享内存。在.NETFramework中,可以通过ThreadState属性获取线程的执行状态,ThreadState以按位计算的方式组合状态层,每种状态层的成员之间都是互斥的。线程状态关系图如图1。WaitSleepJoin线程释放线程Abort阻止阻止StartAbortUnstartedRuningAbortRequestedResetAbort线程仅为结束线程推测结束StoppedAborted图1线程状态关系图Fig.1Thread state diagram1.2.2SOCKET数据通信技术SOCKET技术是网络编程的基础
15、,是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进225Safetyin CoalMines2023年8 月Aug.2023No.8Vol.54煤矿发全第8 期第54卷程在网络中通信。是不同应用程序之间,网络设备与上位机间传输数据的主要技术手段。SOCKET通信模型如图2。应用程序应用程序套接字套接字UDPTCPUDPTCPIP通信信道IP图2SOCKET通信模型Fig.2SOCKET communication model1.2.3数据缓存技术系统使用线程安全高效的队列Concurren-tQueue对数据进行缓存处理,在普通的非线程安
16、全队列中有2 种实现方式:使用数组实现循环队列;使用链表实现队列。这2 种实现方式都不适合多线程:使用数组实现的当队列存储满的话,无法继续存储,扩容困难,需要重新开辟新空间,内存开销过大,尤其是在并发的程序中,对程序性能很受影响;使用链表的实现方式,虽然消除了空间浪费但是有增加了GC的压力,当人队时会分配一个新节点,出队时需要废弃,性能不高。而对于ConcurrentQueue而言,它使用了分段存储的概念,ConcurrentQueue分配内存时以段(Seg-ment)为单位,里面有对应的指针和初始的长度数组,这种分配内存的实现方式不但可以减轻GC的压力,而且调用者不需要实时显示的调用Trim
17、To-Size()来回收内存,在某段内存为空的时候,GC则会主动回收 9-10 1.2.4NoSQL数据存储技术NoSQL数据存储模式主要涉及数据库建立的存放数据的逻辑结构,基本的数据增、删、改、查等操作,数据处理对象,以及在分布式状态下的一些处理方式。主要包括:键值(key-value)、文档(Docu-ment)、列族(ColumnFamilies)、图(Graph)4种存储模式。1)键值存储模式的数据库有redis、m e m c a c h e d等,其特点是基于内存进行数据处理,存取数据最快;数据存储结构也最简单,只有key-value对形式,对值的查询统计功能支持很弱,由于基于内存
18、数据处理,数据持久性相对弱。redis具备大数据管理能力(主从管理模式);事务处理能力较弱2)文档模式的数据库有MongoDB、Co u c h b a s e 等,其特点是:MongoDB基于硬盘进行数据处理,速度比SQL数据库提高十几倍;Couchbase基于内存处理。两者都具有很强的横向扩展能力;文档数据库的值具备复杂文档结构数据的处理能力,查询统计性能相对比键值数据库要强;具备大数据处理能力,无事务处理能力。3)列族模式数据库有Cassandra、H Ba s e 等,其特点是基于硬盘进行数据处理,由于主要面向大数据存储,写速度明显比读速度要快,整体读写速度较键值数据库、文档数据库要慢
19、;具备强大的数据查询统计功能,无事务处理能力。4)图模式数据库有Neo4j、O r i e n t D B等,其特点是基于硬盘进行数据处理,侧重图数据查询计算。2系统设计基于NoSQL数据库技术的高密度数据采集系统总体上使用.NetFrameWork框架进行分层设计,每个层次基于C#语言进行开发。大体分为数据采集层、协议解析层、数据缓存层、数据存储层。单机CPU应满足i7配置,逻辑线程不低于2 0,内存不小于16 G的配置要求。为满足钢丝绳运转速度3m/s的探伤检测要求,保证不漏检。数据的采样频率应不低于50 0 次/ms,那么每秒钟需要50 万次的数据采样需求。同时数据采集系统需对采集上来的
20、高密度数据进行实时处理,包括数据的协议解析、数据统计分析、数据推送前端实时显示、数据人库等操作。2.1数据采集层数据采集层将采用基于SOCKET的UDP方式进行数据的接收,能够快速接收发来的数据;同时开启1个数据接收线程,只负责数据的接收任务。同时UDP开启本地指定的端口监测,配合线程的数据接收。接收到的数据不做任何处理,保证高密度的数据能够全被接收而不丢失,只保存到系统的一级缓存中,等待处理。防止数据出现堵塞、数据丢失等问题。数据读取线程代码如下:private void ReadData(object obj)while(true)try226SafetinCoal MinesAug.20
21、232023年8 月No.8Vol.54煤码发全第8 期第54卷if(stop)return;/根据是否收到信号判断是否阻塞当前线程maDataRead.WaitOne();ReadDatalmp(O):catch(Exception ex)log.Error(ex.StackTrace);finallyThread.Sleep(sleepTime);2.2数据缓存层为了防止数据的堆积、堵塞,设计缓存层起到一定的缓冲作用,有效防止数据的丢失、堵塞。首先第一级缓存设在接收到数据之后。解析之后的数据进行二级缓存,供前端进行曲线的实时绘制显示,防止前端实时显示出现卡顿、数据丢失等问题,起到一定的缓冲
22、作用。数据一级缓存代码如下:public override void DataDeal(bytel bytRecv)/数据开始一级缓存switch(bytRecv1)case 0 x04:/数据if(dataType=DataType.Start Work)recvData.Enqueue(bytRecv);break;default:break;2.3协议解析层钢丝绳感知端数据采集设备与上位机之间通过UDP按照一定的协议格式进行数据的主动上传,数据协议主要分为上传数据协议和下发命令协议数据。新建1个数据处理线程,实时对一级缓存的原始数据进行解析,同时验证CRC16是否一致,不一致则抛弃。通过
23、协议解析得到每个采集周期的监测值、状体、钢丝绳所处距离等。协议数据解析代码为:byte lvaluel=new byte i newDataArrayi,new-DataArrayi+1 h;byte lvalue2=new byte newDataArray i+2,newDataArrayi+3;float voltage1Value=DataConversion.TwoByteToFlo-at(value1)*100;float voltage2Value=DataConversion.TwoByteToFlo-at(value2)*100;/当前点校正之后的距离(毫米)double d
24、istance=testDistance+startTestNum*poin-tTestDistance;2.4数据模型考虑到数据需要批量地存储,并能保证数据的可读性,采用二维数组方式进行数据的存储,每个子数组存储3个数值,分别为监测值1、监测值2、距离值叫)private double,datas=new double10000,3;datasindex,O=voltage1 Value;datasindex,1=voltage2Value;datasindex,2=distance;2.5数据存储层首先将datas数据转存到IList集合,数据存储集合代码如下:private void a
25、ddDataToMongoDbCollection(IList colloction,double,data,lock(colloction)int n=data.GetLength(O);intl s=/0,0 ;Test test=new Test();test.Distanc=data0,2;test.EndDistanc=datan-1,2;test.Data=(double,J)data.Clone();test.CreateTime=DateTime.Now;colloction.Add(test);当集合数据数量达到设定值时,一次性将集合数据存MongoDB数据库。private
26、 void SaveCollectionToDataBase(IList colloction)SafetyinCoalMinesAug.20232023年8 月No.8Vol.54煤砺发全第8 期第54卷MongoDbHelper.InsertMany(colloction);该处存储采用异步任务的方式存储数据,避免数据存储时间超时,造成数据的堵塞、堆积Tasktask=new Task()=SaveCollectionToDataBase(c o l l o c t i o n l,“c o l l o ction1);return true;);task.Start();2.6数据前端实
27、时显示解析后的实时数据需同步实时显示,如此庞大的数据体量,能够实时同步显示需要前端曲线绘制极高的绘制性能,同时实时显示出本次检测的损伤数量以及前5处最重的损伤状态图。实时曲线同步显示如图3。h本次检测损伤数照24100100五处盟要损伤40002000150-MA3900+2001500m主井樱升(0 0 行检测人指伤满信500瑞放-12.00Y始位盟(mm)1/120.022020XX-新能增前123用长(mm/20)(RH)204096盈示方式扫式Y图3实时曲线同步显示Fig.3Real time curves synchronization display3结语基于NoSQL的高密度数据
28、采集系统,能够实现像钢丝绳探伤系统这样具有大体量数据的实时解析与处理。通过真实环境的反复试验、验证,该技术方案具有可行性,能够满足当下工况企业各类系统数据采集需求。参考文献(References):1Thomas ERL,Zaigham Mahmood,Ricardo Puttini.云计算:概念、技术与架构 M.龚奕利,贺莲,胡创,译.北京:机械工业出版社,2 0 14.2陈赤榕,叶新江,李彦涛,等.云计算和大数据服务一技术架构、运营管理与智能实践M.北京:清华大学出版社,2 0 2 2.3王柏生,谢广军.深度探索Linux系统虚拟化:原理与实现 M.北京:机械工业出版社,2 0 2 0.4
29、赵渝强.NoSQL数据库实战派:Redis+MongoDB+HBaseM.北京:电子工业出版社,2 0 2 2.5柳俊,周苏.大数据存储一从SQL到NoSQL(大数据系列丛书)M.北京:清华大学出版社,2 0 2 1.6香农布拉德肖(ShannonBradshaw).M o n g o D B权威指南 M.牟天垒,王明辉,译.北京:人民邮电出版社,2021.7马骏主.C#网络应用编程M.北京:人民邮电出版社,2 0 10.8易格恩阿格佛温EugeneAga.C#多线程编程实战 M.北京:机械工业出版社,2 0 17.9易哥.高性能架构之道:分布式、并发编程、数据库调优、缓存设计、IO模型、前端优化、高可用 M.北京:电子工业出版社,2 0 2 1.10于君泽.深人分布式缓存:从原理到实践 M.北京:机械工业出版社,2 0 18.11刘宏志.数据、模型与决策 M.北京:机械工业出版社,2 0 19.