基于mcroute实现Memcached的高可用HA.md
概述
Mcrouter 是一个基于Memcached 协议的路由器,它是 Facebook缓存架构的核心组件,在峰值的时候,它能够处理每秒50亿次的请求。目前已经开源,可以去github上下载。
从工作原理来看,Mcrouter是一个Memcached的代理服务器,处在客户端和Memcached服务器之间。
Mcrouter的使用方法还是比较复杂的,我们今天简单的分析下,他作为高可用Memcached的使用方法。
Mcrouter 官网
https://github.com/facebook/mcrouter
Mcrouter 的安装
Mcrouter的安装绝对是一个大坑,其依赖软件众多,经过了我长时间不懈的努力,终于编译成功,但却遗憾的发现,程序启动不了,正常配置文件都会报错。好吧,放弃吧。
好在docker的兴起,有网友将其做成了docker镜像,终于省去了不少麻烦,以下我们的实验都是用docker镜像来做。
docker run -itd -p 5000:5000 -v /data/:/data/ jamescarr/mcrouter:1.0 mcrouter --config-file=/data/cf2.json -p 5000
设计目标
使用两台Memcached服务器,当一台机器损坏时,Memcached服务能继续使用(HA)。
故障切换时允许少量缓存数据丢失,不允许出现空白机器,会导致大量数据穿透到数据库(Replication)。
实现方式
如上图,我们使用了Keepalived来维持一个虚拟IP,提供给客户端使用,保障网络层高可用,然后每台机器安装MCRouter作为代理,Memcached作为数据存储。每个MCRouter都会配置2台机器上的Memcached,发生故障会自动切换。
针对数据复制,我们采用了写多读一的方式,写入MCRouter后,代理会同时写入到2个Memcached中。
Mcrouter 配置文件
{
"pools": {
"cache1": {
"servers": [
"172.28.6.188:11211"
]
},
"cache2": {
"servers": [
"172.28.6.189:11211"
]
}
},
"route": {
"type": "PrefixPolicyRoute",
"operation_policies": {
"set": {
"type": "AllFastestRoute",
"children": [
"PoolRoute|cache1",
"PoolRoute|cache2"
]
},
"get": {
"type": "LatestRoute",
"children": [
"PoolRoute|cache1",
"PoolRoute|cache2"
]
}
}
}
}
路由算法
虽然上面的配置文件用了两种算法,但我这里给出了4种算法作为对照。
AllFastestRoute 将请求同时发给后端,选取最快的没有错误的响应返给客户端,还未完成的请求后端可以继续处理。
AllSyncRoute 将请求同时发给后端,选取最差的响应返回给客户端。
LatestRoute 这个官方描述很模糊,客户端Hash分散+FailoverRoute
FailoverRoute 操作第一个后端,如果第一个后端宕机,操作第二个后端。
验证结果
我们设计了3个场景来模拟故障发生时可能遇到的情况
- 2台机器都正常运行,这是平时状态
- 1台机器宕机,这是故障状态
- 宕机的服务器恢复,重新加入集群,这是恢复状态。
别着急,挨个来:
- 2台机器都正常运行的平时状态
get set 都是正常的,使用AllFastestRoute、AllSyncRoute都是没问题的 - 1台机器宕机的故障状态
set操作使用AllSyncRoute肯定不行,直接报错,使用AllFastestRoute效果比较好
get操作可以使用FailoverRoute或者LatestRoute - 宕机的服务器恢复
这种情况很复杂,由于新启动的Memcached没有数据,但是老的Memecached有数据,因此要格外注意。
set操作使用AllFastestRoute
get操作使用LatestRoute,使用FailoverRoute会存在问题。
结果太多,我只贴最后一部分
[root@ipcpu ~]# echo -e 'get xyz' | nc 172.28.6.189 11211
VALUE xyz 0 11
hello world
END
[root@ipcpu ~]# echo -e 'get abc' | nc 172.28.6.189 11211
VALUE abc 0 11
hello world
END
[root@ipcpu ~]# echo -e 'get abc' | nc 172.28.6.188 11211
END
[root@ipcpu ~]# echo -e 'get xyz' | nc 172.28.6.188 11211
END
#@上面数据显示,188上没数据,189上有数据
[root@ipcpu ~]# echo -e 'get xyz' | nc 172.28.6.188 5000
VALUE xyz 0 11
hello world
END
[root@ipcpu ~]# echo -e 'get abc' | nc 172.28.6.188 5000
VALUE abc 0 11
hello world
END
#@使用LatestRoute可以正确拿到数据
参考资料
https://github.com/facebook/mcrouter/wiki
http://g23988.blogspot.com/2014/12/mcrouterrouteconfigmemcached.html (此文部分描述有误)
转载请注明:IPCPU-网络之路 » 基于mcroute实现Memcached的高可用HA