最新消息:

基于mcroute实现Memcached的高可用HA

Linux ipcpu 732浏览

基于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镜像来做。

  1. 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 配置文件

  1. {
  2. "pools": {
  3. "cache1": {
  4. "servers": [
  5. "172.28.6.188:11211"
  6. ]
  7. },
  8. "cache2": {
  9. "servers": [
  10. "172.28.6.189:11211"
  11. ]
  12. }
  13. },
  14. "route": {
  15. "type": "PrefixPolicyRoute",
  16. "operation_policies": {
  17. "set": {
  18. "type": "AllFastestRoute",
  19. "children": [
  20. "PoolRoute|cache1",
  21. "PoolRoute|cache2"
  22. ]
  23. },
  24. "get": {
  25. "type": "LatestRoute",
  26. "children": [
  27. "PoolRoute|cache1",
  28. "PoolRoute|cache2"
  29. ]
  30. }
  31. }
  32. }
  33. }

路由算法

虽然上面的配置文件用了两种算法,但我这里给出了4种算法作为对照。

AllFastestRoute 将请求同时发给后端,选取最快的没有错误的响应返给客户端,还未完成的请求后端可以继续处理。
AllSyncRoute 将请求同时发给后端,选取最差的响应返回给客户端。
LatestRoute 这个官方描述很模糊,客户端Hash分散+FailoverRoute
FailoverRoute 操作第一个后端,如果第一个后端宕机,操作第二个后端。

验证结果

我们设计了3个场景来模拟故障发生时可能遇到的情况

  1. 2台机器都正常运行,这是平时状态
  2. 1台机器宕机,这是故障状态
  3. 宕机的服务器恢复,重新加入集群,这是恢复状态。

别着急,挨个来:

  1. 2台机器都正常运行的平时状态
    get set 都是正常的,使用AllFastestRoute、AllSyncRoute都是没问题的
  2. 1台机器宕机的故障状态
    set操作使用AllSyncRoute肯定不行,直接报错,使用AllFastestRoute效果比较好
    get操作可以使用FailoverRoute或者LatestRoute
  3. 宕机的服务器恢复
    这种情况很复杂,由于新启动的Memcached没有数据,但是老的Memecached有数据,因此要格外注意。
    set操作使用AllFastestRoute
    get操作使用LatestRoute,使用FailoverRoute会存在问题。

结果太多,我只贴最后一部分

  1. [root@ipcpu ~]# echo -e 'get xyz' | nc 172.28.6.189 11211
  2. VALUE xyz 0 11
  3. hello world
  4. END
  5. [root@ipcpu ~]# echo -e 'get abc' | nc 172.28.6.189 11211
  6. VALUE abc 0 11
  7. hello world
  8. END
  9. [root@ipcpu ~]# echo -e 'get abc' | nc 172.28.6.188 11211
  10. END
  11. [root@ipcpu ~]# echo -e 'get xyz' | nc 172.28.6.188 11211
  12. END
  13. #@上面数据显示,188上没数据,189上有数据
  14. [root@ipcpu ~]# echo -e 'get xyz' | nc 172.28.6.188 5000
  15. VALUE xyz 0 11
  16. hello world
  17. END
  18. [root@ipcpu ~]# echo -e 'get abc' | nc 172.28.6.188 5000
  19. VALUE abc 0 11
  20. hello world
  21. END
  22. #@使用LatestRoute可以正确拿到数据

参考资料

https://github.com/facebook/mcrouter/wiki
http://g23988.blogspot.com/2014/12/mcrouterrouteconfigmemcached.html (此文部分描述有误)

转载请注明:IPCPU-网络之路 » 基于mcroute实现Memcached的高可用HA