本文通过对CnosDB数据库系统时钟故障的讨论,提出了在单机环境和集群环境中解决系统时钟故障的方案,具有非常重要的指导意义。
可能并不存在的情况引发的讨论
有一天,CnosDB实习生小邵在做时间乱序数据处理逻辑的设计,时序数据的产生一般有以下几个规律可以遵循:
1. 一般情况下,时序数据由一条条时间线组成,每一条时间线背后都是一个独立的数据源。
2. 时序数据的产生往往是实时的,时间线上的数据也是按照时间顺序排列的,大多数时序数据库的底层数据存储设计也基于此。
3. 在一些特殊的情况下,一条时间线上的时间顺序可能会被破坏,一段时间之前的数据可能现在才到达数据库;由于处理起来太过麻烦,一些数据库会拒绝这种数据写入。
问题出在“一些特殊的情况上”,小邵异想天开地提出了一个我没有想到过的可能情况:
1. 如果客户端发来的数据是没有时间戳的,那么数据的时间戳由数据库服务端的系统时间戳决定。
2. 如果数据库服务端的系统时钟发生了修改,比如本来是5点,调成了3点,就会出现时间乱序数据。
不得不说,这是比“一些特殊的情况”还要特殊的情况,而比较典型的时间乱序数据场景是这样的;一个远程设备不断向数据库端发送自带时间戳的数据,可能有两种情况出现:
1. 网络方面的故障,导致从设备发来的数据,并没有按照数据发出的时间到达。
2. 设备发出的数据在到达数据库前丢失或损坏了,设备在之后的时间里将这些数据重新发给数据库。
经过了一段时间的思考,我发现小邵说的那种情况,不应该放在时间乱序数据的问题里讨论,而是一个需要单独处理的问题。
系统时钟故障
相比于掉电宕机、网