闰秒对Linux系统的影响 (闰秒 对linux 影响)

自从计时器被发明以后,时间是我们生活的一部分,尤其在现代科技的迅速发展下,时间分秒必争。为了让时间更加精准,国际原子时钟服务机构 (International Earth Rotation and Reference Systems Service, IERS) 每几年就会发布一个叫 “闰秒” 的命令,更正的原因就是由于地球本身的自转速度不稳定,导致世界时与原子时之间会出现偏差。在科技发展越来越依赖时间的今天,闰秒的引入对于各个领域都有着不同的影响,本文将详细探讨。

一、闰秒的定义和历史

闰秒定义为 UTC 时刻加上一秒,它由 IERS 机构根据地球自转速度的变化而进行的调整,在过去20年中已经发生了11次。闰秒的发生是在 UTC 时间的最后一天,也就是在6月30日或12月31日的最后一秒。加入一秒的目的是为了让 UTC 与地球自转速度相匹配,保证时间的精确性不受影响。

最早的时候,为了使得世界协调时间 (UTC) 与国际原子时 (T) 保持同步,人们使用全球定位系统 (GPS) 和卫星通讯等较精确的工具进行校对,但这种方法并不能完全消除误差。为了解决这个问题,人们决定在 UTC 中加上一秒,保证地球自转速度与 UTC 同步,确保时间的准确性。

二、

Linux 操作系统是运行于计算机硬件之上的系统软件,其精密的时钟同样会受到闰秒的影响。根据 Linux 内核的实现方式和硬件驱动程序,闰秒可能对不同系统造成的影响不同。下面简单介绍一下闰秒对 Linux 系统的几种影响。

1. 时钟偏差

系统时钟的准确性非常重要,因为系统上的所有操作都基于时间运行。发生闰秒后,由于系统时钟会直接或间接地与硬件时钟产生偏差,因此Linux对闰秒的处理可能会导致系统时钟出现偏差。一般来说,这种偏差通常不会超过0.5秒,但如果在调试、计算精度或校时等方面要求更高的应用,这种偏差就可能会带来一些麻烦。

2. 进程和线程的延迟

Linux操作系统中的进程和线程都以某种方式与系统时钟相连,所以当系统时钟发生偏差时,进程和线程也可能会出现一定的延迟。 这可能对需要高精度与时间相关的应用程序产生负面影响,如金融、科研、军事等领域。

3. 时间戳的错误

时间戳是Linux操作系统中用于记录文件访问和修改时间的方法。当闰秒发生时,时间戳有可能会产生错误。在某些应用程序中,时间戳的准确性非常重要,因此Linux在处理时间戳的代码方面必须非常小心。

4. 网络异步

闰秒可能导致网络同步异常,因为服务器和客户端需要进行精确的时间同步,以确保网络服务的正确性。当网络主机降低其时钟速度以适应闰秒时,网络服务可能会发生暂时性中断。这就需要 Linux 系统管理员在闰秒后立即使用同步命令来重新同步网络时间戳。

三、如何处理闰秒

由于闰秒会对 Linux 操作系统产生影响,因此需要采取一些措施来处理。下面介绍一些常见的方法。

1. 修改内核参数

管理员可以使用 sysctl 命令修改内核参数,从而使系统处理闰秒更加准确。例如,管理员可以设置 leapsecond=23 参数表示 UTC 时刻23:59:60才是闰秒的开始,或者在自动同步时钟时使用 NTP 协议的频率循环,以调整闰秒的速率。

2. 更新操作系统

Linux 厂商通常会发布包含新闰秒信息的操作系统更新,管理员可以下载并安装这些更新,以确保系统能够处理更准确的时钟消息。

3. 执行时间同步

管理员可以使用 NTP 协议、PTP 协议或其他时间同步协议来同步系统时钟。这些协议可以确保系统时钟与 UTC 时间的匹配,并在闰秒发生时自动调整。

四、结论

闰秒作为一个调整时间的方式,在科技发展日新月异的时代,其对各个领域都会产生一定的影响。对于 Linux 操作系统而言,闰秒也许不是一个非常麻烦的问题,但应该注意影响。管理员应该根据自己的应用程序来采取相应的行动,以确保系统时钟的准确性,同时避免系统出现任何错误。我们相信,有了各位 Linux 系统管理员的投入和努力,能够让 Linux 操作系统更加稳定、高效、安全地运行。

相关问题拓展阅读:

mysql 什么时候分区 什么时候分表

一,什么是mysql分表,分区

什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法

什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上

一,先说一下为什么要分表

当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。

根据个人经验,mysql执行一个sql的过程如下:

1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果。在这个执行过程中最花时间在什么地方呢?之一,是排队等待的时间,第二,sql的执行时间。其实这二个是一回事,等待的同时,肯定有sql在执行。所以我们要缩短sql的执行时间。

