目录
一.memcached集群分析
magent分析
- 由于memcached在实现分布式集群部署时,memcached服务之间是不能进行通讯的,分布式也是通过客户端的算法,把数据保存在不同的memcached中,所以当昨晚群集客户端往里面写入数据时,会出现客户端往一个memcached节点写入数据后,另外两个节点是查询不到的
- 因此,我们使用magent开源软件来对memcached服务器之间进行缓存数据同步,其项目网址为:http://code.google.com/p/memagent/
- magent工作原理是magent可以备份数据,而且magent可以同时连接多个memcached节点,当memcached重启或者宕机恢复后可以从magent指定的memcached的备份节点中恢复丢失的缓存数据
- magent和mecached是可以混搭的,如上图模型
单点故障
- 尽管使用magent能够解决数据复制问题,但是还是不能避免单点故障问题
- 所以,一般magent和keepalived搭配使用,实现高可用集群,关于keepalived的介绍请看https://blog.csdn.net/qq_42761527/article/details/104076582
二.memcached集群部署
实验拓扑图
- 本实验中使用三台虚拟机,两台memcached节点,一台客户端
- memcached主节点安装magent
- 主节点和从节点使用的虚拟IP地址为192.168.43.88/24
实验环境
角色 | 系统 | IP地址 | 软件包 |
memcached主节点 | CentOS7 | 192.168.43.101/24 | magent-0.5.tar.gz memcached-1.5.6.tar.gz libevent-2.1.8-stable.tar.gz |
memcached从节点 | CentOS7 | 192.168.43.102/24 | memcached-1.5.6.tar.gz libevent-2.1.8-stable.tar.gz |
客户端 | centOS7 | 192.168.43.103/24 |
配置memcached主节点
##安装相关环境包,以及keepalived高可用软件
yum install gcc gcc-c++ make keepalived -y
##关闭防火墙
systemctl stop firewalld
setenforce 0
##解压主节点上的三个软件包
tar xzvf memcached-1.5.6.tar.gz -C /opt
tar xzvf libevent-2.1.8-stable.tar.gz -C /opt
mkdir /opt/magent
tar xzvf magent-0.5.tar.gz -C /opt/magent/
##手工编译安装事件通知库
cd /opt
cd libevent-2.1.8-stable/
./configure --prefix=/usr
make && make install
##手工编译安装memcached服务端
cd ..memcached-1.5.6/
./configure --with-libevent=/usr/local
make && make install
##编辑magent
cd /opt/magent/
#只用修改头两行
vim ketama.h
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
vim Makefile
//首行修改
LIBS = -levent -lm
###开始编译magent,完成之后会出现一个可执行文件
make
##把magent的执行文件放到系统能够识别的地方
cp magent /usr/bin/
##把脚本复制给从节点
scp magent [email protected]:/usr/bin
##编辑keepalived的脚本
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
//在此处定义一个函数脚本
vrrp_script magent {
script "/opt/shell/magent.sh"
interval 2
}
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 memcached_master
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
//调用该函数脚本
track_script {
magent
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.43.88
}
}
##同样覆盖从节点上的keepalived文件,等会去从节点修改
scp keepalived.conf [email protected]:/etc/keepalived/keepalived.conf
##创建keepalived定义的脚本
mkdir /opt/shell
cd /opt/shell
vim magent.sh
#!/bin/bash
##K代表keepalived是否开启
K=`ps -ef | grep keepalived | grep -v grep | wc -l`
if [ $K -gt 0 ]; then
#此条命令是开启magent
#-n指定最大连接数,-l指定虚拟IP,-s指定主节点,-b指定从节点
magent -u root -n 51200 -l 192.168.43.88 -p 12000 -s 192.168.43.101:11211 -b 192.168.43.102:11211
else
pkill -9 magent
fi
##给予脚本执行权限
chmod +x magent.sh
##建立关于Libevent的软链接,否则会出错
ln -s /lib/libevent-2.1.so.6* /usr/lib64/
##开启keepalived和magent
systemctl start keepalived.service
[root@localhost shell]# netstat -ntap |grep 12000
tcp 0 0 192.168.43.88:12000 0.0.0.0:* LISTEN 14737/magent
##开启memcached
[root@localhost shell]# memcached -m 512k -u root -d -l 192.168.43.101 -p 11211
[root@localhost shell]# netstat -ntap |grep 11211
tcp 0 0 192.168.43.101:11211 0.0.0.0:* LISTEN 27939/memcached
配置memcached从节点
##安装相关软件包
yum install gcc gcc-c++ make keepalived -y
##关闭安全性功能
systemctl stop firewalld
setenforce 0
##解压memcached服务端软件包
tar xzvf libevent-2.1.8-stable.tar.gz -C /opt
tar xzvf memcached-1.5.6.tar.gz -C /opt
##手工编译
cd /opt/libevent-2.1.8-stable/
./configure --prefix=/usr
make && make install
cd ../memcached-1.5.6/
./configure --with-libevent=/usr/local
make && make install
##创建magent脚本目录,此处要先于主节点复制脚本过程
mkdir /opt/shell
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script magent {
script "/opt/shell/magent.sh"
interval 2
}
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 memcached_master
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
track_script {
magent
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.43.88
}
}
ln -s /lib/libevent-2.1.so.6* /usr/lib64/
##开启服务
systemctl start keepalived.service
[root@localhost ~]# netstat -natp | grep magent
tcp 0 0 192.168.43.88:12000 0.0.0.0:* LISTEN 14737/magent
[root@localhost ~]#
memcached -m 512k -u root -d -l 192.168.43.102 -p 11211
[root@localhost ~]# netstat -ntap |grep 11211
tcp 0 0 192.168.43.101:11211 0.0.0.0:* LISTEN 27939/memcached
[root@localhost ~]#
在客户端连接VIP
##安装telnet服务
yum install telnet -y
##以虚拟IP和magent代理端口连接
[root@client ~]# telnet 192.168.43.88 12000
Trying 192.168.43.88...
Connected to 192.168.43.88.
Escape character is '^]'.
验证主从同步
- 在客户端添加数据到memcached
- 在主节点和从节点查看
注:主节点不会同步从节点的数据,从节点上修改数据,客户端不会获得
模拟故障
- 关闭主节点,查看客户端能否正常登录