欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

搭建memcached 集群 + keepalived 实现高可用

程序员文章站 2022-07-03 14:07:11
...

一. Memcached作用

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

二. 搭建高可用memcache

2.1 案例设计

搭建memcached 集群 + keepalived 实现高可用

memcache主服务器,IP地址:12.0.0.24
memcache从服务器,IP地址:12.0.0.25
memcache客户端,IP地址:12.0.0.26

需要安装的软件:

  • 主服务器需要安装:memcached,libevent,keepalived,magent
  • 从服务器需要安装:memcached,libevent,keepalived

2.2 主从服务器搭建memcache

主从服务器都是需要安装memcache,以下只演示主服务器的操作

//安装依赖环境
[aaa@qq.com opt]# yum install gcc gcc-c++ make -y

安装事件libevent
[aaa@qq.com opt]# tar zxvf libevent-2.1.8-stable.tar.gz 
cd libevent-2.1.8-stable
./configure --prefix=/usr
make && make install

安装memcached
[aaa@qq.com opt]# tar zxvf memcached-1.5.6.tar.gz 
[aaa@qq.com memcached-1.5.6]# cd ../memcached-1.5.6/
./configure --with-libevent=/usr
[aaa@qq.com memcached-1.5.6]# make && make install

2.3 主服务器安装magent代理

[aaa@qq.com opt]# mkdir /opt/magent
[aaa@qq.com opt]# tar zxvf magent-0.5.tar.gz -C /opt/magent
cd /opt
cd magent
vi ketama.h     //在文件开头处修改前两行,加上#endif(文件末尾也有#endif,删除末尾的#endif)

#ifndef SSIZE MAX
#define SSIZE_MAX 32767
#endif

vim Makefile
LIBS = -levent -lm   //第一行末尾加-lm   (不是数字1)

make    //修改完后可以编译了

ls          //会产生magent可执行程序

#将magent可执行程序复制到/usr/bin中
[aaa@qq.com magent]# cp magent /usr/bin/

#下载远程传输  这样从服务器就不需要修改了
[aaa@qq.com magent]# yum install openssh-clients -y

'//将magent可执行程序复制到从服务器的/usr/bin中'
'//此命令需要输入yes,输入从服务器的密码才能将文件拷贝过去,根据提示操作即可'
[aaa@qq.com magent]# scp magent aaa@qq.com12.0.0.25:/usr/bin/

2.4 主从服务器搭建keeplived

#主从服务器都需要安装
[aaa@qq.com magent]# yum install keepalived -y

2.5 修改主服务器中keepalived.conf

[aaa@qq.com keepalived]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
'//添加此段:定义了一个函数脚本'
vrrp_script magent {                       '//脚本名字自定义'
      script "/opt/shell/magent.sh"        '//脚本指定位置'
      interval 2                           '//时间间隔'
}
global_defs {                              '//区域指定全局参数'
   notification_email {
     aaa@qq.com.loc
     aaa@qq.com.loc
     aaa@qq.com.loc
   }
   notification_email_from Alexandre.aaa@qq.com.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id MAGENT_HA                      '//执行名称备用服务器不能一样'
}  
vrrp_instance VI_1 {                         '//实例名称'
    state MASTER
    interface ens33                          '//承载网络为VIP地址的物理接口'
    virtual_router_id 51
    priority 100                             '//优先级 备用服务器小于主服务器'
    advert_int 1                             '//通告间隔秒数'
    authentication {
        auth_type PASS                       '//认证类型'
        auth_pass 1111                       '//密码验证'
    }
    track_script {                           '//调用刚刚的函数在实例里面调用,调用名字'
        magent
}
    virtual_ipaddress {
        20.0.0.100                           '//漂移地址'
    }
}
#下面全部删除

2.6 配置从服务器中的keepalived.conf

[aaa@qq.com bin]# cd /etc/keepalived/
[aaa@qq.com keepalived]# ls
keepalived.conf
'//备份配置文件
[aaa@qq.com keepalived]# mv keepalived.conf keepalived.conf.bak

#拷贝主服务器的kaeepalived配置文件到从服务器
[aaa@qq.com magent]# scp /etc/keepalived/keepalived.conf aaa@qq.com12.0.0.25:/etc/keepalived

