目录:

1·Memcached 主主复制概念
2·Memcached 高可用的实现
3·案例部署
4·总结


Memcached 主主复制概念

(1)主主复制概念:

Memcached 主主复制是指在任意一台 Memcached 服务器修改数据都会被同步到另外一台,但是 Memcached API 客户端无法判断连接到那一台 Memcached 服务器,所有需要设置 VIP 地址,提供给 Memcached API 客户端进行连接。


(2)文章推荐:

知道了主主复制,那么需要了解 Memcached 是什么,还有一些最基本的情况,比如:
1) Memcached 功能
2)Memcached 特征
3)Memcached 储存方式
可以看看上篇文章Memcached 高性能缓存对象


Memcached 高可用的实现

(1)怎么实现 Memcached 的高可用

1)这里就需要牵扯到主主复制的概念了,因为Memcached 主主复制这种架构,在程序连接的时候不会知道应该连接哪一个主服务器,所以需要在前端加上 VIP 地址,实现高可用架构。这里可以用 Keepalived 实现,所以说,Keepalived 的作用就是来检测 Memcached 服务器的状态是否正常。


2)Keepalived 会不断的检测 Memcached 主服务器的 11211端口,如果检测到 Memcached 服务发生故障或宕机等情况,就会将 VIP 从主服务器上转移到从服务器,从而实现 Memcached 的高可用性。


3)Memcached 高可用架构图
Memcached 主主复制 + Keepalived 高可用架构【附上原理】


案例部署说明

(1)部署环境文字说明:

1)因为这篇文章是演示 Memcached 的主主复制+ Keepalived 的高可用架构,所以这里不需要安装 Memcached API 。请提前安装编译环境:gcc 、gcc-c++ 、 make ,文章中不会提示安装!


2)整个环境部署所需要的源码包将会无偿提供,需要的请点击:Memcached 高可用源码包,密码:sxsr


(2)部署环境表格说明:

名称 IP 地址 操作系统 主要软件包
Memcached 主1 192.168.154.128 CenOS 7.4 libevent-2.1.8-stable.tar.gz 、memcached-1.5.6.tar.gz 、 magent-0.5.tar.gz
Memcached 主2 192.168.154.129 CenOS 7.4 libevent-2.1.8-stable.tar.gz 、memcached-1.5.6.tar.gz
Linux 系统 192.168.154.130 CenOS 7.4 telnet 用于测试

开始部署

(1)在 Memcached 主1解压、安装 所需要的源码包
1)关闭防火墙

[root@localhost memcached]# systemctl stop firewalld.service
[root@localhost memcached]# setenforce 0

2)解压、安装源码包 libevent-2.1.8-stable.tar.gz

[root@localhost memcached]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/
[root@localhost memcached]# cd /opt/libevent-2.1.8-stable
[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr ---(指定安装路径)
[root@localhost libevent-2.1.8-stable]# make && make install
[root@localhost libevent-2.1.8-stable]# ln -s /usr/lib/libevent-2.1.so.6  /usr/lib64/libevent-2.1.so.6 --(这里必须将模块做一个软连接,因为启动 Memcached 时需要在/usr/lib64下寻找libevent-2.1.so.6模块)

3)解压、安装源码包 memcached-1.5.6.tar.gz

[root@localhost memcached]# tar zxvf memcached-1.5.6.tar.gz -C /opt
[root@localhost memcached]# cd /opt/memcached-1.5.6
[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usr ---(这里安装需要指定 libevent 的安装路径)
[root@localhost memcached-1.5.6]# make && make install

4)安装、解压软件包 magent-0.5.tar.gz

[root@localhost ~]# mkdir /opt/magent
[root@localhost memcached]# tar xvf magent-0.5.tar.gz -C /opt/magent
将会得出以下文件:
ketama.c
magent.c
ketama.h
Makefile
[root@localhost memcached]# cd /opt/magent
[root@localhost magent]# vim ketama.h  ---(现在没有 make 文件,需要修改才能得出 make 执行文件)
修改如下:
#ifndef SSIZE_MAX 
#define SSIZE_MAX 32767

Memcached 主主复制 + Keepalived 高可用架构【附上原理】

[root@localhost magent]# vim Makefile ---(继续修改文件)
修改内容:
LIBS = -levent -lm

Memcached 主主复制 + Keepalived 高可用架构【附上原理】

[root@localhost magent]# make ----(文件修改完成后就可以 make)
[root@localhost magent]# cp magent /usr/bin

(2)在 Memcached 主2 解压、安装 所需要的源码包
1)关闭防火墙

[root@localhost memcached]# systemctl stop firewalld.service
[root@localhost memcached]# setenforce 0

2)解压、安装源码包 libevent-2.1.8-stable.tar.gz

[root@localhost memcached]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/
[root@localhost memcached]# cd /opt/libevent-2.1.8-stable
[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr ---(指定安装路径)
[root@localhost libevent-2.1.8-stable]# make && make install
[root@localhost libevent-2.1.8-stable]# ln -s /usr/lib/libevent-2.1.so.6  /usr/lib64/libevent-2.1.so.6 --(这里必须将模块做一个软连接,因为启动 Memcached 时需要在/usr/lib64下寻找libevent-2.1.so.6模块)

3)解压、安装源码包 memcached-1.5.6.tar.gz

[root@localhost memcached]# tar zxvf memcached-1.5.6.tar.gz -C /opt
[root@localhost memcached]# cd /opt/memcached-1.5.6
[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usr ---(这里安装需要指定 libevent 的安装路径)
[root@localhost memcached-1.5.6]# make && make install

4)把 主1 的 magent 文件,远程拷贝一份到 主 2 ,这里需要在 主1 上操作

