10月3号我写了高性能内存缓存对象缓存Memcached原理 (Memcached核心概念,部署),本片将Memcached高可用群集(Memcached主主复制+Keepalived)掌握一下。

memcached高可用集群原理及介绍:

  1. memcached在实现分布式群集部署时,memcached服务之间是不能进行通讯的,分布式也是通过客户端的算法吧数据保存在不同的memcached中,所以当我们做完群集客户端往一个memcached节点写入数据后,另外两个节点是查询不到的。
  2. 那么如何结局额这个问题,就是接下来要做的了。
    memcached这种群集之间不能相互通讯导致了这种情况,这在访问量很大的web网站中是不允许的。所以我们就要使用到一个magent开源软件来解决这个问题。
    magent是一款开源的代理服务软件,我们可以通过他来实现缓存数据的同步,当然这里说的同步不是说memcached之间就能互相通讯了,而是magent可以备份数据,而magent可以同时连接多个memcached节点,当memcached重启或者宕机恢复后可以从magent指定的memcached的备份节点中恢复丢失的缓存数据。

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第1张图片

通过上图来说明一下原理:
1、magent在启动时会指定主的memcached节点与备份的memcached节点,假设我们指定了两个主的缓存节点,一个备份节点,当客户端写入时会通过算法写在其中一个指定的主缓存节点中,并把数据备份到memcached备份节点中,当主节点重启后或者宕机恢复后会从备份节点中恢复丢失的缓存数据。
2、同时magent还可以使用keepalived来实现高可用。具体案例配置步骤如下所示:


案例说明:

* 为解决memcached单点故障,需要实现memcached缓存的高可用。
* 首先,需要实现Memcached的主主复制,指任意一台memcached服务器修改数据都会被同步到另外一台,但是memcached API无法判断连接哪一台服务器,因此需要VIP。
* 其次,通过Keepalived产生的VIP连接memcached服务器,提供高可用架构。

案例拓扑图如下所示:
领会Memcached高可用群集(Memcached主主复制+Keepalived)_第2张图片
案例环境准备:

主机 操作系统 IP地址 主要软件
Memcached 1 Centos7 192.168.72.128 libevent;memcached;keepalived;magent;telnet
Memcached 2 Centos7 192.168.72.129 libevent;memcached;keepalived;telnet
客户端 Centos7 192.168.72.130 telnet

百度网盘免密提供软件包:
https://pan.baidu.com/s/1aEM27okhC2DK00EhFC9LBw

案例实施过程:

1.首先给两个服务器安装Memcached

* 安装环境包(两台服务器同装):
* systemctl stop firewalld.service      #关闭防火墙
* setenforce 0                                  #关闭增强性安全功能
* yum install gcc gcc-c++ make -y    #安装锁需要的环境包

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第3张图片

* 解压下载好的libevent、memecached包到/opt下:
* tar zxvf libevent-2.1.8-stable.tar.gz -C /opt 
* tar zxvf memcached-1.5.6.tar.gz -C /opt

领会Memcached高可用群集(Memcached主主复制+Keepalived)

* 接下来手工编译安装(注意:libevent在先 memcached在后)
* cd /opt/libevent-2.1.8-stable/      #手工编译安装libevent
     ./configure --prefix=/usr
* make && make install
* cd /opt/memcached-1.5.6/              #手工编译安装memcached
    ./configure --with-libevent=/usr   
* make && make install

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第4张图片
领会Memcached高可用群集(Memcached主主复制+Keepalived)_第5张图片

2.在主服务器上安装magent

* 解压下载好的magent包到/opt/magent/下
* tar zxvf magent-0.5.tar.gz -C /opt/magent/    

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第6张图片

* 编辑配置文件:
* cd /opt/magent
* vim ketama.h                 #文件开头修改
   #ifndef SSIZE_MAX
   #define SSIZE_MAX 32767
   #endif                          #删除最后那个endif

* vim Makefile 
   LIBS = -levent -lm         #注意空格 

* make                             #安装magent
* ls                                    #查看magent可执行程序

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第7张图片
领会Memcached高可用群集(Memcached主主复制+Keepalived)
领会Memcached高可用群集(Memcached主主复制+Keepalived)_第8张图片

