Memcached主从复制+Keepalived高可用

部署memcached数据库服务

资源列表

操作系统配置主机名IP所需软件
CentOS 7.92C4Gmemcache1192.168.93.102libevent-2.1.8-stable.tar.gz
memcached-1.5.1.tar.gz
CentOS 7.92C4Gmemcache-apr192.168.93.101LAMP架构
libmemcached-1.0.18.tar.gz
memcached-2.2.0.tgz

基础环境

  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
  • 修改主机名
hostnamectl set-hostname memcache1
hostnamectl set-hostname memcache-api

一、安装Memcached服务器

1.1、安装Libevent

  • Libevent是一款跨平台的事件处理接口的封装,可以兼容多个操作系统的事件访问。Memcached的安装依赖于Libevent,因此需要先完成Libevent的安装
[root@memcache1 ~]# yum -y install gcc gcc-c++ make
[root@memcache1 ~]# tar -zxvf libevent-2.1.8-stable.tar.gz -C /usr/src/
[root@memcache1 ~]# cd /usr/src/libevent-2.1.8-stable/
[root@memcache1 libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
[root@memcache1 libevent-2.1.8-stable]# make && make install

# 至此Libevnet安装完毕,接下来就可以安装Memcached

1.2、安装Memcached

  • 安装时需要执行Libevent的安装路径
[root@memcache1 ~]# tar -zxvf memcached-1.5.1.tar.gz -C /usr/src/
[root@memcache1 ~]# cd /usr/src/memcached-1.5.1/
[root@memcache1 memcached-1.5.1]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
[root@memcache1 memcached-1.5.1]# make && make install

1.3、设置Memcached服务脚本

  • Memcached服务安装完成后,可以使用安装目录下的bin/memcached来启动服务,但是,为了更加方便地管理Memcached服务,可以编写脚本来管理Memcached服务
[root@memcache1 ~]# vim /usr/local/memcached/
#!/bin/bash
CMD="/usr/local/memcached/bin/memcached"
start() {
   $CMD -d -m 128 -u root
}
stop() {
   killall memcached
} 
ACTION=$1
case $ACTION in
'start')
   start
   ;;
'stop')
   stop
   ;;
'restart')
   stop
   sleep 2
   start
   ;;
*)
   echo "Usage:$0 {start|stop|restart}"
esac

# 启动Memcached服务时选项作用
-d:以守护进行的方式运行Memcached服务
-m:为Memcached服务分配128M的内存(应根据企业需要调整)
-u:选项指定运行的用户账号

# 脚本编写完成之后即可设置脚本权限并启动Memcached服务
[root@memcache1 ~]# chmod 755 /usr/local/memcached/memcached_service.sh 


1.4、启动服务监听端口

  • Memcached服务启动之后,监听11211/TCP端口
[root@memcache1 ~]# /usr/local/memcached/memcached_service.sh start
[root@memcache1 ~]# netstat -anpt | grep 11211
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      17582/memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      17582/memcached  

二、安装Memcached API客户端

  • 为了使得程序可以直接调用Memcached库和接口,可以使用Memcached扩展组件将Memcache添加为PHP的一个模块。此扩展使用了Libmemcached库提供的API与Memcached服务端进行交互
  • 注意:API客户端需要提前安装Apache和PHP或者直接搭建一套LAMP

2.1、编译安装Libmemcached

  • 在编译Memcached扩展组件时,需要指定Libmemcached库的位置,所以先安装Libmemcached库
