安装部署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 加载