* 将magent程序复制到memcached从服务器上:
* scp magent 192.168.72.129:/usr/bin

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第9张图片
3.接下来主服务器上安装keepalived

* yum install keepalived -y     #yum安装
* 安装完成修改配置文件:
* vim /etc/keepalived/keepalived.conf 
//12行
router_id MAGENT_HA
删除13-16 (vrrp)
//在global_defs下添加
vrrp_script magent {
     script "/opt/shell/magent.sh"
     interval 2                   #时间间隔2s
}
vrrp_instance VI_1 {    
......
interface ens33             #修改
......
track_script {                 #调用-添加 ;注意括号
       magent
}
virtual_ipaddress          #修改
           192.168.72.100
     }                                #定义虚拟地址
}                                     #剩余全删除   

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第10张图片
领会Memcached高可用群集(Memcached主主复制+Keepalived)_第11张图片
4.接下来从服务器上安装keepalived

* yum install keepalived -y                       #yum安装keepalived
* cd /etc/keepalived/
* mv keepalived.conf keepalived.conf.bk           #修改配置文件名
* scp keepalived.conf [email protected]:/etc/keepalived/    #主服务器上推送keepalived已经修改好的配置文件
* vi keepalived.conf
  router_id MAGENT_HB
  state BACKUP
  virtual_router_id 52
  priority 90

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第12张图片
领会Memcached高可用群集(Memcached主主复制+Keepalived)_第13张图片
领会Memcached高可用群集(Memcached主主复制+Keepalived)_第14张图片
5.到此主从两台服务器上keepalived已经安装配置完成,接下来在主和从服务器写入keepalived配置文件加载的脚本

* 建一个脚本存放目录:
* mkdir /opt/shell
* 编写脚本:
* 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.72.100 -p 12000 -s 192.168.37.128:11211 -b 192.168.37.130:11211
else
pkill -9 magent
fi 

-n 51200                      #定义用户最大连接数
-l 192.168.37.188        #指定虚拟IP
-p 12000                     #指定端口号
-s                                #指定主缓存服务器
-b                                  #指定从缓存服务器
chmod +x magent.sh                #添加执行权限

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第15张图片

* 主从服务器开启keepalived服务:
* systemctl start keepalived.service
* netstat -ntap | grep 12000               #开启较慢,确认magent运行

领会Memcached高可用群集(Memcached主主复制+Keepalived)

  • 确认主从服务器漂移地址生效
  • 主服务器:
    领会Memcached高可用群集(Memcached主主复制+Keepalived)_第16张图片
  • 从服务器:
    领会Memcached高可用群集(Memcached主主复制+Keepalived)_第17张图片
    6.主从服务器开启memecached
  • 主服务器:
  • memcached -m 512k -u root -d -l 192.168.72.128 -p 11211
  • netstat -ntap | grep 11211
  • yum install telnet -y #安装远程登录工具
  • telnet 192.168.72.128 11211 #本地登录
    
    ![](https://s1.51cto.com/images/blog/201810/19/adf324951eef2e8963624f10ada3cf40.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
* 从服务器:
* memcached -m 512k -u root -d -l 192.168.72.129 -p 11211
* netstat -ntap | grep 11211
* yum install telnet -y
* telnet 192.168.72.129 11211

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第18张图片

7.客户端测试

* 安装telnet工具,连接VIP,写入数据:
* yum install telnet -y
* telnet 192.168.72.100 12000
   add username 0 0 4
   1234

领会Memcached高可用群集(Memcached主主复制+Keepalived)_第19张图片

  • 主服务器可以看到写入的内容:
    领会Memcached高可用群集(Memcached主主复制+Keepalived)_第20张图片
  • 从服务器可以看到写入的内容:
    领会Memcached高可用群集(Memcached主主复制+Keepalived)_第21张图片
  • 如果断掉一台memcached,再次访问,客户端仍然可以连接:
    领会Memcached高可用群集(Memcached主主复制+Keepalived)_第22张图片
    领会Memcached高可用群集(Memcached主主复制+Keepalived)_第23张图片
    仍然可以看到!

    本篇总结:

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