[root@memcache-api ~]# yum -y install gcc gcc-c++ make
[root@memcache-api ~]# tar -zxvf libmemcached-1.0.18.tar.gz 
[root@memcache-api ~]# cd libmemcached-1.0.18/
[root@memcache-api libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/memcached
[root@memcache-api libmemcached-1.0.18]# make && make install

2.2、编译安装Memcached扩展

  • 安装Libmemcached库后,就可以进行PHP的Memcached扩展组件安装
# 下载地址
wget http://pecl.php.net/get/memcached-2.2.0.tgz
[root@memcache-api ~]# tar zxvf memcached-2.2.0.tgz 
[root@memcache-api ~]# cd memcached-2.2.0/

2.3、使用PHP的phpize脚本生成配置脚本configure

  • 需要注意的是,在配置Memcached API时,memcached-2.2.0.tgz源码包中默认没有configure配置脚本,需要使用PHP的phpize脚本生成配置脚本configure
# 安装autoconf软件不然生成脚本的时候会报错
yum -y install autoconf
[root@memcache-api memcached-2.2.0]# /usr/local/php5/bin/phpize 
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
[root@memcache-api memcached-2.2.0]# cp -r /usr/local/php5/include/php/ext/ ./
[root@memcache-api memcached-2.2.0]# ./configure --enable-memcached \
> --with-php-config=/usr/local/php5/bin/php-config \
> --with-libmemcached-dir=/usr/local/libmemcached \
> --disable-memcached-sasl

# 选项作用
--enable-memcached:启用memcached支持
--with-php-config:指定PHP配置文件的路径
--with-libmemcached-dir:指定libmemcached库的路径
--disable-memcached-sasl:关闭memcached的SASL认证功能,否则会报错
[root@memcache-api memcached-2.2.0]# make 
[root@memcache-api memcached-2.2.0]# make test
[root@memcache-api memcached-2.2.0]# make install
Installing shared extensions:     /usr/local/php5/lib/php/extensions/no-debug-zts-20121212/ # 共享组件的位置

2.4、配置PHP添加Memcached组件

  • 编辑PHP配置文件php.ini,添加Memcached组件支持
[root@memcache-api ~]# cd /usr/local/php5/
[root@memcache-api php5]# vim php.ini
# 720行下方插入
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20121212/"
extension=memcached.so

  • 通过PHPinfo查看是否已经添加Memcached扩展模块
[root@memcache-api ~]# vim /usr/local/httpd/htdocs/index.php
<?php
phpinfo();
?>
[root@memcache-api ~]# systemctl restart httpd

2.5、访问PHPinfo

  • 访问地址:http://192.168.93.101/index.php
  • 访问地址之后在浏览器页面点击Fn+f组合键进行全局搜索

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6、测试Memcached-API功能

  • 通过编写简单的PHP测试代码调用Memcache程序接口来测试是否与Memcached服务协同工作
  • 此段代码的作用是在客户端连接Memcached服务器,设置名为”key“的键、值为‘Memcache test successful!’,并读取显示,成功表示服务器与客户端协同工作正常。使用浏览器进行访问
  • 访问地址:http://192.168.93.101/test.php
[root@memcache-api ~]# vim /usr/local/httpd/htdocs/test.php
# 下面的IP地址是Memcached服务器的IP地址,
<?php
$memcache = new Memcached();
$memcache->addServer('192.168.93.101', 11211);
$memcache->set('key', 'Memcache test successful!', 0, 60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三、Memcached数据库操作与管理

  • 直接使用telnet连接Memcached的11211端口对Memcached数据库进行操作与管理
[root@memcache1 ~]# yum -y install telnet*
[root@memcache1 ~]# telnet 192.168.93.102 11211
Trying 192.168.93.102...
Connected to 192.168.93.102.
Escape character is '^]'.
# 输入操作执行的地址

  • 操作命令格式为,下面是对Memcached数据库的常见操作执行

3.1、添加一条键值数据

  • 下面的操作指令中,add username 0 0 7表示键值名为username,标记位标识自定义信息为0,过期时间为0(永不过期,单位为秒),字节数为7;example为键值,这里需要注意输入长度为7字节,与设定值符合
add username 0 0 7
example
STORED

3.2、查询键值数据

  • 下面的操作指令中,get 后跟键名。如果查看最近是否更新,可以使用gets最后一位现实的是更新因此,每更新一次更新因子数会加一。
get username
VALUE username 0 7
example
END

gets username
VALUE username 0 7 3
example
END

3.3、更新一条键值数据

  • 下面的操作指令中,set后跟需要更新的键名、标记位、过期时间、字节数。如果简明不存在,set相当于add添加。
set username 0 0 10
everything
STORED

get username
VALUE username 0 10
everything
END

  • 如果仅仅是想单纯的更新没有添加功能,使用replace,此时更新的键名必须存在,如果键名不存在会报NOT_STORED的错误,具体操作如下所示。
replace username 0 0 7
lodging
STORED

gets username
VALUE username 0 7 5
lodging
END

replace username1 0 0 7
example
NOT_STORED

3.4、清除一条缓存数据

  • 下面的操作指令标识使用delete删除一条键值位username的缓存数据,使用get查看没有内容存在
delete username
DELETED

get username
END

3.5、检查后更新check and set

  • 如果cas的最后一个更新因子数与gets返回的更新因子数相等,则更新;否则返回EXISTS
add username 0 0 7
example
STORED

gets username
VALUE username 0 7 6
example
END

cas username 0 0 7 1
lodging
EXISTS

cas username 0 0 7 6
lodging
STORED

gets username
VALUE username 0 7 7
lodging
END

3.6、值后追加数据

  • 在键名username原键值后追加数据使用append
append username 0 0 7	# 向后追加7个字节
example
STORED

gets username
VALUE username 0 14 8
lodgingexample
END

3.7、值前追加数据

  • 在键名username原键值前追加数据使用prepend
prepend username 0 0 2
un
STORED

gets username
VALUE username 0 16 9
unlodgingexample
END

3.8、清除所有缓存数据

flush_all
OK

3.9、查看服务器统计信息

stats		# 系统状态统计信息
stats items		# 返回所有键值对统计信息
stats cachedump 1 0		# 返回指定存储空间的键值对
stats slabs		# 显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats sizes		# 输出所有item的大小和个数
stats reset		# 清空统计数据(不建议使用)

部署Memcached实现主主复制和高可用的方式

资源列表

操作系统配置主机名IP所需软件
CentOS 7.92C4Gmemcache1192.168.93.102memcached-1.2.8-repcached-2.2/
CentOS 7.92C4Gmemcache2192.168.93.103memcached-1.2.8-repcached-2.2/

基础环境

  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
  • 修改主机名
hostnamectl set-hostname memcache-api
hostnamectl set-hostname memcache1
hostnamectl set-hostname memcache2

一、卸载之前的memcached

  • Memcached的复制功能支持多个Memcached之间相互复制(双向复制,主备都是可读可写的),可以解决Memcahced的容灾问题
  • 要使用Memcached复制架构,需要卸载之前的memcached1机器上的1.5.1版本的memcached,重新下载支持复制功能的Memcached安装包
# psmisc用于管理系统上进程的实用程序,提供了killall工具
[root@memcache1 ~]# yum -y install psmisc
[root@memcache1 ~]# /usr/local/memcached/memcached_service.sh stop
[root@memcache1 ~]# netstat -anpt | grep 11211
[root@memcache1 ~]# rm -rf /usr/local/memcached/

二、安装带有复制功能的Memcached

  • 需要先安装libevent,然后进行安装部署
[root@memcache1 ~]# tar -zxvf memcached-1.2.8-repcached-2.2.tar.gz
[root@memcache1 ~]# cd memcached-1.2.8-repcached-2.2/
[root@memcache1 memcached-1.2.8-repcached-2.2]# ./configure --prefix=/usr/local/memcached_replication --enable-replication --with-libevent=/usr/local/libevent
# 修改memcached.c配置文件
[root@memcache1 memcached-1.2.8-repcached-2.2]# vim memcached.c
# 删除57和59行
[root@memcache1 memcached-1.2.8-repcached-2.2]# make && make install

三、启动Memcached服务

  • 复制功能的Memcached安装完成之后,需要将编译安装的libevent-2.1.so.6模块复制到/usr/lib64目录下,否则在启动带有复制功能的Memcached服务时会报错。启动服务时,使用-x选项指定对象(memcache2)
[root@memcache1 ~]# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/
[root@memcache1 ~]# /usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.93.103     # -x执行对象IP地址
[root@memcache1 ~]# netstat -anpt | grep 11211
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      29537/memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      29537/memcached     

  • 同样启动memcached2服务器,注意启动Memcached服务时指向对端IP,需要提前安装libevent事件接口

四、使用telnet进行简单验证复制功能

4.1、在服务器1上插入一条具有特点的键值

yum -y install telnet*
[root@memcache1 ~]# telnet 192.168.93.102 11211	连接memcached
Trying 192.168.93.102...
Connected to 192.168.93.102.
Escape character is '^]'.

set username 0 0 8
12345678
STORED

get username
VALUE username 0 8
12345678
END

quit
Connection closed by foreign host.

4.2、在服务器2上查询刚刚插入的数据

  • 同理,在Memcached上插入数据,在Memcached1也可以查看到。这就是Memcached主主复制
[root@memcache2 ~]# telnet 192.168.93.103 11211
Trying 192.168.93.103...
Connected to 192.168.93.103.
Escape character is '^]'.

get username
VALUE username 0 8
12345678
END

部署Memcached主主复制+Keepalived高可用架构

  • 本实验环境基于主主复制架构进行的衍生

  • Keepalived不断检测Memcached主服务器的11211端口,如果检测到Memcached服务发生宕机或者死机等,就会将VIP从主服务器移动到从服务器,从而实现Memcached的高可用

一、安装配置keepalived

  • 两台memcached服务器都需要安装
yum -y install keepalived
cp /etc/keepalived/keepalived.conf /tmp/keepalived.conf.bak

1.1、配置主keepalived

[root@memcache1 ~]# vim /etc/keepalived/keepalived.conf 
global_defs {
   router_id route		# 路由标识,主从保持一致
}
vrrp_instance VI_1 {
    state BACKUP		# 主备均为BACKUP
    interface ens33
    virtual_router_id 51	# 虚拟路由ID,主从相同
    priority 100	# 优先级,主高于备
    advert_int 1
    nopreempt	# 不主动抢占资源,只在Master或者高优先级服务器上设置
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {		# 定义VIP虚拟地址
        192.168.93.100
    }
}
virtual_server 192.168.93.100 11211		# VIP故障检测
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 20
protocol TCP
sorry_server 192.168.93.103 11211	# 对端
real_server 192.168.93.102 11211 {	# 本机
weight 3
notify_down /root/memcached.sh	# 当memcached宕机,停止keepalived服务
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 11211
}
}
}
[root@memcache1 ~]# echo "/usr/bin/systemctl stop keepalived" > /root/memcached.sh
[root@memcache1 ~]# chmod +x memcached.sh 

