一、memcache集群介绍
memcached群集作用主要解决服务器单点故障。不做群集部署,服务器之间不会复制
同步数据,一旦宕机数据就会丢失,无法有效的为后台web服务器等减轻并发连接压力。所以,
我们采用群集服务去解决这个问题,使用多台memcached做群集部署,即时有一两台服务器宕机,也不会影响用户正常体验,同时也减少后台服务的并发连接压力。
1、keepalived+memcached高可用
客户端连接两台服务器之间的VIP地址,如果后端服务器故障自动切换。
2、Keepalive原理:
-
故障检测:
Keepalived的作用是检测memcached服务器的状态是否正常。 -
主从切换:
Keepalived如果检测到memcached服务发生DOWN机或者死机等,能将VIP从主服务器移至从服务器 -
Keepalived如何发现memcached异常:
◆ keepalived在memcached主服务器产生一个虚拟IP
◆ keepalived可以通过不断的检测memcached主服务器的11211端口是否正常工作,如果发现memcached Down机,虚拟IP就从主服务器移到从服务器
在此架构中,keepalice只是为了提供一个虚拟ip,哪怕主服务器挂了,客户端也是不知情的,访问原来的提供的虚拟ip,真正实现同步的是magent
3、高可用架构应用场景:
-
如果memcached分布式节点比较多,那么完全不需要做基于复制的高可用架构。
-
基于复制的高可用架构一般用在memcached单节点存放缓存或者session。
4、magent软件介绍
-
由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,会出现单点故障,如果需要实现HA,则需要通过另外的方式来解决。
-
通过Magent缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存连接服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。如果其中一台缓存服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性。
-
memcache键值存储:这个存储过程需要程序员来实现。程序员生成key-value。一般memcache用来缓存静态内容。主节点服务停止,程序上要自动调整到备份节点上。主节点服务恢复后缓存需要重新生成。
-
magent是memcache的补充,magent下memcache分主备,主节点分散存储所有的键值数据 ,备节点存储一个完整的所有键值数据。magent解决了memcache的不能节点分布式问题。
-
为解决memcached单点故障,需要实现memcached缓存的高可用。
-
首先,需要实现Memcached的主主复制,指任意一台memcached服务器修改数据都会被同步到另外一台,但是memcached API无法判断连接哪一台服务器,因此需要VIP。
其次,通过Keepalived产生的VIP连接memcached服务器,提供高可用架构。
二、具体搭建步骤
实验设计
主服务器(192.168.10.10)----安装事件,memcache服务端、keepalived、magent、Telnet
从服务器(192.168.10.20)----安装事件,memcache服务端、keepalived、Telnet
客户端(192.168.10.30)-------安装Telnet
主从绑定VIP192.168.10.200
部署master(192.168.10.10)
1.安装环境
[root@localhost ~]# yum install -y gcc-c++ gcc make
[root@localhost ~]# yum -y install telnet ##用于连接memcache
2.安装事件库
[root@localhost ~]# tar zvxf libevent-2.1.8-stable.tar.gz -C /opt/
[root@localhost ~]# cd /opt/libevent-2.1.8-stable
[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr/ ##配置事件通知库,要在安装memcache前安装
[root@localhost libevent-2.1.8-stable]# make -j3 && make install
3.安装memcache
[root@localhost ~]# tar zvxf memcached-1.5.6.tar.gz -C /opt/
[root@localhost ~]# cd /opt/memcached-1.5.6/
[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usr/
[root@localhost memcached-1.5.6]# make && make install
4.解压magent代理工具
[root@localhost ~]# mkdir /opt/magent
[root@localhost ~]# tar zvxf magent-0.5.tar.gz -C /opt/magent
ketama.c
magent.c
ketama.h
Makefile
[root@localhost ~]# cd /opt/magent/
[root@localhost magent]# ls
ketama.c ketama.h magent.c Makefile
[root@localhost magent]# vim /opt/magent/ketama.h
#ifndef SSIZE_MAX ##修改这两条声明
#define SSIZE_MAX 32767
……
#endif
[root@localhost magent]# vim /opt/magent/Makefile
LIBS = -levent -lm ##在这句话后面加上 -lm
[root@localhost magent]# make
[root@localhost magent]# ls ##make编译完成后,可以看到多了magent执行文件
[root@localhost magent]# cp magent /usr/bin/ ##将magent执行文件放到/usr/bin/目录下,便于系统识别
5.安装并配置keepalived
[root@localhost ~]# yum -y install keepalived
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
#----------------- 插入下面配置 定义一个函数执行编写的脚本 ---------------------------#
vrrp_script magent {
script "/opt/shell/magent.sh" ##指定脚本路径
interval 2 ##时间间隔2秒
}
#-------------------------------------------------------------------------------------------#
global_defs {
……省略部分
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id MAGENT_HA ##自定义router-id,不重复即可。剩下的四条无用,删掉
}
vrrp_instance VI_1 {
state MASTER ##类型是master
interface ens33 ##接口要改成和自己匹配的,如ens33
virtual_router_id 51
priority 100 ## 优先级,从服务器要比主服务器的低
advert_int 1
authentication {
auth_type PASS ##认证类型
auth_pass 1111 ##密码,两边一样即可,都不需要改,这里改了,从服务器也要更改
}
#--------------track_script 来调用脚本,中间填上面定义的函数名magent-------------------
track_script {
magent ##调用之前定义的函数
}
#------------- 注意这段调用语句的插入位置,不能插入到其他的子括号{}中------------------
virtual_ipaddress {
192.168.10.200 ##定义漂移地址,一个就可以
}
} ##剩下的全部删除
6.编写magent代理keepalived访问脚本
[root@localhost ~]# mkdir /opt/shell
[root@localhost ~]# cd /opt/shell/
[root@localhost shell]# vi magent.sh ##编写脚本
#!/bin/bash
K=$(ps -ef |grep keepalived |grep -v grep |wc -l)
if [[ $K -gt 0 ]]
then
magent -u root -n 51200 -l 192.168.10.200 -p 12000 -s 192.168.10.10:11211 -b 192.168.10.20:11211
else
pkill -9 magent
fi
[root@localhost shell]# systemctl restart keepalived.service
[root@localhost shell]# netstat -anupt |grep 12000 ##对keepalived服务做了代理映射,端口12000
tcp 0 0 192.168.10.200:12000 0.0.0.0:* LISTEN 48520/magent
[root@localhost ~]# chmod +x magent.sh ##给执行权限
################magent脚本选项含义#############
-n 51200 //定义用户最大连接数
-l 192.168.10.200 //指定虚拟IP
-p 12000 //指定端口号,相当于代理端口映射,将keepalived端口映射为12000
-s //指定主缓存服务器
-b //指定从服务器
################################################
7.启动keepalived
[root@localhost shell]# systemctl restart keepalived.service
[root@localhost shell]# netstat -anupt |grep 12000
tcp 0 0 192.168.10.200:12000 0.0.0.0:* LISTEN 48520/magent
[root@localhost ~]# vim /var/log/messages ##查看系统日志,可以查看到MASTER的状态(用/MASTER匹配查找)
……省略部分
Nov 6 08:04:08 localhost Keepalived_vrrp[46502]: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov 6 08:04:09 localhost Keepalived_vrrp[46502]: VRRP_Instance(VI_1) Entering MASTER STATE
[root@localhost shell]# ip addr ##查看网卡,在ens33上可以看到VIP地址(注意:使用ifconfig查看不到)
……省略部分
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
……省略部分
inet 192.168.10.20/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.200/32 scope global ens33 ##VIP地址
valid_lft forever preferred_lft forever
inet6 fe80::7749:799e:fca2:8347/64 scope link
8.启动memcache
[root@localhost ~]# memcached -m 512k -u root -d -l 192.168.10.10 -p 11211 ##开启主memcache
[root@localhost ~]# netstat -anpt |grep 11211
tcp 0 0 192.168.10.10:11211 0.0.0.0:* LISTEN 63158/memcached
部署backup
1.安装环境
[root@localhost ~]# yum install -y gcc-c++ gcc make
[root@localhost ~]# yum -y install telnet ##用于连接memcache
2.安装事件库
[root@localhost ~]# tar zvxf libevent-2.1.8-stable.tar.gz -C /opt/
[root@localhost ~]# cd /opt/libevent-2.1.8-stable
[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr/ ##配置事件通知库,要在安装memcache前安装
[root@localhost libevent-2.1.8-stable]# make -j3 && make install
3.安装memcache
[root@localhost ~]# tar zvxf memcached-1.5.6.tar.gz -C /opt/
[root@localhost ~]# cd /opt/memcached-1.5.6/
[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usr/
[root@localhost memcached-1.5.6]# make && make install
4.安装keepalived
[root@localhost ~]# yum -y install keepalived
5.远程拷贝主memcache上的magent执行文件和keepalived配置文件
[root@localhost ~]# scp root@192.168.10.20:/opt/magent/magent /usr/bin/ ##将magent执行文件scp到从服务器上,就可以免去安装magent了
[root@localhost ~]# scp root@192.168.10.10:/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf ##将主服务器上的配置cp过来修改即可
6.基于主服务器keepalived基础上进行修改
[root@localhost ~]# vim /etc/keepalived/keepalived.conf ##只需要基于master的配置上稍加修改即可
vrrp_script magent {
script "/opt/shell/magent.sh"
interval 2
}
global_defs {
……省略部分
router_id MAGENT_HB ##router_id改成"MAGENT_HB",(主的是MAGENT_HA)不一样即可
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 52 ##vid也需要改,改成52,(主的是51)
priority 90 ##优先级要改,改成90,(主的是100),要低于主的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
magent
}
virtual_ipaddress {
192.168.10.200
}
}
7.制作代理脚本
[root@localhost ~]# mkdir /opt/shell
[root@localhost ~]# cd /opt/shell/
[root@localhost shell]# vi magent.sh ##编写脚本
#!/bin/bash
K=$(ps -ef |grep keepalived |grep -v grep |wc -l)
if [[ $K -gt 0 ]]
then
magent -u root -n 51200 -l 192.168.10.200 -p 12000 -s 192.168.10.10:11211 -b 192.168.10.20:11211
else
pkill -9 magent
fi
[root@localhost shell]# chmod +x magent.sh ##给执行权限
[root@localhost shell]# systemctl restart keepalived.service ##启动keepalived服务
[root@localhost shell]# netstat -anupt |grep 12000 ##对keepalived服务做了代理映射,端口12000
tcp 0 0 192.168.10.200:12000 0.0.0.0:* LISTEN 48520/magent
[root@localhost shell]# ip addr ##查看网卡,在ens33上可以看到VIP地址(注意:使用ifconfig查看不到)
……省略部分
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
……省略部分
inet 192.168.10.20/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.200/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::7749:799e:fca2:8347/64 scope link
8.启动从服务器
[root@localhost shell]# memcached -m 512k -u root -d -l 192.168.10.20 -p 11211 ##开启从memcache
[root@localhost shell]# netstat -anpt |grep 11211
tcp 0 0 192.168.10.20:11211 0.0.0.0:* LISTEN 54985/memcached
客户端连接memcache测试
1.客户端登入VIP连接memcache,并写入数据
[root@localhost ~]# yum -y install telnet ##安装Telnet
[root@localhost ~]# telnet 192.168.10.200 11211 ##客户端访问成功
Trying 192.168.10.200...
Connected to 192.168.10.200.
Escape character is '^]'.
add name 0 0 7
zhaoliu
STORED
get name
VALUE name 0 7
zhaoliu
END
2.去两台真实服务器查看
[root@localhost ~]# telnet 192.168.10.20 11211
Trying 192.168.10.20...
Connected to 192.168.10.20.
Escape character is '^]'.
get name ##查看到数据
VALUE name 0 7
zhaoliu
END
[root@localhost ~]# telnet 192.168.10.10 11211
Trying 192.168.10.100...
Connected to 192.168.10.100.
Escape character is '^]'.
get name ##查看到数据
VALUE name 0 7
zhaoliu
END
-------关闭一台主memcache的keepalived,客户端依然可以查看到数据,主从复制成功----------测试正常