23
Memcache在我们的项目中经常会用到,最近为了做IDGEN,我进行了多次测试,得到一些与failover有关的结论。客户端都使用php的memcache对象,服务器就是memcached服务
一、客户端对Memcached服务器的检测
分两种情况
1.如果是服务器断网或死机,php的Memcache对象会等待超时,超时判断该服务器为失效,这个时间默认是1秒。由php.ini的memcache.default_timeout_ms决定,默认是1000ms
2.如果服务器仍然存活,只是返回错误或者类似Connection Refused这种低层的错误,则立即判断该服务器为失效
二、php.ini中failover的开启情况
1.memcache.allow_failover=1
这是默认值,假设addServer了多台服务器。当检测到有服务器失效后,则立即转移到其他服务器上进行读写(当然读是读不到了,但是其后都能读写都到了另一台服务器上)
转移的时候有几种算法,由php.ini中的memcache.hash_strategy决定 ,有标准、一致性哈希等等。一致性哈希是个比较好的算法,一台服务器挂掉以后,上面的key可以比较均匀地分散到其他memcache服务器上,不会突然全部转移到某台服务器上。
2.memcache.allow_failover=0
检测到服务器失效后,不进行转移,读不到就是读不到,写不进去就是写不进去
三、失效状态
由于没有进程间通信的机制,一个进程检测到某台Memcached服务器失效,不会通知其他进程。因此,假设一台Memcached服务器失效,则每个进程都需要检测一下。
我们注意到,addServer的第六个参数$retry_interval,它是用于再次检测服务器是否失效的时间间隔,-1则不再检测。它的默认时间是写在php的memcache扩展源代码中,15秒
在同一个进程中,如果第一次检测到memcached服务器挂掉,则15秒内不会再进行通信。15秒后,重新尝试请求一下,如果失败还会继续等待15秒。
通常,一台webserver会fork50个进程,每个进程都可以处理一个http请求,并在连接结束后继续处理另一个http请求,这时候,进程没有结束,15秒时间仍然有效,下一个http请求中的memcache就得知了某服务器已经失效这件事情,根本不会发送数据包给挂掉的memcached服务器,直到距离上次检测达到15秒的时间。我们很高兴看到这一点,至少不会每次执行php时都检测(检测超时是个很费时间的活儿)

written by 城市过客甲


Leave a Reply

i3Theme sponsored by Top 10 Web Hosting and Hosting in Colombia