1.2、配置备keepalived

  • 主从keepalived配置文件内容差不多,直接复制进行修改,以下只把不一样的地址整理出来
[root@memcache1 ~]# scp /etc/keepalived/keepalived.conf root@192.168.93.103:/etc/keepalived/keepalived.conf

global_defs {
   router_id route
}

vrrp_instance VI_1 {
    state BACKUP	# 备机状态也为BACKUP
    interface ens33
    virtual_router_id 51	# 虚拟路由ID,主从相同
    priority 99	   # 优先级低于主	
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.93.100
    }
}
virtual_server 192.168.93.100 11211		# VIP故障检测
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 20
protocol TCP
sorry_server 192.168.93.102 11211	# 对端
real_server 192.168.93.103 11211 {	# 本机
weight 3
notify_down /root/memcached.sh		# 当memcached 宕机,停止 keepalive
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 11211
}
}
}
[root@memcache2 ~]# echo "/usr/bin/systemctl stop keepalived" > /root/memcached.sh
[root@memcache2 ~]# chmod +x memcached.sh 

二、验证测试

  • 分别启动主从的keepalived服务
[root@memcache1 ~]# systemctl start keepalived.service
[root@memcache2 ~]# systemctl start keepalived.service 

2.1、验证主keepalived获取VIP地址

  • 使用ip address show 命令查看VIP地址(ifconfig无法查看)
[root@memcache1 ~]# ip address show dev ens33
# 已获得VIP地址
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c2:6c:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.93.102/24 brd 192.168.93.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.93.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::8777:f1a8:c3dd:6a2b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

2.2、验证高可用性

  • 关闭Memcached1服务器的Memcached服务,在Memcached2服务器上查看地址信息

  • 注意:一定要关闭两台服务器的selinux和firewalld

[root@memcache1 ~]# killall memcached
# 已获取VIP地址
[root@memcache2 ~]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:df:24:ff brd ff:ff:ff:ff:ff:ff
    inet 192.168.93.103/24 brd 192.168.93.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.93.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::1bf6:d1c7:dafb:4484/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值