memcached基于magent 多主多从,主主同步,主从备份,导入,导出大于2M数据。

本文详细介绍Memcached的主主同步部署过程,包括所需软件包的下载与安装、配置magent代理实现多主多从架构、数据的导入导出及故障排查等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                       安装部署memcached 基于magent的 主从同步 主主同步

需下载的包

wget http://www.memcached.org/files/memcached-1.5.10.tar.gz
wget https://raw.githubusercontent.com/memcached/memcached/master/scripts/memcached-tool  (导出工具是一个脚本)
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
magent
https://code.google.com/archive/p/memagent/downloads (包含magent所有版本不能访问google无法下载)
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/memagent/magent-0.5.tar.gz

关于架构介绍:

http://blog.51cto.com/ultrasql/1633897

 红色线代表主  ,绿色线代表从。多台主会轮询写入主。每个从都会写入数据(从上的数据是所有主上的数据集合),

 客户端现在是直接访问magent  代理,所有操作都会有magent 转发后端的memcached(部分命令不支持),

 

1、首先安装libevent,指定安装路径即可,第二台上相同操作

    cd/home/system/libevent-2.1.8-stable
    ./configure --prefix=/home/system/libevent    路径建议安装到 /usr/local/libevent   下

2、安装memcached,第二台上相同操作

    cd /home/system/memcached-1.5.6
    ./configure \
    --prefix=/home/system/memcached  --with-libevent=/home/system/libevent/ #指定上面库模块安装路劲

    make && make install

  ##################################################################

领导有要求备份 memached  需改源码, vi /home/system/memcached-1.5.6/items.c

 596     unsigned int memlimit = 2 * 1024 * 1024;   /* 2MB max response size */
                               直接改这个值编译安装会报错,修改下面判断值。
 629         if (bufcurr + len + 6 > memlimit)  /* 6 is END\r\n\0 */
 630             break;
改为想要的值100G 
 629         if (bufcurr + len + 6 > 107374182400)  /* 6 is END\r\n\0 */
 630             break;

  保存 编译安装即可 ##################################################

    4、将编译安装的libevent-2.1.so.6模块复制到/usr/lib64,否则memcached服务启动时会报错。
    第二台上相同操作。

    ln -s /home/system/libevent/lib/libevent-2.1.so.6 /usr/lib64/libevent-2.1.so.6

    5、安装magent,第二台可以安装也可以 scp magent 到第二台,启动都指定绝对路径启动方便其余运维维护。

    tar magent-0.5.tar.gz -C /opt/
    cd /opt

        4.1修改文件

magent-0.5]# vi ketama.h

#ifndef SSIZE_MAX
#define SSIZE_MAX 32767  //前两行带#的改成这样
#endif    //位置上调 到第三行 

如下:

1  #ifndef SSIZE_MAX
2  #define SSIZE_MAX 32767
3  #endif

    4.2修改 Makefile文件
magent-0.5]# vi Makefile

LIBS = -levent -lm -L/home/system/libevent/lib/   //注意libevent的安装路径,否则make会报错
INCLUDE = -I /home/system/libevent/include

    6、生成magent程序
    此处需要注意,在magent生成可执行程序之前需要关闭防火墙,不然无法make,只需要make即可。

    make
##########################################
     magent-0.6安装 : 在测试过程中magent-0.6有问题,并发会无法提供服务,Time Out。上生产也是如此。

