high-concurrent-cache
  • Introduction
  • Redis
    • redis常用命令
      • 生产环境谨慎使用keys命令
      • Redis 命令参考
    • redis客户端
      • Jedis使用指南
      • redisson
      • redis连接池
      • jedisCluster详解
      • jedisCluster+SpringMVC整合
    • redis主从模式
      • 配置方式
      • 一主多从读写分离架构
    • redis持计划机制的讲解
      • 持久化
      • RDB详解
      • AOF详解
      • RDB与AOF异同比较
    • 哨兵机制详解(sentinel)
      • 哨兵使用架构(sentinel)
      • 哨兵工作原理/哨兵如何监控redis
      • 哨兵如何高可用
      • 哨兵内部通讯原理/自动发现 Sentinel 和从服务器
      • 基于哨兵的redis高可用架构
    • redisCluster集群
      • 架构分析
      • 搭建高可用集群
      • 分区存储详解
      • java客户端使用redisCluster
    • 实战场景
      • 高性能分布式缓存
      • 实现定时消息通知
      • 简单高速队列的实现与应用
      • 实现去重幂等性
      • 数据计数/订单号生成
      • 基于redis实现分布式锁
      • 排行榜
      • 使用Redis bitmaps进行快速、简单、实时统计
      • 利用Redis集合(Set)统计新增用户和次日留存率
    • Redis回收进程如何工作的? Redis回收使用的是什么算法?
    • Redis持久化数据和缓存怎么做扩容?
    • Redis 分区的优势、不足以及分区类型
    • Redis 大量数据插入
    • redis实现简单延时队列
    • 使用 redis 如何设计分布式锁?说一下实现思路?使用 zk 可以吗?如何实现?这两种有什么区别?
    • Redis的bitmap讲解
    • 分布式锁的漫画教程
  • Memcached
    • Memcached概念
    • 安装配置
      • Linux安装
      • Windows安装
    • 集群搭建
    • 常用场景
    • 客户端命令
      • 客户端连接命令
      • Memcached 存储命令
        • Memcached set 命令
        • Memcached add 命令
        • Memcached replace 命令
        • Memcached append 命令
        • Memcached prepend 命令
        • Memcached CAS 命令
      • Memcached 查找命令
        • Memcached get 命令
        • Memcached gets 命令
        • Memcached delete 命令
        • Memcached incr 与 decr 命令
      • Memcached 统计命令
        • Memcached stats 命令
        • Memcached stats items 命令
        • Memcached stats slabs 命令
        • Memcached stats sizes 命令
        • Memcached flush_all 命令
    • Java客户端
    • memcached特点与redis区别
    • 一致性哈希算法原理
    • Memcache 高可用集群之magent实现主从
  • 互联网缓存架构设计
    • 常见的缓存架构方案
    • 缓存雪崩的解决方案
    • 缓存穿透的解决方案
    • 缓存击穿的解决方案
Powered by GitBook
On this page

Was this helpful?

  1. Memcached

Memcache 高可用集群之magent实现主从

Previous一致性哈希算法原理Next互联网缓存架构设计

Last updated 5 years ago

Was this helpful?

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

项目地址:

一、整体架构

从图中可以看到有两个magent节点,两个memcached节点,每个magent节点又分别代理两个memcached节点,应用系统端使用magent pool来调用memcache进行存储。硬件结构为两台linux服务器,每台服务器上分别安装magent和memcached服务,并设为开机启动。这样做的好处是任何一台服务器宕机后都不影响magent pool获取memcache信息,即实现了memcached的高可用(HA),如果两台机器都宕机了,只能说明你RP太差了。当然,也可以用三台、四台或者更多服务器来提高HA。

二、安装

memcached和Magent

2.安装Magent

1)下载安装

tar -zxvf magent-0.6.tar.gz

make

检查是否安装成功:

./magent -h

memcached agent v0.6 Build-Date: Mar 27 2015 07:09:30

错误修改:

1)错误1

gcc -Wall -g -O2 -I/usr/local/include -c -o magent.o magent.c