[aaa@qq.com keepalived]# vim keepalived.conf
#下面这几项跟主服务器不一样
router_id MAGENT_HB         '//id名和第一台要不一样,从服务器改为MAGENT_HB'
state BACKUP                '//从服务器为BACKUP'
virtual_router_id 52        '//id号和第一台不一样即可'
priority 90                 '//优先级低与主服务器 '

2.7 主服务器创建magent脚本

  • 上面keepalived.conf定义了函数定义脚本我们来创建
[aaa@qq.com magent]# mkdir /opt/shell
[aaa@qq.com magent]# cd /opt/shell/
[aaa@qq.com 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 12.0.0.188 -p 12000 -s 12.0.0.24:11211 -b 12.0.0.25:11211
else
pkill -9 magent
fi

'//如下解释'
-n 51200             '//定义用户最大连接数'
-l 20.0.0.100        '//指定虚拟IP'
-p 12000             '//指定端口号'
-s                   '//指定主缓存服务器12.0.0.24'
-b                   '//指定从缓存服务器12.0.0.25'
11211				 '//memcache端口号'

2.8 主从服务器启动

[aaa@qq.com shell]# chmod +x magent.sh                  '//增加执行权限'
[aaa@qq.com shell]# systemctl stop firewalld.service 
[aaa@qq.com shell]# systemctl start keepalived.service  '//启动服务 稍微有点慢'
[aaa@qq.com shell]# netstat -ntap | grep 12000
tcp        0      0 20.0.0.100:12000        0.0.0.0:*               LISTEN      100623/magent  

2.9 验证主从

  • 主服务器
[aaa@qq.com shell]# vim /var/log/messages 
搜索'//Transition to MASTER STATE',有即成功

[aaa@qq.com shell]# ip addr              '//查看漂移地址是否绑定成功'
.....省略内容....
inet 12.0.0.188/32 scope global ens33
.....省略内容....   
  • 从服务器
[aaa@qq.com keepalived]# vim /var/log/messages 
搜索'//Entering BACKUP STATE',有即成功
[aaa@qq.com keepalived]# ip addr	'//查看漂移地址是否绑定成功'
...省略内容
  inet 12.0.0.188/32 scope global ens33
	'//绑定成功 '
...省略内容.....

2.10 主从服务器开启memcache并测试本地连接

  • 参数说名
-d选项是作为守护进程在后台运行 
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, 
-u是运行Memcache的用户,我这里是root, 
-l是监听的服务器IP地址,如果有多个地址的话 
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口, 
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定, 
-P是设置保存Memcache的pid文件
-vv是以very vrebose模式启动,将调试信息和错误输出到控制台

#主从memcache

memcached -m 512k -u root -d -l 12.0.0.24 -p 11211
memcached -m 512k -u root -d -l 12.0.0.25 -p 11211
netstat -anpt | grep 11211
  • 主memcache
yum -y install telnet
telnet 12.0.0.24 11211
  • 从memcache
yum -y install telnet
telnet 12.0.0.25 11211

2.11 #客户机测试(12.0.0.26)

#进行连接
[aaa@qq.com ~]# telnet 12.0.0.188 12000
Trying 12.0.0.188...
Connected to 12.0.0.188.
Escape character is '^]'.
add pei 0 0 4     '//客户端插入并新建一个数据'
1234
STORED

#返回主服务器查看是否同步数据
[aaa@qq.com shell]# telnet 12.0.0.24 11211
Trying 12.0.0.24...
Connected to 12.0.0.24.
Escape character is '^]'.
get pei                        '//查看数据'
VALUE pei 0 4
1234
END

#从服务器进行验证
[aaa@qq.com shell]# telnet 12.0.0.25 11211
Trying 12.0.0.25...
Connected to 12.0.0.25.
Escape character is '^]'.
get pei                       '//查看数据'
VALUE pei 0 4
1234
END
'//测试成功,主从都成功生成数据'

2.12 测试高可用性

主memcache里

systemctl stop keepalived

在客户机里依然是无感知的,

[aaa@qq.com ~]# telnet 12.0.0.188 12000
Trying 12.0.0.188...
Connected to 12.0.0.188.
Escape character is '^]'.
get pei
VALUE pei 0 4
1234
END
相关标签: memcached