后来改用magent-0.5 可以用。也许是我配置的问题(如果可以用请留言,并告知如何用)。
1,
ln -s /home/system/libevent/* /usr/lib64/
ln -s  /usr/lib64/libm.so /usr/lib64/libm.a  (或者直接修改 Makefile 文件中的 /usr/lib64/libm.a)
2,
vi Makefile
ifeq ($(ARCH), $(X64))
        M64 = -m64
        LIBS = /usr/lib64/libevent-2.1.so.6 /usr/lib64/libm.a
else
        LIBS = -levent -lm -L/usr/lib64/lib
endif

CFLAGS = -Wall -g -O2 -I/usr/lib64/include $(M64)
3,
 vi ketama.h

#ifndef SSIZE_MAX
#define SSIZE_MAX 32767  //前两行带#的改成这样
#endif    //位置上调

    #ifndef SSIZE_MAX
    #define SSIZE_MAX 32767
    #endif
##############################################################
  7,  启动 memcached 

   /home/system/memcached-100G/bin/memcached -d -m 40960 -c 40960  -l 192.168.88.23 -p 11210 -u root -P /tmp/memcached-100G.pid

内存10G  最大访问量40960    端口 11210

8,启动 magent 代理: -s 两主  -b 两从 

   /home/system/123/magent -u root -n 51200 -l 192.168.88.23 -p 1111 -s 192.168.88.23:11210 -s 192.168.88.23:11213 -b 192.168.88.21:11211 -b 192.168.88.21:11212

9,生成set数据 复制粘贴到 telnet命令行 。

[root@Smaster bin]# for i in {0..9}; do  echo -e "set ZZZ$i 0 0 5\r\naXXX$i\r"; done
set ZZZ0 0 0 5
aXXX0
,,,,
set ZZZ9 0 0 5
aXXX9
[root@Smaster bin]# for i in {0..9}; do  echo -e "get ZZZ$i\r"; done  
get ZZZ0
,,,,,
get ZZZ10

[root@Sslave2 ~]# telnet 192.168.88.23 1111
Trying 192.168.88.23...
Connected to 192.168.88.23.
Escape character is '^]'.
set ZZZ0 0 0 5
aXXX0
STORED
set ZZZ1 0 0 5
aXXX1
STORED
set ZZZ2 0 0 5
aXXX2
set ZZZ3 0 0 5
STORED
aXXX3
set ZZZ4 0 0 5
STORED
aXXX4
set ZZZ5 0 0 5
STORED
aXXX5
STORED
set ZZZ6 0 0 5
aXXX6
STORED
set ZZZ7 0 0 5
aXXX7
STORED
set ZZZ8 0 0 5
aXXX8
set ZZZ9 0 0 5
aXXX9
set ZZZ10 0 0 5
aXXX10STORED

STORED

get 获取值

get ZZZ0
VALUE ZZZ0 0 5
aXXX0
END
get ZZZ1
VALUE ZZZ1 0 5
aXXX1
END
get ZZZ2
VALUE ZZZ2 0 5
aXXX2
END
get ZZZ3
VALUE ZZZ3 0 5
aXXX3
END
get ZZZ4
VALUE ZZZ4 0 5
aXXX4
END
get ZZZ5
VALUE ZZZ5 0 5
aXXX5
END
get ZZZ6
get ZZZ7
get ZZZ8
get ZZZ9
get ZZZ10VALUE ZZZ6 0 5
aXXX6
END
VALUE ZZZ7 0 5
aXXX7
END

VALUE ZZZ8 0 5
aXXX8
END

VALUE ZZZ9 0 5
aXXX9
END

END

ctrl + ] 然后 输入q 回车推退出

通过stats itmes 查看 itmes 通过 stats cachedump 1 0 查询所有数据(数据过大会导致memcached崩溃如果修改了缓存限制100G的话) 。可以看出多主 多从会分担负载,数据分片分布在主从上面。

[root@Sslave2 ~]# telnet 192.168.88.23 11210
Trying 192.168.88.23...
Connected to 192.168.88.23.
Escape character is '^]'.
stats cachedump 1 0
ITEM ZZZ9 [5 b; 0 s]
ITEM ZZZ7 [5 b; 0 s]
ITEM ZZZ5 [5 b; 0 s]
ITEM ZZZ3 [5 b; 0 s]
ITEM ZZZ1 [5 b; 0 s]
END
^]
telnet> q
Connection closed.
[root@Sslave2 ~]# telnet 192.168.88.23 11213
Trying 192.168.88.23...
Connected to 192.168.88.23.
Escape character is '^]'.
stats cachedump 1 0
ITEM ZZZ8 [5 b; 1537157432 s]
ITEM ZZZ6 [5 b; 1537157432 s]
ITEM ZZZ4 [5 b; 1537157432 s]
ITEM ZZZ2 [5 b; 1537157432 s]
ITEM ZZZ0 [5 b; 1537157432 s]
ITEM ZZZ5 [5 b; 1537157432 s]
END
^]
telnet> q
Connection closed.
[root@Sslave2 ~]# telnet 192.168.88.21 11211
Trying 192.168.88.21...
Connected to 192.168.88.21.
Escape character is '^]'.
stats cachedump 1 0
ITEM ZZZ9 [5 b; 0 s]
ITEM ZZZ7 [5 b; 0 s]
ITEM ZZZ5 [5 b; 0 s]
ITEM ZZZ3 [5 b; 0 s]
ITEM ZZZ1 [5 b; 0 s]
END
^]
telnet> q
Connection closed.
[root@Sslave2 ~]# telnet 192.168.88.21 11212
Trying 192.168.88.21...
Connected to 192.168.88.21.
Escape character is '^]'.
stats cachedump 1 0
ITEM ZZZ8 [5 b; 0 s]
ITEM ZZZ6 [5 b; 0 s]
ITEM ZZZ4 [5 b; 0 s]
ITEM ZZZ2 [5 b; 0 s]
ITEM ZZZ0 [5 b; 0 s]
END

我测试过

twemproxy-master 这个代理 代理的是redis 也是分片存储到代理池,问题是取值 get时,是轮询取值,因为是分片存储,所以有时取不到的概率是 (n-1)/n    N为池redis数。也许是我配置的问题。

10,导出数据           数据导入不能通过magent导入

         /home/system/memcached/bin/memcached-tool 192.168.88.23:11210 dump >100G-dump.txt

11, 导入数据

          nc 192.168.88.23 11211 < 20180906.txt

12, 生成数据测试。导入导出。

for i in {0..10000000}; do  echo -e "set $i 0 0 200\r\n01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\r" >>2G.txt; done

                    会生成2G数据

13 , memcached  与 magent介绍:

14.在centos6.3 运行一回直接被杀死, tail -f /var/log/messages

Sep 17 18:12:50 node40 kernel: memcached[78038]: segfault at 7f13c5538000 ip 0000003361489a3c sp 00007f13cfa60758 error 6 in libc-2.12.so[3361400000+18b000]
Sep 17 18:12:50 node40 abrt[86840]: Saved core dump of pid 78033 (/home/system/memcached-1.5.10/bin/memcached) to /var/spool/abrt/ccpp-2018-09-17-18:12:50-78033 (219357184 bytes)
Sep 17 18:12:50 node40 abrtd: Directory 'ccpp-2018-09-17-18:12:50-78033' creation detected
Sep 17 18:12:51 node40 abrtd: Executable '/home/system/memcached-1.5.10/bin/memcached' doesn't belong to any package and ProcessUnpackaged is set to 'no'


vi /etc/abrt/abrt-action-save-package-data.conf

修改 no 为yes

       ProcessUnpackaged = yes

     重启

service abrtd restart

 

1、Telnet操作Memcached

1. 连接

  打开CMD。输入如下格式 telnet [IP 端口] 如:telnet 192.168.11.183 1200

  2. Memcached操作命令

  2.1 添加数据

  add key值 0

  时间(秒)

  长度(存放多长时间由你指定,

  键名不能重复,但是值可以重复

  )例:add name 0 5 5不可以在add name 0 77 44

  2.2、获取数据

  get key值

  【key-val key不能重复,但是val可以重复】

  2.3、修改数据

  replace key值 0 60 5

  【如果key值不存在,则失败】

  set key值 0 60 5

  【如果key值不存在,相当于添加,如果存在,则相当于修改.】

  2.4、删除数据

  delete 键值

  2.5、删除全部

flush_all

2, 查看全部 数据, stats items  ,stats cachedump 7 0  (7是根据stats items查看得到的)

 

主主同步magent 用法

Usage:

  -h this message

  -u uid

  -g gid

  -p port, default is 11211. (0 to disable tcp support)

  -s ip:port, set memcached server ip and port

  -b ip:port, set backup memcached server ip and port

  -l 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

用途:

-这个消息

U-UID

G-GID

p端口,默认值为11211。(0禁用TCP支持)

-s IP:端口,设置MycCaseServer IP和端口

-b IP:端口,设置备份MycCurp服务器IP和端口

-l IP,本地绑定IP地址,默认值为0.0.0.0

-n个数,设置最大连接,默认为4096

-d 不要去后台

-K使用KEATMA密钥分配算法

-F文件,Unix套接字路径侦听。默认关闭

-i个数,设置一个内存缓存服务器的最大保持连接,默认为20

-v字形

############################################################################

15,主主同步 就是 A 机器上 用magent -s A  -b  B

                               B机器上     magent   -s B  -b A

由于生产上两个机房的memcached A| B 用代理实现主主同步,所以开启了防火墙只允许指定地址访问memcached。

机房告知 一台服务器 IP重复 up down,我通过长ping 的确是时不时三道五个连续丢包现象。

先改的是

 网卡缓存,没有解决。

后tail -300f /var/log/messages

系统参数问题 导致防火墙连接跟踪表满了。

vi /etc/sysctl.conf  

net.netfilter.nf_conntrack_max = 655350  这个参数被注了 也可以根据系统内存调大,sysctl -p 加载

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值