mysql中有一种机制是表锁定和行锁定,为什么要出现这种机制,是为了保证数据的完整性,我举个例子来说吧,如果有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是不是二个sql都可以同时修改这条数据呢?很显然mysql对这种情况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innodb存储引擎)。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。如果数据太多,一次执行的时间太长,等待的时间就越长,这也是我们为什么要分表的原因。

二,分表

1,做mysql集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等

有人会问mysql集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为漏兆一个数据库减轻负担,说白了就是减少sql排队队列中的sql的数量,举个例子:有10个sql请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这10个sql请求,分配到5个数据库服务器的排队队列中,一个数据库服务器的队列中只有2个,这样等待时间是不是大大的缩短了呢?这已经很明显了。所以我把它列到了分表的范围以内,我做过一些mysql的集群:

linux mysql proxy 的安装,配置,以及读写分离

mysql replication 互为主从的安装及配置,以及数据同步

优点:扩展性好,没有多个分表后的复杂操作(php代码)

缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大。

2,预先估计会出现大数据量并且访问频繁的表,将其分为若干个表

这种预估大差不差的,论坛里面发表帖子的表,时间长了这张表肯定很大,几十万,几百万都有可能。 聊天室里面信息表,几十个人在一起一聊一个晚上,时返禅租间长了,这张表的数据肯定很大。像这样的情况很多。所以这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。以聊天信息表为例:

我事先建100个这样的表,message_00,message_01,message_02……….message_98,message_99.然后根据用户的ID来判断这个用户的聊天信息放袭知到哪张表里面,你可以用hash的方式来获得,可以用求余的方式来获得,方法很多,各人想各人的吧。下面用hash的方法来获得表名:

查看复制打印?

说明一下,上面的这个方法,告诉我们user18991这个用户的消息都记录在message_10这张表里,user34523这个用户的消息都记录在message_13这张表里,读取的时候,只要从各自的表中读取就行了。

优点:避免一张表出现几百万条数据,缩短了一条sql的执行时间

缺点:当一种规则确定时,打破这条规则会很麻烦,上面的例子中我用的hash算法是crc32,如果我现在不想用这个算法了,改用md5后,会使同一个用户的消息被存储到不同的表中,这样数据乱套了。扩展性很差。

3,利用merge存储引擎来实现分表

我觉得这种方法比较适合,那些没有事先考虑,而已经出现了得,数据查询慢的情况。这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了,现在一张表要分成几十张表,甚至上百张表,这样sql语句是不是要重写呢?举个例子,我很喜欢举子

mysql>show engines;的时候你会发现mrg_myisam其实就是merge。

查看复制打印?

