基于swarm 构建magent的memcached 集群:

Magent 是一款开源的 Memcached 代理服务器软件,使用它可以搭建高可用性的集群应用的 Memcached 服务 ,备份 Memcached 数据,尽管 Memcached 服务挂掉,前端也能获取到数据,客户端先连到 Magent 代理服务器 ,然后Magent 代理服务器 在可以连接多台 Memcached 服务器,然后可以进行数据的保存和备份数据。这样数据就不会丢失,保存了数据完整性。

1、构建magent镜像:

安装Magent
wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
tar -zxvf magent-0.5.tar.gz
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile

在ketama.h或magent.c开头添加
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
#endif
把调整好后的文件夹直接add到镜像中。如下为Dockerfile 内容:

Dockerfile:
########################################
FROM centos:7
ADD magent /tmp/magent
RUN yum install -y gcc make libevent-devel.x86_64 && yum clean all && cd /tmp/magent/ && /sbin/ldconfig && make && cp magent /usr/bin/

CMD magent -u root -l 0.0.0.0 -p 12000 -s 1.1.1.1:11211 -b 1.1.1.2:11211
#这里的-s仅供参考。
########################################

构建镜像:
docker build . -t 10.211.121.26/memcache/magent:v1
提交到私有仓库:
docker push 10.211.121.26/memcache/magent:v1

memcached使用公版镜像。

使用stack部署:

magent.yml 文件:
#####
version: '3.2'
services:
magent:
image: '10.211.121.26/memcache/magent:v1'
ports:

  • '12001:12000'
    #command: magent -u root -D -v -l 0.0.0.0 -p 12000 -s memcached1:11211 -b memcached2:11211
    #使用service name做为入口一直无法正常连接,没找到原因,在magent容器内部能正常访问memcached1:11211。
    command: 'magent -u root -D -v -l 0.0.0.0 -p 12000 -s 10.211.121.75:12002 -b 10.211.121.75:12003'

    memcached1:
    image: memcached
    ports:

  • '12002:11211'

    memcached2:
    image: memcached
    ports:

  • '12003:11211'

#####

部署:
docker stack deploy -c magent.yml magent

Creating network magent_magent
Creating service magent_magent
Creating service magent_memcached1
Creating service magent_memcached2

测试验证:

telnet 10.211.121.75 12001

Trying 10.211.121.75...
Connected to 10.211.121.75.
Escape character is '^]'.
set key 0 0 3
qqq
STORED
get key
VALUE key 0 3
qqq
END
quit
Connection closed by foreign host.

telnet 10.211.121.75 12002

Trying 10.211.121.75...
Connected to 10.211.121.75.
Escape character is '^]'.
get key
VALUE key 0 3
qqq
END
quit
Connection closed by foreign host.

telnet 10.211.121.75 12003

Trying 10.211.121.75...
Connected to 10.211.121.75.
Escape character is '^]'.
get key
VALUE key 0 3
qqq
END
quit
Connection closed by foreign host.

测试情况基本满足需求,遗留问题是stack中:
#command: .... -s memcached1:11211 -b memcached2:11211 service name无法作为入口使用。

欢迎交流沟通:
QQ: 249016681