这几天做某个产品的时候遇到一个小问题,现象比较诡异
产品用了两台分布式的memcached服务器
某一个计数器取回来的数偶尔会不对,最后定位在php memcache client的failover机制上面。
我们知道,在memcached分布式环境下,某一个key是通过hash计算,分配到某一个memcached上面的
如果php.ini里面 memcache.allow_failover = 1的时候,在分布式环境下,某一台memcached出问题的话,会自动到其他的memcached尝试
就会出现上面的问题,原因如下:
这个key是hash到服务器A的,但是服务器A正好一瞬间连不上(网络或者其他问题),PHP就会去另一台服务器B去尝试。
经过很偶然发生的网络问题和很多次increment操作,有可能两台服务器上面都有这个key,而且值不一样……
get的时候有可能取到不同的值
如果对数据一致性要求很严格的话,可以关掉这个参数 memcache.allow_failover = 0,嗯,问题解决
本文探讨了在使用PHP和分布式Memcached时遇到的一致性问题。当memcached的failover机制开启时,由于网络问题可能导致不同服务器上的数据不一致。文章建议在需要严格数据一致性的场景下关闭此功能。
4322

被折叠的 条评论
为什么被折叠?



