部署memcached数据库服务
文章目录
资源列表
操作系统 | 配置 | 主机名 | IP | 所需软件 |
---|---|---|---|---|
CentOS 7.9 | 2C4G | memcache1 | 192.168.93.102 | libevent-2.1.8-stable.tar.gz memcached-1.5.1.tar.gz |
CentOS 7.9 | 2C4G | memcache-apr | 192.168.93.101 | LAMP架构 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.9 | 2C4G | memcache1 | 192.168.93.102 | memcached-1.2.8-repcached-2.2/ |
CentOS 7.9 | 2C4G | memcache2 | 192.168.93.103 | memcached-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