Memcached +keepalived 高可用集群

Memcached 主主复制这种架构,在程序连接时不知道应该连接哪个主服务器,所以需要在前端增加 VIP 地址,实现高可用架构。这里用 Keepalived 实现,因而 Keepalived 的作用就是用来检测 Memcached 服务器的状态是否正常。   Keepalived 不断检测 Memcached 主服务器的11211端口,如果检测到 Memcached 服务发生宕机或者死机等情况,就会将 VIP 从主服务器移至从服务器,从而实现 Memcached 的高可用性。  

系统环境

| 主机名 | 操作系统 | IP地址 | 软件包 | VIP地址 | | -------- | -------- | -------- | | Memcached1服务器 | CentOS 7.4 x86_64 | 192.168.100.201 | libevent-2.1.8-stable.tar.gz、memcached-1.5.9.tar.gz、magent-0.5.tar.gz、keepalived | 192.168.100.200 | | Memcached2服务器 | CentOS 7.4 x86_64 | 192.168.100.202 | libevent-2.1.8-stable.tar.gz、memcached-1.5.9.tar.gz、keepalived | 192.168.100.200 | | Client客户端 | CentOS 7.4 x86_64 | 192.168.100.203 | Telnet |   |

部署服务

 

配置memcached主缓存节点和从缓存节点-----两台配置相同

 

# tar zxvf memcached-1.5.6.tar.gz -C /opt/
# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/
# yum install gcc gcc-c++ make -y
 
# cd /opt/libevent-2.1.8-stable
# ./configure --prefix=/usr/local/libevent
# make && make install
 
# cd /opt/memcached-1.5.6
# ./configure \
--prefix=/usr/local/memcached \
--with-libevent=/usr/local/libevent/
# make && make install
 
# ln -s /usr/local/memcached/bin/* /usr/local/bin/

 

  • 将安装的libevent-2.1.so.6模块建立软链接到/usr/lib64目录下,否则在启动Magent时会出错
# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/libevent-2.1.so.6

 

在主服务器上安装 Magent

 

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

  • 主服务器
# wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
# mkdir /opt/magent
# tar zxvf magent-0.5.tar.gz -C /opt/magent
# cd /opt/magent
  • 编译安装前需要先修改文件,否则会报错
# vim ketama.h   //修改下面的行
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
#endif
 
# vim Makefile  //添加路径
    LIBS = -levent -lm -L/usr/local/libevent/lib 
    INCLUDE=-I/usr/local/libevent/include
 
# make 
  • 编译后会生成一个可执行的文件,我们把生成的magent命令让系统识别,并发送到Memcached2服务器
# cp magent /usr/bin/      //把生成的magent命令让系统识别
# scp /opt/magent/magent root@192.168.100.202:/usr/bin    //把生成的magent命令复制到memcached2服务器

 

在两台memcached服务器上安装配置Keepalived

  • memcached两台服务器的配置不同处已经标注
# yum install keepalived -y
# vim /etc/keepalived/keepalived.conf 
 router_id MAGENT_HA               //主从不同 自定义
    下面删除4行
}
 
//调用这个脚本每2秒检查一次magent状态
vrrp_script magent {
                script "/opt/shell/magent.sh"
                interval 2
}
vrrp_instance VI_1 {
        state MASTER                    // 另一台服务器这里是BACKUP
        interface ens33                  
        virtual_router_id 51             //虚拟路由ID ,两台相同
        priority 100                         //优先级  从要小于主
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 1111
        }
track_script {              //调用上面定义的脚本
                magent
}
 
virtual_ipaddress {                       //定义VIP地址
192.168.100.200
}
}
  • 在两台服务器上创建magent.sh脚本便于keepalived调用
  • memcached1服务器
# mkdir -p /opt/shell/
# cd /opt/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.100.200 -p 12000 -s 192.168.100.201:11211 -b 192.168.100.202:11211
else
pkill -9 magent
fi
  • 脚本添加执行权限,并开启keepalived服务
# chmod +x magent.sh
# systemctl start keepalived.service
# ip addr    //查看VIP的IP地址
  • 脚本选项解释
-n 51200 //定义用户最大连接数
-l    //指定虚拟IP
-p 12000  //指定端口号
-s //指定主缓存服务器
-b //指定从缓存服务器
  • memcached2服务器
# mkdir -p /opt/shell/
# cd /opt/shell/
# vi magent.sh
 
#!/bin/bash
K=`ip addr | grep 192.168.100.200 | grep -v grep | wc -l`
if [ $K -gt 0 ]; then
        magent -u root -n 51200 -l 192.168.100.200 -p 12000 -s 192.168.100.201:11211 -b 192.168.100.202:11211
else
pkill -9 magent
fi
  • 脚本添加执行权限,并开启keepalived服务
# chmod +x magent.sh
# systemctl start keepalived.service

   

在客户端上测试

  • 测试主主复制

我们在客户端上使用Telnet登录VIP地址并写入数据,在两台memcached缓存服务器上可以看到数据都已经同步

  • 测试高可用性

将memcached1服务器宕机,登录memcached2服务器,查看IP地址,此时VIP已经漂移到memcached2服务器上