[root@localhost magent]# yum install telnet -y ----(安装远程连接工具)
[root@localhost magent]# scp magent root@192.168.154.129:/usr/bin ---(发送给主 2 一份 )

(3)在 主 1 、主 2 上同时安装 Keepalived 软件
1)安装 Keepalived 、修改 Keepalived 配置文件

[root@localhost ~]# yum install keepalived -y
[root@localhost ~]# vim /etc/keepalived/keepalived.conf  ---(修改Keepalived主配置文件)
! Configuration File for keepalived

vrrp_script magent {                              #定义函数
        script "/opt/shell/magent.sh"           #临时定义的路径,所以还需要手动创建
        interval 2                                        #每隔两秒检测
}
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id Master_A         #定义id名称,主 2  可以任意修改
     以下几行需要删除
}   

vrrp_instance VI_1 {
        state MASTER                                 #定义状态,主 2  定义为 BANKUP
        interface ens33                                #WANG
    virtual_router_id 51
    priority 100                                      #优先级,主 2 要低于 主 1
    advert_int 1
    authentication {
        auth_type PASS                          #身份验证,这里需要和 主2 一致
        auth_pass 1111
    }

track_script {                                          #开始调用函数
        magent
}

    virtual_ipaddress {                            #定义VIP 漂移地址
        192.168.154.188
    }
}
以下所有配置删除

2)编写触发式脚本

[root@localhost ~]# mkdir /opt/shell   ----(这里路径需要和 Keepalived 主配置文件里路径一致)

[root@localhost ~]# vim /opt/shell/magent.sh
内容如下:
K=$(ps -ef | grep keepalived | grep -v grep | wc -l)
if [ $K -gt 0 ];then
magent -u root -n 51200 -l 192.168.154.188 -p 12000 -s  192.168.154.128:11211 -b 192.168.154.129:11211
else
pkill -9 magent
fi

对以上参数说明:
-n 51200 //定义用户最大连接数
-l 192.168.154.188 //指定虚拟ip
-p 12000 //指定端口号
-s //指定主缓存服务器
-b //指定从缓存服务器

[root@localhost shell]# scp magent.sh root@192.168.154.129:/opt/shell ----(发送给 主 2 一份,就不用在 主2 上写了)


3)给与脚本执行权限、并启动 Keepalived 服务

[root@localhost ~]# chmod +x /opt/shell/magent.sh
[root@localhost keepalived]# scp keepalived.conf root@192.168.154.129:/etc/keepalived  ----(发送配置文件给 主 2)
[root@localhost keepalived]# systemctl start keepalived.service  ---(启动 keepalived 服务)
[root@localhost keepalived]# netstat -antp | grep 12000 ----(查看启动端口)
tcp        0      0 192.168.154.188:12000   0.0.0.0:*               LISTEN      51911/magent 

4)启动 memcached 服务

[root@localhost ~]# memcached -m 512k -u root -d -l 192.168.154.128 -p 11211
[root@localhost ~]# netstat -antp | grep 11211 -----(查看端口)
tcp        0      0 192.168.154.128:11211   0.0.0.0:*               LISTEN      53856/memcached

5)在 主 2 上启动 Keepalived 与 Memcached 服务、创建目录

[root@localhost ~]# mkdir /opt/shell
[root@localhost shell]# systemctl start keepalived.service 
[root@localhost shell]# netstat -antp | grep 12000
tcp        0      0 192.168.154.188:12000   0.0.0.0:*               LISTEN      50521/magent 
[root@localhost ~]# memcached -m 512k -u root -d -l 192.168.154.129 -p 11211
[root@localhost ~]# netstat -antp | grep 11211

(4)服务搭建完成,开始在客户端测试主主复制:
1)客户端连接漂移地址写入数据

[root@localhost ~]# yum install telnet -y
[root@localhost ~]# telnet 192.168.154.188 12000 -----(远程连接VIP 地址 端口号 为 12000)
开始写入数据:
add username 0 0 6
123456
STORED

2)客户端连接 主1 的 真实 IP 地址 端口 11211 ,查看数据

[root@localhost ~]# telnet 192.168.154.128 12000
get username  -----(查看数据)
VALUE username 0 6   ----(写入的数据存在)
123456
END

如下图:
Memcached 主主复制 + Keepalived 高可用架构【附上原理】


3)客户端连接 主 2 的真实 IP 地址 端口 11211, 查看数据

[root@localhost ~]# telnet 192.168.154.129 11211
get username
VALUE username 0 6
123456
END

如下图:
Memcached 主主复制 + Keepalived 高可用架构【附上原理】


(5)开始验证,Keepalived 的高可用:
[root@localhost shell]# systemctl stop keepalived.service ------(停止主1 keepalived 服务)
[root@localhost ~]# telnet 192.168.154.188 12000 ----(客户端再次连接漂移地址,如果能连接成功,高可用成功)
[root@localhost ~]# ip addr ----(在 主 2 上查看漂移地址)
如下图:
Memcached 主主复制 + Keepalived 高可用架构【附上原理】

结论:

1·Memcached 是分布式内存对象缓存系统,因为所有数据都存储在内存中,从而常用于网站加速
2·Memcached 分布式实现不是在服务端实现而是在客户端实现的
3·Memcached 可以通过 Keepalived 实现 Memcached 服务的高可用性。