memcache主从复制——keepalived高可用群集部署

一、memcache集群介绍

memcached群集作用主要解决服务器单点故障。不做群集部署,服务器之间不会复制
同步数据,一旦宕机数据就会丢失,无法有效的为后台web服务器等减轻并发连接压力。所以,
我们采用群集服务去解决这个问题,使用多台memcached做群集部署,即时有一两台服务器宕机,也不会影响用户正常体验,同时也减少后台服务的并发连接压力。

1、keepalived+memcached高可用

客户端连接两台服务器之间的VIP地址,如果后端服务器故障自动切换。

2、Keepalive原理:

  1. 故障检测:
    Keepalived的作用是检测memcached服务器的状态是否正常。

  2. 主从切换:
    Keepalived如果检测到memcached服务发生DOWN机或者死机等,能将VIP从主服务器移至从服务器

  3. 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,客户端依然可以查看到数据,主从复制成功----------测试正常

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值