mysql> CREATE TABLE IF NOT EXISTS `user1` (

-> `id` int(11) NOT NULL AUTO_INCREMENT,

-> `name` varchar(50) DEFAULT NULL,

-> `sex` int(1) NOT NULL DEFAULT ‘0’,

-> PRIMARY KEY (`id`)

-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Query OK, 0 rows affected (0.05 sec)

mysql> CREATE TABLE IF NOT EXISTS `user2` (

-> `id` int(11) NOT NULL AUTO_INCREMENT,

-> `name` varchar(50) DEFAULT NULL,

-> `sex` int(1) NOT NULL DEFAULT ‘0’,

-> PRIMARY KEY (`id`)

-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO `user1` (`name`, `sex`) VALUES(‘张映’, 0);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `user2` (`name`, `sex`) VALUES(‘tank’, 1);

Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `alluser` (

-> `id` int(11) NOT NULL AUTO_INCREMENT,

-> `name` varchar(50) DEFAULT NULL,

-> `sex` int(1) NOT NULL DEFAULT ‘0’,

-> INDEX(id)

-> ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select id,name,sex from alluser;

+—-++—–+

| id | name | sex |

+—-++—–+

| 1 | 张映 | 0 |

| 1 | tank | 1 |

+—-++—–+

2 rows in set (0.00 sec)

mysql> INSERT INTO `alluser` (`name`, `sex`) VALUES(‘tank2’, 0);

Query OK, 1 row affected (0.00 sec)

mysql> select id,name,sex from user2

-> ;

+—-++—–+

| id | name | sex |

+—-++—–+

| 1 | tank | 1 |

| 2 | tank2 | 0 |

+—-++—–+

2 rows in set (0.00 sec)

从上面的操作中,我不知道你有没有发现点什么?假如我有一张用户表user,有50W条数据,现在要拆成二张表user1和user2,每张表25W条数据,

INSERT INTO user1(user1.id,user1.name,user1.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id

这样我就成功的将一张user表,分成了二个表,这个时候有一个问题,代码中的sql语句怎么办,以前是一张表,现在变成二张表了,代码改动很大,这样给程序员带来了很大的工作量,有没有好的办法解决这一点呢?办法是把以前的user表备份一下,然后删除掉,上面的操作中我建立了一个alluser表,只把这个alluser表的表名改成user就行了。但是,不是所有的mysql操作都能用的

a,如果你使用 alter table 来把 merge 表变为其它表类型,到底层表的映射就被丢失了。取而代之的,来自底层 myisam 表的行被复制到已更换的表中,该表随后被指定新类型。

b,网上看到一些说replace不起作用,我试了一下可以起作用的。晕一个先

mysql> UPDATE alluser SET sex=REPLACE(sex, 0, 1) where id=2;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from alluser;

+—-++—–+

| id | name | sex |

+—-++—–+

| 1 | 张映 | 0 |

| 1 | tank | 1 |

| 2 | tank2 | 1 |

+—-++—–+

3 rows in set (0.00 sec)

c,一个 merge 表不能在整个表上维持 unique 约束。当你执行一个 insert,数据进入之一个或者最后一个 myisam 表(取决于 insert_method 选项的值)。mysql 确保唯一键值在那个 myisam 表里保持唯一,但不是跨里所有的表。

d,当你创建一个 merge 表之时,没有检查去确保底层表的存在以及有相同的机构。当 merge 表被使用之时,mysql 检查每个被映射的表的记录长度是否相等,但这并不十分可靠。如果你从不相似的 myisam 表创建一个 merge 表,你非常有可能撞见奇怪的问题。

优点:扩展性好,并且程序代码改动的不是很大

缺点:这种方法的效果比第二种要差一点

三,总结一下

上面提到的三种方法,我实际做过二种,之一种和第二种。第三种没有做过,所以说的细一点。哈哈。做什么事都有一个度,超过个度就过变得很差,不能一味的做数据库服务器集群,硬件是要花钱买的,也不要一味的分表,分出来1000表,mysql的存储归根到底还以文件的形势存在硬盘上面,一张表对应三个文件,1000个分表就是对应3000个文件,这样检索起来也会变的很慢。我的建议是

方法1和方法2结合的方式来进行分表

方法1和方法3结合的方式来进行分表

我的二个建议适合不同的情况,根据个人情况而定,我觉得会有很多人选择方法1和方法3结合的方式

二,mysql分表和分区有什么区别呢

1,实现方式上

a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

# ls |grep user

alluser.MRG

alluser.frm

user1.MYD

user1.MYI

user1.frm

user2.MYD

user2.MYI

user2.frm

Php代码

# ls |grep user

alluser.MRG

alluser.frm

user1.MYD

user1.MYI

user1.frm

user2.MYD

user2.MYI

user2.frm

简单说明一下,上面的分表呢是利用了merge存储引擎(分表的一种),alluser是总表,下面有二个分表,user1,user2。他们二个都是独立的表,取数据的时候,我们可以通过总表来取。这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据,数据都放在分表里面。我们来看看.MRG到底是什么东西

# cat alluser.MRG |more

user1

user2

#INSERT_METHOD=LAST

Php代码

# cat alluser.MRG |more

user1

user2

#INSERT_METHOD=LAST

从上面我们可以看出,alluser.MRG里面就存了一些分表的关系,以及插入数据的方式。可以把总表理解成一个外壳,或者是联接池。

b),分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了。

# ls |grep aa

aa#P#p1.MYD

aa#P#p1.MYI

aa#P#p3.MYD

aa#P#p3.MYI

aa.frm

aa.par

Php代码

# ls |grep aa

aa#P#p1.MYD

aa#P#p1.MYI

aa#P#p3.MYD

aa#P#p3.MYI

aa.frm

aa.par

从上面我们可以看出,aa这张表,分为二个区,p1和p3,本来是三个区,被我删了一个区。我们都知道一张表对应三个文件.MYD,.MYI,.frm。分区呢根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.par文件,打开.par文件后你可以看出他记录了,这张表的分区信息,根分表中的.MRG有点像。分区后,还是一张,而不是多张表。

2,数据处理上

a),分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。看下面的例子:

select * from alluser where id=’12′表面上看,是对表alluser进行操作的,其实不是的。是对alluser里面的分表进行了操作。

b),分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。

3,提高性能上

a),分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。

b),mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。

在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。

4),实现的难易度上

a),分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。

b),分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。

三,mysql分表和分区有什么联系呢

1,都能提高mysql的性高,在高并发状态下都有一个良好的表面。

2,分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。

以每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 把每多少份放在同一个分片

关于闰秒 对linux 影响的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 闰秒对Linux系统的影响 (闰秒 对linux 影响)