物联网系统开发如何选择时序数据库
在很多物联网系统中,都需要对联网的设备进行监控,并对监控采样到的数据进行持久化。对采样数据进行持久化,其实很多年前在工业领域已经有专门的数据库来完成这个任务了。在工业领域,这个叫实时数据库。
工业领域的实时数据库具有数据采集、实时数据缓存、数据回写(向设备发送指令)、采样数据归档存盘等主要功能。目前工业领域实时数据库基本上被国外厂家所垄断,价格昂贵。以PI数据库为例,基础版本(只有5000个测点)就需要大约10万美元,每个数据采集接口需要6000美元。这个价格对新兴的物联网公司来说代价太大了。
幸好,最近几年IT公司针对IT设备运维提出了一种新型的数据库:TSDB,时序数据库。该数据库专门用来存储时序数据,物联网系统从设备上采集的数据就是一种时序数据,物联网系统完全可以用TSDB来存储设备采样数据。
目前国内大型互联网公司中的阿里巴巴、百度等已经进军物联网行业的公司都提供了云服务形式TSDB数据服务。如果你的物联网应用是运行在互联网上,并且服务器也是用了Alibaba或者百度的云服务,那么你完全可以采用他们的TSDB服务来保存系统中的时序数据。
但假如你的物联网应用是运行在封闭式的局域网或者专网中的,又该如何选择呢?
用搜索引擎搜索下 “tsdb”或者 “时序数据库”,你可以看到各种开源的时序数据库,我没有对各种开源时序数据库进行过详细对比,只是大致上看了下别人的评论。从评论来看InfluxDB应该是目前综合性能最好的,但是它的集群版是闭源的商业产品。OpenTSDB用的人也挺多,但是性能上比较差,写入速度波动幅度比较大。假如你的物联网系统需要保存历史数据的测点数量不超过5万,那么用InfluxDB应该是没问题的。
假如你想对各种TSDB做一个测试,并根据测试结果来选择,我的建议如下:
1、测试其写入速度,并关注写入速度的波动性。所有的TSDB在实现的时候肯定都用来内存来缓存写入速度的,它们需要在特定时机把缓存的数据写入到磁盘进行归档。所以,在考察写入速度的时候,一定要关注它在对内存数据进行归档化处理时候的写入速度。
2、在写入的同时测试其查询速度。因为物联网系统中设备时刻都在产生数据,你的每个查询都是和大量的写入操作同时执行的。
3、测试其数据完整性,前面我们提到tsdb在执行写操作时都是先写内存的,然后在特定时候归档到磁盘。 这样一来就存在"tsdb数据库正常关闭或者异常关闭时候 丢失数据"的可能性。作为tsdb的使用者,当然希望它关闭重启的时候尽可能少丢失已经写入的数据。
4、测试其在时序错位情况下的数据完整性,时序错位有两种情况:采样数据的时间和tsdb服务器当前时间有较大偏差;两个不同测点之间,几乎同时写入的数据,但被标记为不同的采样时间(有较大的时差);在这两种情况下,重启服务器后,测试其数据丢失情况。
5、测试其磁盘占用率,假如你的系统中连接了1000的设备,每个设备有10个测点,每个测点没秒钟持久化一次,那么你每天需要持久化的时序数据有864兆,每份数据最少包含一下内容:一个测点Id、一个时间戳、一个值。测点算它4个字节、时间戳8个字节、值4个字节。在不压缩的情况下至少需要13G磁盘空间。所以压缩性能是tsdb的一项关键指标。
6、了解其查询接口是否丰富,既然把这么多历史数据都保存下来,那当然是希望这些数据能发挥出其价值。一个强大的查询接口是这些数据发挥价值的前提条件。除了普通的按照时间和标签查询某些测点在某个时间段的所有值之外,我觉得tsdb还应该包括:降频查询(在时间轴上分组聚合),聚合查询(把一些测点按照某个算法计算相同采样时间点的值,可以在查询时聚合或者写入时聚合)。--------------------- 作者:spdata 来源:CSDN 原文:https://blogcsdnnet/spdata/article/details/79777672 版权声明:本文为博主原创文章,转载请附上博文链接!
物联网系统开发如何选择时序数据库
标签:垄断两种工业空间专网没有opentsdbpen10个
近期接到一个开发任务 业务方面不再详述 要求每天定时执行一段应用程序用来同步俩个数据库
正好近期一直在用spring做相关开发 尝试了下Quartz 感觉不错 目前也正在学习中
Quartz使用Trigger Job以及JobDetail等对象来进行各种类型的任务调度 Spring对其提供了很好的支持
建立一个时序调度程序的过程如下 ) 配置Job及JobDetail Bean 定义执行某个类里的特定方法 ) 配置Trigger Bean 定义触发JobDetail的时间规律 ) 配置SchedulerFactoryBean负责调度实际的Trigger 时序调度的运行模式有两种 ) 一种是在某个特定时间自动运行 例如每天凌晨 点备份数据 每月初 号统计上月的数据等 我们称之为定时调度
)另一种是在服务启动一段时间后开始运行 再每隔一段时间再次运行 如系统监控程序每个 分钟就要测试一下数据库是否连接正常 我们称之为重复调度
下面举出两个简单的范例 详细原理和配置方法请参考 Spring 官方文档和程序范例的ApplicationContext quartz xml 文件
一 定时调度参数配置是在每天的 : 的时间自动执行CronSimpleJob java 类中的 executeInternal()方法 在系统控制台上输 出日志内容
ApplicationContext quartz xml内容
view plaincopy to clipboardprint <bean id= scheduler class= springframework scheduling quartz SchedulerFactoryBean >
<property name= triggers >
<list>
<ref local= cronSimpleTrigger />
</list>
</property>
</bean>
! 定时简单JobDetail >
<bean id= cronSimpleJob class= springframework scheduling quartz JobDetailBean >
<property name= jobClass value= test quartz CronSimpleJob />
</bean>
<! 定时简单Trigger >
<bean id= cronSimpleTrigger class= springframework scheduling quartz CronTriggerBean >
<property name= jobDetail ref= cronSimpleJob />
<property name= cronExpression value= />
</bean>
<bean id= scheduler class= springframework scheduling quartz SchedulerFactoryBean >
<property name= triggers >
<list>
<ref local= cronSimpleTrigger />
</list>
</property>
</bean>
<! 定时简单JobDetail >
<bean id= cronSimpleJob class= springframework scheduling quartz JobDetailBean >
<property name= jobClass value= test quartz CronSimpleJob />
</bean>
<! 定时简单Trigger >
<bean id= cronSimpleTrigger class= springframework scheduling quartz CronTriggerBean >
<property name= jobDetail ref= cronSimpleJob />
<property name= cronExpression value= />
</bean>CronSimpleJob java文件内容
view plaincopy to clipboardprint package test quartz;
import mons logging Log;
import mons logging LogFactory;
import quartz JobExecutionContext;
import springframework scheduling quartz QuartzJobBean;
public class CronSimpleJob extends QuartzJobBean
{
private final Log logger = LogFactory getLog(getClass());
protected void executeInternal(JobExecutionContext context)
{
logger warn(getClass() getName() + out it! );
}
}
package test quartz;
import mons logging Log;
import mons logging LogFactory;
import quartz JobExecutionContext;
import springframework scheduling quartz QuartzJobBean;
public class CronSimpleJob extends QuartzJobBean
{
private final Log logger = LogFactory getLog(getClass());
protected void executeInternal(JobExecutionContext context)
{
logger warn(getClass() getName() + out it! );
}
}
二 重复调度 view plaincopy to clipboardprint 在服务器启动 毫秒即 秒钟后 调度程序首次执行 以后每隔 毫秒即 分钟再次执行
在服务器启动 毫秒即 秒钟后 调度程序首次执行 以后每隔 毫秒即 分钟再次执行 view plaincopy to clipboardprint 自动执行RepeatMethodJob java类中的testRepeatMethod()方法 在系统控制台上输出日志内容
自动执行RepeatMethodJob java类中的testRepeatMethod()方法 在系统控制台上输出日志内容 view plaincopy to clipboardprint 对于相同的JobDetail 当指定多个Trigger时 很可能第一个job完成之前 第二个job就开始了
对于相同的JobDetail 当指定多个Trigger时 很可能第一个job完成之前 第二个job就开始了 view plaincopy to clipboardprint 指定concurrent设为false 多个job不会并发执行 第二个job将不会在第一个job完成之前开始
指定concurrent设为false 多个job不会并发执行 第二个job将不会在第一个job完成之前开始 view plaincopy to clipboardprint ApplicationContext quartz xml内容
ApplicationContext quartz xml内容 view plaincopy to clipboardprint <! 逻辑bean >
<bean id= repeatMethodJob class= test quartz RepeatMethodJob />
<! 间隔方法JobDetail >
<bean id= repeatMethodJobDetail class= springframework scheduling quartz MethodInvokingJobDetailFactoryBean >
<property name= targetObject ref= repeatMethodJob />
<property name= targetMethod value= testRepeatMethod />
<property name= concurrent value= false />
</bean>
<! 间隔方法Trigger >
<bean id= repeatMethodTrigger class= springframework scheduling quartz SimpleTriggerBean >
<property name= jobDetail ref= repeatMethodJobDetail />
<property name= startDelay value= />
<property name= repeatInterval value= />
</bean>
<! 逻辑bean >
<bean id= repeatMethodJob class= test quartz RepeatMethodJob />
<! 间隔方法JobDetail >
<bean id= repeatMethodJobDetail class= springframework scheduling quartz MethodInvokingJobDetailFactoryBean >
<property name= targetObject ref= repeatMethodJob />
<property name= targetMethod value= testRepeatMethod />
<property name= concurrent value= false />
</bean>
<! 间隔方法Trigger >
<bean id= repeatMethodTrigger class= springframework scheduling quartz SimpleTriggerBean >
<property name= jobDetail ref= repeatMethodJobDetail />
<property name= startDelay value= />
<property name= repeatInterval value= />
</bean>view plaincopy to clipboardprint RepeatMethodJob java文件内容
RepeatMethodJob java文件内容 view plaincopy to clipboardprint <PRE class=java name= code >package test quartz;
import mons logging Log;
import mons logging LogFactory;
public class RepeatMethodJob
{
private final Log logger = LogFactory getLog(getClass());
public void testRepeatMethod(){
logger warn(getClass() getName()+ out it! );
}
}
</PRE> <PRE class=java name= code > </PRE> <PRE class=java name= code > </PRE> <PRE class=java name= code >关于cronExpression </PRE> <PRE class=java name= code ><IMG height= alt= src= width= ffan= done ></PRE> <PRE class=java name= code ><IMG alt= src= ffan= done ></PRE>
view plaincopy to clipboardprintpackage test quartz; import mons logging Log; import mons logging LogFactory; public class RepeatMethodJob { private final Log logger = LogFactory getLog(getClass()); public void testRepeatMethod(){ logger warn(getClass() getName()+ out it! ); } } package test quartz;
import mons logging Log;
import mons logging LogFactory;
public class RepeatMethodJob
{
private final Log logger = LogFactory getLog(getClass());
public void testRepeatMethod(){
logger warn(getClass() getName()+ out it! );
}
} view plaincopy to clipboardprint view plaincopy to clipboardprint view plaincopy to clipboardprint关于cronExpression 关于cronExpression view plaincopy to clipboardprint<IMG height= alt= src= width= ffan= done > view plaincopy to clipboardprint<IMG alt= src= ffan= done > view plaincopy to clipboardprint
lishixinzhi/Article/program/Java/ky/201311/28087
服务器内存也是内存,它与我们平常在电脑城所见的普通PC机内存在外观和结构上没有什么明显实质性的区别,它主要是在内存上引入了一些新的技术,普通PC机上的内存在服务器上一般是不可用的服务器认不到的,这就是说服务器内存不能随便为了贪便宜用普通PC机的内存来替代的原因了。
服务器内存:
有些人把具有某种技术的内存就称之为“服务器内存”,其实是不全面的,服务器的这些内存技术之所以在目前看来是服务器在专用,但不能保证永远只能是服务器专用。
这些新技术之所以先在服务器上得以应用是因为服务器价格较贵,有条件得以应用,这些新技术由于价格的原因暂时在普通PC机上无法实现应用,但是会随着配件价格的下降逐步走向普通PC机,就行原来的奇偶校正内存一样原先也是最先应用在服务器上,现在不是很普遍了吗所以服务器内存并不是一种特指,它是内存新技术在不同时间段上的应用。
普通PC内存:
:
1内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。
2内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
3内存是由内存芯片、电路板、金手指等部分组成的。
0条评论