随着时间的推移,我们对时间的精度要求越来越高。在计算机系统中,时间也是至关重要的一个因素。它不仅用于记录事件的发生时间,还用于计算处理时间,调度任务和维护系统时钟等。然而,即使计算机通常以秒为最小单位来处理时间,时钟的精度也可能受到一些不可控因素的影响。闰秒就是这样一种影响。
闰秒的定义
闰秒是国际原子时与世界时的差异导致的调整。国际原子时(T)是由几百个原子钟的平均频率计算出来的时间标准,而世界时(UTC)是基于地球自转的时间标准。由于地球自转速度不稳定,与原子时的差异会逐渐累积,因此闰秒的目的是将两个时间标准对齐。当UTC的距离T的偏差增加到0.9秒时,国际地球自转事务服务(IERS)组织会决定添加一个闰秒。此时,UTC的秒数将被调整为比T慢一秒。因此,在有些年份,一年可能有一秒钟比其他年份多。
闰秒对计算机系统的影响
在计算机系统中,每秒钟都是由系统时钟驱动的。当闰秒被添加时,会在系统时钟中添加一个额外的秒。然而,由于计算机时钟通常以 UTC 时间作为参考来运行,因此在添加闰秒后,计算机时钟将跳到下一秒,然后再倒退一秒。这可能导致计算机中的所有存储时间戳都向前或向后移动一秒。虽然这看起来不是很严重,但由于时间戳在数据库中具有极其重要的作用,因此这些变化可能会导致许多问题。
影响数据库查询结果的正确性
当闰秒添加到 UTC 时,数据库中的时间戳也会随之向后移动一秒。如果此时在添加闰秒的时候,一些数据库事务正在进行中,那么这些事务可能会因为时间戳变化而导致数据库操作失败或出现混乱。例如,如果某个事务在闰秒添加时正在写入数据库,它的时间戳就会比其它事务晚一秒。这样就有可能导致某些查询结果并不符合情况,比如一些日志或者事件的时间先后顺序错乱了。
影响数据库索引的正确性
闰秒对数据库索引的正确性也有影响。例如,如果某个数据库表的时间戳字段被用作索引,并且闰秒会导致时间戳跳过一秒钟,那么使用索引查询的结果就会不准确。这可能导致查询结果不完整,或者根本无法使用索引进行查询。这样,查询效率将大幅下降,也将延长数据库查询的响应时间。
影响数据库备份和恢复的过程
数据库备份和恢复是数据库系统中非常重要的环节。然而在闰秒出现时,它会影响数据库备份和恢复的过程,尤其是恢复的过程。例如,如果数据库备份被创建在闰秒添加的时候,那么恢复操作就可能无法恢复数据库到原有的状态。因此,管理员需要非常谨慎的备份数据库,并检查每个备份的时间戳是否与闰秒对齐。
如何解决
为了解决,有多种方法可以采用,例如:
使用NTP协议同步系统时间:网络时间协议(NTP)是一种用于同步计算机系统时钟的协议,可通过将计算机系统的时钟与更精确的时间源同步来协调系统时间。在闰秒出现时,通过使用NTP协议,可以允许计算机系统中的时间跳跃一秒,而不会对时间戳造成不利影响。
使用更高精度的时钟:使用更高精度的时钟可以提高计算机系统的时间精度,减少闰秒对时钟造成的影响。
使用可重复的时间戳格式存储数据:使用基于纪元的时间戳格式,例如Unix时间戳或微秒级时间戳,可以减少对与闰秒引起的不必要麻烦。
使用能够处理闰秒的软件或系统:特定的软件或系统可以处理闰秒的出现,从而减少对数据库的不利影响。
闰秒虽然只是一个微小的变化,但它可能对计算机系统和数据库产生重大影响。如果没有适当的准备和预防措施,可能会导致数据丢失,查询错误和备份失败等问题。因此,为了避免这些问题,必须做好对闰秒的正确理解和相应的预防工作。
相关问题拓展阅读:
分布式数据库中,数据分片有哪些策略?定义分片时必须遵守那些规则
答:数据分片有水平分片、垂直分片、导出分片和混合分片等四种方式。
数据分片时必须遵守三条规则:完备性条件,可重构条件,不相交条件。
以每24小时作为一份时间(而非自然日),根据用户的配置有两种工作模式:带状模式中,用户仅定义开始日期时,从开始日期(含)开始,每份时间1个分片地无限增加下去;环状模式中,用户定义了开始日期和结束日期时,以结束日期(含)和开始日期(含)之间的时间份数作为分片总数(分片数量固定),以类似取模的方式路由到这些分片里。
1. DBLE 启动时,读取用户在 rule.xml 配置的 sBeginDate 来确定起始时间
2. 读取用户在 rule.xml 配置的 sPartionDay 来确定每个 MySQL 分片承载多少天内的数据
3. 读取用户在 rule.xml 配置的 dateFormat 来确定分片索引的日期格式
4. 在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值(字符串),会被提取出来尝试转换成 Java 内部的时间类型
5. 然后求分片索引值与起始时间的差,除以 MySQL 分片承载的天数,确定所属分片
1. DBLE 启动时,读取用户在 rule.xml 配置的起始时间 sBeginDate、终止时间 sEndDate 和每个 MySQL 分片承载多少天数据 sPartionDay
2. 根据用户设置,建立起以 sBeginDate 开始,每 sPartionDay 天一个分片,直到 sEndDate 为止的一个环,把分片串联串联起来
3. 读取用户在 rule.xml 配置的 defaultNode
4. 在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值(字符串),会被提取出来尝试转换成 Java 内部的日期类型
5. 然后求分片索引值与起始日期的差:如果分片索引值不早于 sBeginDate(哪怕晚于 sEndDate),就以 MySQL 分片承载的天数为模数,对分片索引值求模得到所属分片;如果分片索引值早于 sBeginDate,就会被放到 defaultNode 分片上
与MyCat的类似分片算法对比
中间件
DBLE
MyCat
分片算法种类 date 分区算法 按日期(天)分片
两种中间件的取模范围分片算法使用上无差别
开发注意点
【分片索引】1. 必须是字符串,而且 java.text.SimpleDateFormat 能基于用户指定的 dateFormat 来转换成 java.util.Date
【分片索引】2. 提供带状模式和环状模式两种模式
【分片索引】3. 带状模式以 sBeginDate(含)起,以毫秒(24 小时整)为一份,每 sPartionDay 份为一个分片,理论上分片数量可以无限增长,但是出现 sBeginDate 之前的数据而且没有设定 defaultNode 的话,会路由失败(如果有 defaultNode,则路由至 defaultNode)
【分片索引】4. 环状模式以毫秒(24 小时整)为一份,每 sPartionDay 份为一个分片,以 sBeginDate(含)到 sEndDate(含)的时间长度除以单个分片长度得到恒定的分片数量,但是出现 sBeginDate 之前的数据而且没有设定 defaultNode 的话,会路由失败(如果有 defaultNode,则路由至 defaultNode)
【分片索引】5. 无论哪种模式,分片索引字段的格式化字符串 dateFormat 由用户指定
【分片索引】6. 无论哪种模式,划分不是以日历时间为准,无法对应自然月和自然年,且会受闰秒问题影响
运维注意点
【扩容】1. 带状模式中,随着 sBeginDate 之后的数据出现,分片数量的增加无需再平衡
【扩容】2. 带状模式没有自动增添分片的能力,需要运维手工提前增加分片;如果路由策略计算出的分片并不存在时,会导致失败
【扩容】3. 环状模式中,如果新旧 之间有重叠,需要进行部分数据迁移;如果新旧 之间没有重叠,需要数据再平衡
配置注意点
【配置项】1. 在 rule.xml 中,可配置项为 、 、 、 和
【配置项】2.在 rule.xml 中配置 ,符合 java.text.SimpleDateFormat 规范的字符串,用于告知 DBLE 如何解析sBeginDate和sEndDate
【配置项】3.在 rule.xml 中配置 ,必须是符合 dateFormat 的日期字符串
【配置项】4.在 rule.xml 中配置 ,必须是符合 dateFormat 的日期字符串;配置了该项使用的是环状模式,若没有配置该项则使用的是带状模式
【配置项】5.在 rule.xml 中配置 ,非负整数,该分片策略以毫秒(24 小时整)作为一份,而 sPartionDay 告诉 DBLE 把每多少份放在同一个分片
如何为mysql分片集群设置片键
以每24小时作为一份时间(而非自然日),根据用户的配置有两种工作模式:带状模式中,用户仅定义开始日期时,从开始日期(含)开始,每份时间1个分片地无限增加下去;环状模式中,用户定义了开始日期和结束日期时,以结束日期(含)和开始日期(含)之间的时间份数作为分片总数(分片数量固定),以类似取模的方式路由到这些分片里。
1. DBLE 启动时,读取用户在 rule.xml 配置的 sBeginDate 来确定起始时间
2. 读取用户在 rule.xml 配置的 sPartionDay 来确定每个 MySQL 分片承载多少天内的数据
3. 读取用户在 rule.xml 配置的 dateFormat 来确定分片索引的日期格式
4. 在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值(字符串),会被提取出来尝试转换成 Java 内部的时间类型
5. 然后求分片索引值与起始时间的差,除以 MySQL 分片承载的天数,确定所属分片
1. DBLE 启动时,读取用户在 rule.xml 配置的起始时间 sBeginDate、终止时间 sEndDate 和每个 MySQL 分片承载多少天数据 sPartionDay
2. 根据用户设置,建立起以 sBeginDate 开始,每 sPartionDay 天一个分片,直到 sEndDate 为止的一个环,把分片串联串联起来
3. 读取用户在 rule.xml 配置的 defaultNode
4. 在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值(字符串),会被提取出来尝试转换成 Java 内部的日期类型
5. 然后求分片索引值与起始日期的差:如果分片索引值不早于 sBeginDate(哪怕晚于 sEndDate),就以 MySQL 分片承载的天数为模数,对分片索引值求模得到所属分片;如果分片索引值早于 sBeginDate,就会被放到 defaultNode 分片上
与MyCat的类似分片算法对比
中间件
DBLE
MyCat
分片算法种类 date 分区算法 按日期(天)分片
两种中间件的取模范围分片算法使用上无差别
开发注意点
【分片索引】1. 必须是字符串,而且 java.text.SimpleDateFormat 能基于用户指定的 dateFormat 来转换成 java.util.Date
【分片索引】2. 提供带状模式和环状模式两种模式
【分片索引】3. 带状模式以 sBeginDate(含)起,以毫秒(24 小时整)为一份,每 sPartionDay 份为一个分片,理论上分片数量可以无限增长,但是出现 sBeginDate 之前的数据而且没有设定 defaultNode 的话,会路由失败(如果有 defaultNode,则路由至 defaultNode)
【分片索引】4. 环状模式以毫秒(24 小时整)为一份,每 sPartionDay 份告枯为一个分片,以 sBeginDate(含)到 sEndDate(含)的袜尘洞时间长度除以单个分片长度得到恒定的分片数量,但是出现 sBeginDate 之前的数据而且没有设定 defaultNode 的话,会路由失败(如果有 defaultNode,则路由至 defaultNode)
【分片索引】5. 无论哪种模式,分片索引字段的格式化字符串 dateFormat 由用户指定
【分片索引】6. 无论哪种模式,划分不是以日历时间为准,无法对应自然月和自然年,且会受闰秒问题影响
运维注意点
【扩容】1. 带状模式中,随着 sBeginDate 之后的数据出现,分片数量的增加无需再平衡
【扩容】2. 带状模式没有自动增添分片的能力,需要运维手工提前增加分片;如果路由策略计算出兄迅的分片并不存在时,会导致失败
【扩容】3. 环状模式中,如果新旧 之间有重叠,需要进行部分数据迁移;如果新旧 之间没有重叠,需要数据再平衡
配置注意点
【配置项】1. 在 rule.xml 中,可配置项为 、 、 、 和
【配置项】2.在 rule.xml 中配置 ,符合 java.text.SimpleDateFormat 规范的字符串,用于告知 DBLE 如何解析sBeginDate和sEndDate
【配置项】3.在 rule.xml 中配置 ,必须是符合 dateFormat 的日期字符串
【配置项】4.在 rule.xml 中配置 ,必须是符合 dateFormat 的日期字符串;配置了该项使用的是环状模式,若没有配置该项则使用的是带状模式
【配置项】5.在 rule.xml 中配置 ,非负整数,该分片策略以毫秒(24 小时整)作为一份,而 sPartionDay 告诉 DBLE 把每多少份放在同一个分片
【配置项】6.在 rule.xml 中配置 标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义
MySQL的cluster方案有很多官方和第三方的选择,选择多就是一种烦恼,因此,我们考虑MySQL数据库满足下三点需求,考察市面上可行的解决方案:
高可用性:主服务器故障后可自动切换带肢和到后备服务器可伸缩性:可方便通过脚本增加DB服务器负载均衡:支持手动把某公司的数据饥戚请求切换到另外的服务器,可配置哪些公司的数据服务访问哪个服务器
闰秒 数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于闰秒 数据库,闰秒对数据库的影响,分布式数据库中,数据分片有哪些策略?定义分片时必须遵守那些规则,如何为mysql分片集群设置片键的信息别忘了在本站进行查找喔。