实验拓扑

memcached实现主主复制和keepalive高可用方式_第1张图片

实验环境

服务器 IP地址 操作系统 主要软件
memcached1 192.168.144.122 centos7.3 libevent2.1.8、memcached1.5.6、keepalive、telnet、magent0.5
memcached2 192.168.144.129 centos7.3 libevent、memcached、keepalive、telnet
客户端 192.168.144.141 centos7.3 LAMP架构或telnet

memcached1的配置

tar zvxf memcached-1.5.6.tar.gz -C /opt/
tar zvxf libevent-2.1.8-stable.tar.gz -C /opt/

  • 1、首先安装libevent,指定安装路径即可,memcached2上相同操作

cd /opt/libevent-2.1.8-stable
./configure --prefix=/usr/local/libevent
make && make install

  • 2、安装memcached,memcached2上相同操作

cd /opt/memcached-1.5.6
./configure \
--prefix=/usr/local/memcached \
--with-libevent=/usr/local/libevent/ #需要跟上事件通知库模块

make && make install

  • 3、让memcached命令可以让系统识别,memcached2上相同操作

ln -s /usr/local/memcached/bin/* /usr/local/bin/

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

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

  • 5、memcached1安装magent,并且将生成的命令发送给memcached2,并在每一台服务器上该命令可以被系统识别。

tar magent-0.5.tar.gz -C /opt/
cd /opt
vi ketama.h

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

systemctl stop firewalld.service
setenforce 0
vi Makefile

LIBS = -levent -lm -L/usr/local/libevent/lib   //注意libevent的安装路径,否则make会报错
INCLUDE = -I/usr/local/libevent/include
  • 6、生成magent程序
  • 此处需要注意,在magent生成可执行程序之前需要关闭防火墙,不然无法make。

make

  • 7、让magent程序为系统识别

cp magent /usr/local/bin/

  • 8、将magent程序发送给memcached2,让其系统识别

scp magent [email protected]:/usr/bin/

两台服务器安装keepalived

  • m1与m2两台服务器keepalive配置文件不同地方已经注明。

yum install keepalved -y
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id 001    //两台服务器不同
}

vrrp_script magent {                    //添加主主数据复制实例,函数名为magent,只要keepalive启动就可启动复制
        script "/opt/shell/magent.sh"   //设置magent启动脚本,注意后面脚本位置要与之相同
        interval 2
}

vrrp_instance VI_1 {
    state MASTER   //从为BACKUP
    interface ens33    //网卡为ens33
    virtual_router_id 51   //与从服务器需要区别开
    priority 100       //从服务器优先级应当比主的低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
track_script {              //调用函数执行
            magent
}
    virtual_ipaddress {
        192.168.144.188    //设置虚拟IP
    }
}

memcached1创建主主复制监控脚本

cd /opt/shell #没有该目录,需要创建
vim 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.144.188 -p 12000 -s 192.168.144.122:11211 -b 192.168.144.129:11211
else
pkill -9 magent
fi

-n 51200 //定义用户最大连接数
-l 192.168.175.188 //指定虚拟IP
-p 12000 //指定端口号
-s //指定主缓存服务器
-b //指定从缓存服务器

  • 增加执行权限。

chmod +x /opt/shell/magent.sh

  • memcached1上开启keepalive服务,以及memcache服务

memcached -d -m 32m -p 11211 -u root
systemctl start keepalived.service

memcached2创建主主复制监控脚本

vi magent.sh #注意脚本位置要跟配置文件中对应,不然调用执行

#!/bin/bash
K=`ip addr | grep 192.168.144.188 | grep -v grep | wc -l`
if [ $K -gt 0 ]; then
        magent -u root -n 51200 -l 192.168.144.188 -p 12000 -s 192.168.144.122:11211 -b 192.168.144.129:11211
else
pkill -9 magent
fi  
  • 增加执行权限。

chmod +x /opt/shell/magent.sh

  • memcached2上开启keepalive服务,以及memcache服务

memcached -d -m 32m -p 11211 -u root
systemctl start keepalived.service

在客户端测试

  • 在客户端访问虚拟IP及虚拟端口

telnet 192.168.144.188 12000

  • 在客户端写入数据
  • 在两台服务器上进入本身数据库,数据被自动同步复制

add username 0 0 7
1234567

  • 模拟故障,关闭m1的keepalive,客户端无感知,虚拟IP仍可登陆,且读写数据

systemctl stop keepalived.service