实验目的
-
掌握基于
repcached
的 Memcached 主主复制配置 -
实现通过 Keepalived 的 VIP 高可用机制
-
验证数据双向同步及故障自动切换能力
实验环境
角色 | IP 地址 | 主机名 | 虚拟 IP (VIP) |
---|---|---|---|
主节点 | 10.1.1.78 | server-a | 10.1.1.80 |
备节点 | 10.1.1.79 | server-b | 10.1.1.80 |
-
操作系统: CentOS 7
-
软件版本: memcached-1.2.8-repcached-2.2
一、搭建memcached 主主复制
Memcached 的复制功能支持多个 Memcached 之间相互复制(双向复制,主备都是可读可写的),可以解决 Memcached 的容灾问题。
memcached 本身不支持相互复制,若已安装,需要卸载rpm 安装的memcached ,换带有支持复制功能的memcached;
yum -y remove memcached
(1)环境准备
假设有两台服务器用于 Memcached 主主复制,分别为 Server A(10.1.1.78)和 Server B(10.1.1.79)。确保两台服务器都运行 CentOS 7 系统,并且网络可以正常通信。
注意实验时需要设置防火墙规则,学习时期可直接关闭防火墙,因此两台虚拟机都需关闭防火墙
sudo firewall-cmd --add-port=11211/tcp --permanent
sudo firewall-cmd --reload#注意也可以执行以下命令关闭防火墙(centos7中若要关闭防火墙两个都要关,具体使用规则可查看本人其他博客)
systemctl stop firewalld
systemctl stop iptables
(2)安装依赖
在两台服务器上都执行以下命令安装编译所需的依赖:
yum install -y gcc make libevent-devel
(3)下载并安装支持复制的 Memcached(repcached)
repcached 是实现 Memcached 复制功能的扩展,以下是安装步骤:
下载下面的压缩包并上传两台虚拟机,并执行wgte命令下载 repcached
Docs
wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz
如果上述链接不可用,你可以在 SourceForge 等网站上查找合适的版本。
(4)解压文件
tar zxvf memcached-1.2.8-repcached-2.2.tar.gz
ls
cd memcached-1.2.8-repcached-2.2
(5)置编译选项
./configure --prefix=/usr/local/memcached --enable-replication --with-libevent=/usr/lib64/
(6) 编译并安装
make clean
make &&make install
编译过程中若报错,处理后再编译:
修改memcached.c,删除两行如下图所示,大概在五十多行左右,可输入命令行:set nu显示行数
修改 replication.c文件,增加红色框住的一行
(7)配置主主复制
1. 启动 Server A 的 Memcached
#创建对应的用户
useradd memcached
#进到对应目录启动服务
cd /usr/local/memcached/bin
./memcached -d -u memcached -m 64 -l 10.1.1.78 -p 11211 -x 10.1.1.79
注:若配合调度器上面的指令改成
./memcached -d -u memcached -m 64 -l 0.0.0.0 -p 11211 -x 10.1.1.79
#启动服务后一定要查看进程,看到底服务启动没
netstat -naptl |grep memcached
注:netstat 这个网络指令来源于net-tools 这个软件包,没有就自己安装!
sudo yum install net-tools
#停掉服务的方法
pkill -9 memcached
参数说明:
-d
:以守护进程模式运行。-u root
:以 root 用户身份运行。-m 64
:分配 64MB 内存给 Memcached。-l 10.1.1.78
:监听的 IP 地址。-p 11211
:监听的端口。-x 10.1.1.79
:指定要同步数据的对端服务器 IP。
2. 启动 Server B 的 Memcached
#创建对应的用户
useradd memcached
#进到对应目录启动服务
cd /usr/local/memcached/bin
./memcached -d -u memcached -m 64 -l 10.1.1.79 -p 11211 -x 10.1.1.78
注:若配合调度器上面的指令改成
./memcached -d -u memcached -m 64 -l 0.0.0.0 -p 11211 -x 10.1.1.78
#启动服务后一定要查看进程,看到底服务启动没
netstat -naptl |grep memcached
注:netstat 这个网络指令来源于net-tools 这个软件包,没有就自己安装!
sudo yum install net-tools
#停掉服务的方法
pkill -9 memcached
(8)验证主主复制
注意若没有telnet命令可自行下载
sudo yum install telnet -y
1. 在 Server A 插入数据
telnet 10.1.1.78 11211
set test 0 0 5
hello
quit
2. 在 Server B 验证数据
telnet 10.1.1.79 11211
get test
如果能获取到在 Server A 上插入的数据,说明主主复制配置成功。同理,在 Server B 上插入数据,也应该能在 Server A 上获取到。
注意:同步的前提,使用相同用户启动服务;
二、搭建memcached 主主复制+keepalived 高可用
(1)在两个节点上都安装keepalived
yum -y install keepalived ipvsadm
(2)在10.1.1.78 上的配置
cd /etc/keepalived/
vi keepalived.conf
# 清空原文件并写入以下内容(示例为10.1.1.78主节点配置)
cat > /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL
}vrrp_script chk_memcached {script "/usr/bin/pgrep memcached" # 检测Memcached进程interval 2weight -20
}vrrp_instance VI_1 {state MASTER # 主节点设为MASTER,备节点设为BACKUPinterface ens33 # 网卡名(通过ip addr查看实际名称)virtual_router_id 51priority 100 # 备节点改为90advert_int 1authentication {auth_type PASSauth_pass 1111 # 密码需主备一致}virtual_ipaddress {10.1.1.80/24 # 虚拟IP(VIP)}track_script {chk_memcached}
}
EOF
在10.1.1.79上,仅修改state和priority
cat > /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL_79 # 唯一标识,建议改为节点相关名称
}vrrp_script chk_memcached {script "/usr/bin/pgrep memcached" # 检测Memcached进程interval 2weight -20
}vrrp_instance VI_1 {state BACKUP # 明确指定为备节点interface ens33 # 网卡名(需与ip addr显示一致)virtual_router_id 51 # 必须与主节点相同priority 90 # 优先级低于主节点(100)advert_int 1authentication {auth_type PASSauth_pass 1111 # 密码与主节点一致}virtual_ipaddress {10.1.1.80/24 # 相同的虚拟IP}track_script {chk_memcached}
}
EOF
(3)启动keepalived
systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived
(4) 测试故障切换
ip addr show ens33
pkill -9 memcached
最开始:
查看10.1.1.78,此时有10.1.1.80的VIP,
查看10.1.1.79,没有10.1.1.80的VIP
手动停止memcached后:
在 主10.1.1.78上
pkill -9 memcached
观察vip 飘逸
78上没有80,79上有80
实验结论
-
主主复制有效性
-
数据在 10.1.1.78 和 10.1.1.79 之间实现双向同步,写入任一节点的数据均能实时同步至对端。
-
通过
stats replication
确认复制状态为connected
,同步字节数 (replication_bytes
) 持续增长。
-
-
高可用性验证
-
当主节点 Memcached 服务终止时,Keepalived 在 2秒内 将 VIP (10.1.1.80) 漂移至备节点。
-
客户端通过 VIP 访问服务无感知中断,实现无缝故障转移。
-
-
关键问题与解决
-
编译错误: 通过修改
memcached.c
定义IOV_MAX
解决。 -
同步失败: 因防火墙未放行 11212 复制端口,关闭防火墙后恢复正常。
-
实验总结
本次实验成功构建了 Memcached 主主复制集群,并结合 Keepalived 实现高可用。关键成果包括:
-
数据冗余:双向复制确保单节点故障时数据不丢失。
-
服务连续性:VIP 机制保障客户端访问零中断。
-
可扩展性:架构支持后续添加更多节点。