InfluxDB为什么能成为排名第一的时序数据库?其一致性实现相比于其他时序数据库究竟有什么样的奥秘?本篇文章通过介绍常用时序数据库的一致性实现、业界通用的一致性实现,InfluxDB企业版的一致性实现来尝试解释这些问题。
一、时序数据库介绍
首先简单回顾下时序数据库,他是存储时序数据的数据库,比如按照时间顺序记录系统、设备状态变化等的数据,其应用场景主要来自监控,业务监控,性能监控,系统监控。常用时序数据库如下:

该图展示了时序数据库的搜索排行榜,可以看到influxdb是远大于第二名的,InfluxDB,在业界也有很多厂商在使用,包括ebay、IBM、CITRIX等。
在详细介绍InfluxDB企业版的一致性实现之前,我们先来看看其他时序数据库是怎么实现一致性的。
(1)OpenTSDB,其基于HBase实现,数据一致性实现依赖于HDFS,如下图所示

其数据的同步是按照pipeline一级一级往下写,全部写好以后再返回。

可见其同步效率并不高,需要将数据都同步到其他节点,才算写完成。
(2)Prometheus,他是一套带有时序数据库的监控系统,其并没有提供数据一致性实现。

我们需要通过部署多套服务实例,实现高可用,但自身没有实现远程存储,而是定义了两个标准接口,用来接入第三方存储

在实际环境中,Prometheus往往也会搭载Influxdb来实现数据的远程存储。
(3)NTSDB,网易云的时序数据库,

其一致性实现和InfluxDB企业版类似,这里不再赘述
下面轮到了我们的主角InfluxDB,首先介绍下1.X版本的架构

官方对于架构的介绍是TICK,即Telegraf负责数据采集,InfluxDB负责数据存储,Chronograf负责一些数据展示,Kapacitor为数据处理引擎

InfluxDB2.X版本将上面的ICK进行了整合。
二、InfluxDB企业版的一致性实现
InfluxDB将数据分为META节点和DATA节点,META节点用来存储关键信息,包括表名等信息,其采用CP模型,共识算法采用RAFT算法。DATA节点,用来存储数据信息,采用AP模型,也就是说DATA节点采用的是最终一致性。

一个节点接收到写请求时,需要将请求中的数据转发到其他节点,但可能存在网络等问题导致数据无法同步,比如上图的节点C,目前业界有几种转发策略,一种为Hinted-handoff。即如果写失败了,则将数据缓存在本地,然后周期性的重试:

重试的间隔、缓存的空间等等都是可以配置,但是周期性的重试仍然可能一直失败。这就导致了数据无法实现最终一致性。
针对这个问题,业界使用反熵来解决,集群中的节点每隔段时间随机选择某个其他节点,互相交换自己所有的数据来消除节点之间的差异。

交换方式有推、拉、推拉三种,像apollo就是使用推拉的方式。但是这有一个问题,就是节点之间的推拉完全是随机的,很有可能很长一段时间都还没同步完所有数据。
而InfluxDB的反熵实现是在反熵的基础上,增加了节点之间同步的顺序:

首先节点A对比修复节点B缺失的数据,然后节点B对比修复节点C缺失的数据,节点C对比修复节点D缺失的数据,节点D对比修复节点A的数据,然后还要把节点C、D的数据同步给B,所以需要再同步给B,以及将节点D的数据同步给C,所以需要再同步一次C。这样便能很快完成数据的同步。
InfluxDB另一个重大的特性是在最终一致性的基础上实现了强一致性,其基于Quorum NWR来实现
下面来介绍下Quorum NWR,其中N为同一份数据的副本数,W为写一致性级别,表示成功完成W个副本数后才算完成更新,R为读一致性级别,表示读取一个数据对象时需要读R个副本,然后选取最新的那个数据。
比如Data-2节点,N为3,代表在三个节点上都有副本,一般N不会大于节点数量,如果大于节点数量,在同一个节点上有多个副本,没有意义。

W为2,代表一定要写两个节点成功后才算更新成功,比如要写完节点A和节点C才算更新成功:

R为2,一定读取两个节点后才算完成,随后选取最新的一条数据

当W + R > N 时,对客户端来说,整个系统保持强一致性,当W + R <= N 时,对客户端来说,整个系统只保证最终一致性
或者说W = N时,读性能比较好。R = N时,写性能比较好
下面来看下InfluxDB的Quorum实现:
InfluxDB 实现四种 Quorum W 模型,any、one、quorum、all
any,任何一个节点写入成功后,或者节点写入失败,但是存入到缓存后,返回成功给客户端
one,任何一个节点写入成功后,返回成功给客户端
quorum,当大多数节点写入成功后,就会返回成功给客户端
all,所有写入成功后,就会返回成功给客户端
quorum实现如下:

all实现如下:

InfluxDB 为了保证读的效率,其Quorum R为1,当我们要实现强一致性时,需要选用Quorum W的all模型
QuorumNWR,也广泛应用在其他AP型的框架中,比如Cassandra,不同的是,其R有多种配置

作者:冯越新