作者:零开始1023_511 | 来源:互联网 | 2023-10-09 21:11
篇首语:本文由编程笔记#小编为大家整理,主要介绍了超简单的memcached集群搭建相关的知识,希望对你有一定的参考价值。
Memcached虽然能够通过分布式缓存,实现其中memcached宕掉不会丢失全部缓存数据,但部分数据还是难逃一劫。 我们可以利用magent代理memcached实现主从备份来保证缓存数据完好无损,而且magent还可以作为从继续使用,单大体工作原理如下:
1. magent每次写数据都会写到主memcached和从memcached上,并且向主从memcached写的算法一样;
2. 当主memcached宕掉,magent会向从memcached中读取数据。
3. 当主memcached恢复后,magent将重新向主memcached中读取数据;此时由于主memcached刚刚恢复,其中并无数据,因此导致部分数据无法读取,这也是magent的一大缺点。
针对magent的缺点有几种想法:
1. 在生产环境中主memcached宕掉的可能性非常小,大部分时间都是工作的;而从memcached只是在主memcached宕掉后才使用,因此从memcached分配的空间不可能和主memcached一样,这样无疑是在浪费宝贵的内存空间。
2. 既然从memcached分配空间较小而随着存入的数据会越来越多,会导致缓存的数据不断被过期驱逐内存,因此在主memcached宕掉后,只能暂时起到缓解数据库压力的作用。
3. 主memcached宕掉后,不宜直接将其启动,还是在数据库压力比较小的时候再启动吧,就当预热缓存,
总结:我引入magent除了主从方面,还考虑到magent--magent实现memcached入口的负载均衡,也就是说读写请求按照一定的算法分配到magent入口上,既能达到高可用,还能起到负载均衡。
memcached集群架构图
magent1,magent2作为memcached的总入口,我们使用算法来实现负载均衡,分配读写请求,无论使用哪个入口分配到后端的memcached是一样的,因为他们分配memcached使用的都是同一个算法consistent-hash。
后端memcached1,memcached2,memcached3,memcached4多位4个主memcached
magent3作为从,同时也是从memcached的入口,其后端还有两个memcached5,memcached6;由magent3, memcached5,memcacched6共同组成从memcached
工作流程:
magent1,magent2接受写请求,将key分别写入mecached1-mecached4中,同时也将key写入从memcached上,也就是magent3上,magent3再分别写入mecached5,mecached6中;主和从都是用的同一个分配算法
magent1,magent2接受读请求,将分别向主memcached中进行读取,而不想从memcached中读取;
一旦mecached1-mecached4中有一个memcached宕掉,此时magent1和magent2将向从memcached,也就是magent3中读取数据,达到缓存数据不丢失的效果;
当主中的memcache恢复后,将再次加入主memcached中,此时magent1和magent2将不会向从memcached中读数据了,但是写仍正常进行;
1. 安装libevent
memcached 依赖libevent库,在安装memcached之前检查下系统是否已安装libevent库,如果没有则需要先安装 libevent。
libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制
tar zxvf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.9-stable
./configure --prefix=/usr/local/libevent
make
make install
cd ..
2. 安装memcached
tar zxvf memcached-1.2.8.tar.gz
cd memcached-1.2.8
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make && make install
cd ..
memcached -u root -d -m 200 -l 127.0.0.1 -p 11211 -P /var/run/memcached.pid
如果启动的时候报错:
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
需要修改:
ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /lib64/libevent-2.0.so.5
3. 安装magent
mkdir magent
cp magent-0.5.tar.gz magent
cd magent
tar zxvf magent-0.5.tar.gz
#vim ketama.h
在开头加入
ifndef SSIZE_MAX
define SSIZE_MAX 32767
endif
#vim Makefile
CFLAGS = -Wall -O2 -g 改为 CFLAGS = -lrt -Wall -O2 -g
mkdir /usr/lib64
cp /usr/local/lib/libevent.a /usr/lib64
ln -s /usr/lib64/libm.so /usr/lib64/libm.a
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
cp magent /usr/bin/magent
cd ..
#执行magent出现以下则表示成功
#magent
please provide -s "ip:port" argument
memcached agent v0.4 Build-Date: Oct 24 2016 11:08:20
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
启动memcached各节点:
memcached1-memcached6
之前已经启动一个节点,需要把之前的节点先kill掉。
#memcached -u root -d -p 11211 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11212 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11213 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11214 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11215 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11216 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
# ps -ef | grep memcached
root 21929 1 0 15:41 ? 00:00:00 memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111
root 21931 1 0 15:41 ? 00:00:00 memcached -u root -d -l 127.0.0.1 -p 11212 -x 127.0.0.1 -X 11111
root 21957 1 0 15:48 ? 00:00:00 memcached -u root -d -l 127.0.0.1 -p 11213 -x 127.0.0.1 -X 11111
root 21959 1 0 15:48 ? 00:00:00 memcached -u root -d -l 127.0.0.1 -p 11214 -x 127.0.0.1 -X 11111
root 21961 1 0 15:48 ? 00:00:00 memcached -u root -d -l 127.0.0.1 -p 11215 -x 127.0.0.1 -X 11111
root 21963 1 0 15:48 ? 00:00:00 memcached -u root -d -l 127.0.0.1 -p 11216 -x 127.0.0.1 -X 11111
-p:指定tcp 监听端口
-d:后台运行memcached
-m:指定最大运行内存,默认64M
-c:是最大的并发连接数
-x #设置从哪个IP上进行数据同步,也就是设置Master的IP
-X #设置数据同步的端口号,默认11212.如11212已经被使用的话,
#需要通过这个参数来设置,否则memcached无法启动
记得启动memcached各个节点的时候,一定要加-x 和-X设置数据同步IP和端口,不能会报错:replication: failed to initialize replication server socket
faild to replication init
magent3:
#magent -u root -n 102400 -l 192.168.16.20 -p 12002 -s 192.168.16.20:11215 -s 192.168.16.20:11216
magent1:
#magent -u root -n 102400 -l 192.168.16.20 -p 12000 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
magent2:
#magent -u root -n 102400 -l 192.168.16.20 -p 12001 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
# ps -ef | grep magent
root 20302 1 0 15:28 ? 00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12002 -s 192.168.16.20:11215 -s 192.168.16.20:11216
root 21886 1 0 15:39 ? 00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12000 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
root 21890 1 0 15:39 ? 00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12001 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
magent1,magent2算法:
1.可以根据magent总入口的个数(此处为2),使用除以2取余的方式,若为0分配到magent1,若为1分配到magent2,这样会实现将请求平均分配到magent1和magent2上
注:
1.若memcached读写的数据多,一定将关掉防火墙或将防火墙设置为不使用跟踪链接表,否则会导致/var/log/message报错“kernel: nf_conntrack: table full, dropping packet”,
2.使用service iptables stop关掉,并且不能用iptables -L -vnx查看,因此使用此命令会将防火墙开启,虽然规则是清空的,但仍会记录连接跟踪表。