文章目录

新版Memcached采用单一时钟,修改系统时间将无影响

数据库链接突然增大,本来应该在Memcached中的数据穿透了。进而发现memcached与系统时间出现偏差,到底是什么原因导致的呢?

首先查到Memcached的协议文档,其中stats节有关于time字段说明:

|———————————-+————-+—————————————————————-|
| Name | Type | Meaning |
|———————————-+————-+—————————————————————-|
| pid | 32u | Process id of this server process |
| uptime | 32u | Number of secs since the server started |
| time | 32u | current UNIX time according to the server |
| version | string | Version string of this server |

其中time字段说明是采用服务器当前UNIX时间。由此可以说明,是因为系统时间出现校对不准导致,服务器都统一采用ntpdate同步同一ntpserver,按理是不存在这种情况。先验证一下,如果系统时间发生改变Memcached会做什么处理呢?

测试环境:

Centos 6.5 64bit
Memcache Version: 1.4.7

1
2
# date
Tue Sep 16 09:56:43 CST 2014
1
2
3
4
5
6
7
8
# telnet 10.11.1.15 11211
Trying 10.11.1.15...
Connected to 10.11.1.15 (10.11.1.15).
Escape character is '^]'. stats
STAT pid 2923
STAT uptime 9
STAT time 1410850931
STAT version 1.4.7

修改下系统时间

1
2
# date
Fri Jul 26 00:00:00 CST 2013
1
2
3
4
5
6
7
8
9
# telnet 10.11.1.15 11211
Trying 10.11.1.15...
Connected to 10.11.1.15 (10.11.1.15).
Escape character is '^]'. stats
stats
STAT pid 2923
STAT uptime 4258884380
STAT time 5669735302
STAT version 1.4.7

结论:当系统时间发生改变时,Memcached的UNIX time也异常了。这就可以说明,当系统时间因外部因素出现一定时间差时,就会导致异常。

我们再升级memcached 到最新版本1.4.20 看看情况。

1
2
Centos 6.5 64bit 
Memcache Version: 1.4.20
1
2
3
4
5
6
# stats
STAT pid 2586
STAT uptime 8
STAT time 1410838280
STAT version 1.4.20
STAT libevent 1.4.13-stable

修改下系统时间
Fri Jul 26 00:00:00 CST 2013

1
2
3
4
5
# stats
STAT pid 2586
STAT uptime 55
STAT time 1410838327
STAT version 1.4.20

结论:当系统时间发生改变时,Memcached的UNIX time 没有出现异常。官网应该是修复了这个Bug ? 沿着ReleaseNote一个一个版本看下来,并没有这一条说明。实在是忍不住了,直接官网Maillist,得到如下答复:
“Recent versions use a monotonic clock, so changing the system clock can’t cause memcached to lose its mind. “
我再问是那个版本时,对方没有回复了。好吧,问题找到了,也就知道如何处理了。

Memcached stats说明:https://github.com/memcached/memcached/blob/master/doc/protocol.txt
ReleaseNote: http://code.google.com/p/memcached/wiki/ReleaseNotes

文章目录