magent.c: In function ‘writev_list’:

magent.c:729: error: ‘SSIZE_MAX’ undeclared (first use in this function)

magent.c:729: error: (Each undeclared identifier is reported only once

magent.c:729: error: for each function it appears in.)

make: *** [magent.o] Error 1

处理,在ketama.h开头添加

#ifndef SSIZE_MAX

#define SSIZE_MAX 32767

#endif

2)错误2

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a

/usr/lib64/libevent.a(event.o): In function `gettime’:

(.text+0×449): undefined reference to `clock_gettime’

/usr/lib64/libevent.a(event.o): In function `event_base_new’:

(.text+0x72a): undefined reference to `clock_gettime’

collect2: ld returned 1 exit status

make: *** [magent] Error 1

处理:

vim Makefile

CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64)

改为:

CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64)

3)错误3

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a

gcc: /usr/lib64/libm.a:没有那个文件或目录

make: *** [magent] 错误 1

解决办法

ln -s /usr/lib64/libm.so /usr/lib64/libm.a

注:有可能还会报错 gcc: /usr/lib64/libevent.a: 没有那个文件或目录

如果有,可执行

vi Makefile

找到 LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a

修改 LIBS = /usr/libevent 的安装路径/libevent.a /usr/lib64/libm.a

例: LIBS = /usr/lib/libevent.a /usr/lib64/libm.a

三、启动服务

1.memcached

192.168.36.54:11211

192.168.36.189:11211

./memcached/bin/memcached -d -m 64 -p 11211

2.magent

192.168.36.54

./magent/magent -n 4096 -l 192.168.36.54 -p 11200 -s 192.168.36.54:11211 -b 192.168.36.189:11211

192.168.36.189

./magent/magent -n 4096 -l 192.168.36.189 -p 11200 -s 192.168.36.189:11211 -b 192.168.36.54:11211

magent参数说明:

-h 帮助说明

-u 用户

-g gid

-p 启动端口, 默认11211. (0 to disable tcp support)

-s 服务memcached地址,ip:port, set memcached server ip and port

-b 备份memcached地址,ip:port, set backup memcached server ip and port

-l 启动IP地址,ip, local bind ip address, default is 0.0.0.0

-n 最大并发数number, set max connections, default is 4096

-D 非后台运行don't go to background

-k use ketama key allocation algorithm

-f file, unix socket path to listen on. default is off

-i number, set max keep alive connections for one memcached server, default is 20

-v verbose

四、测试

1.通过代理magent添加数据,查看服务和备份memcached

通过任何一个代理magent添加数据,2台memcached都存在。

2.关闭一个服务memcached,再重启查看数据是否存在

关闭192.168.36.189的memcached,通过192.168.36.189的magent可以查询数据,来自备份机器。

再启动,由于没有持久化,所有数据都无法查询,另外一台magent正常。

再启动192.168.36.189的memcached的时候,

可以从备份Memcached服务恢复数据,起到了容错的作用。

通过以上测试可以得出结论:

1、通过magent的连接池放的值会分别存在magent代理的所有memcached上去。

2、如果有一个memcached宕机通过magent代理方式还能取到值。

3、如果memcached修复重启后通过magent代理方式取到的值就会为Null,这是由于memcache重启后里边的值随着memcache服务的停止就消失了(因为在内存中),但是magent是通过key进行哈希计算分配到某台机器上的,memcache重启后会还从这台机器上取值,所有取到的值就没空。

解决办法

1、在每次memcache宕机修复后可以写一个程序把集群中的其他memcache的所有信息全给拷贝到当前宕机修复后的memcache中。

2、自己写代理,当从一个memcached服务上取到的值为null时再去其他memcached上取值。

注意事项

magent的调用方式同memcached一样,客户端可以不用改代码即可实现切换到magent模式下。

1.安装memcached,请参考:

wget

http://blog.csdn.net/zhu_tianwei/article/details/44542497
http://memagent.googlecode.com/files/magent-0.6.tar.gz
http://code.google.com/p/memagent
https://github.com/wangmh/memagent