Memcached 主主复制架构搭建与 Keepalived 高可用实现

news2025/4/28 13:04:00

实验目的

  1. 掌握基于 repcached 的 Memcached 主主复制配置

  2. 实现通过 Keepalived 的 VIP 高可用机制

  3. 验证数据双向同步及故障自动切换能力


实验环境

角色IP 地址主机名虚拟 IP (VIP)
主节点10.1.1.78server-a10.1.1.80
备节点10.1.1.79server-b10.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 keepalived

global_defs {
    router_id LVS_DEVEL
}

vrrp_script chk_memcached {
    script "/usr/bin/pgrep memcached"  # 检测Memcached进程
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER                       # 主节点设为MASTER,备节点设为BACKUP
    interface ens33                    # 网卡名(通过ip addr查看实际名称)
    virtual_router_id 51
    priority 100                       # 备节点改为90
    advert_int 1
    authentication {
        auth_type PASS
        auth_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 keepalived

global_defs {
    router_id LVS_DEVEL_79  # 唯一标识,建议改为节点相关名称
}

vrrp_script chk_memcached {
    script "/usr/bin/pgrep memcached"  # 检测Memcached进程
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP                      # 明确指定为备节点
    interface ens33                   # 网卡名(需与ip addr显示一致)
    virtual_router_id 51              # 必须与主节点相同
    priority 90                       # 优先级低于主节点(100)
    advert_int 1
    authentication {
        auth_type PASS
        auth_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

实验结论

  1. 主主复制有效性

    • 数据在 10.1.1.78 和 10.1.1.79 之间实现双向同步,写入任一节点的数据均能实时同步至对端。

    • 通过 stats replication 确认复制状态为 connected,同步字节数 (replication_bytes) 持续增长。

  2. 高可用性验证

    • 当主节点 Memcached 服务终止时,Keepalived 在 2秒内 将 VIP (10.1.1.80) 漂移至备节点。

    • 客户端通过 VIP 访问服务无感知中断,实现无缝故障转移。

  3. 关键问题与解决

    • 编译错误: 通过修改 memcached.c 定义 IOV_MAX 解决。

    • 同步失败: 因防火墙未放行 11212 复制端口,关闭防火墙后恢复正常。


实验总结

本次实验成功构建了 Memcached 主主复制集群,并结合 Keepalived 实现高可用。关键成果包括:

  1. 数据冗余:双向复制确保单节点故障时数据不丢失。

  2. 服务连续性:VIP 机制保障客户端访问零中断。

  3. 可扩展性:架构支持后续添加更多节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2343434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙ArkUI之相对布局容器(RelativeContainer)实战之狼人杀布局,详细介绍相对布局容器的用法,附上代码,以及效果图

在鸿蒙应用开发中&#xff0c;若是遇到布局相对复杂的场景&#xff0c;往往需要嵌套许多层组件&#xff0c;去还原UI图的效果&#xff0c;若是能够掌握相对布局容器的使用&#xff0c;对于复杂的布局场景&#xff0c;可直接减少组件嵌套&#xff0c;且随心所欲完成复杂场景的布…

线程函数库

pthread_create函数 pthread_create 是 POSIX 线程库&#xff08;pthread&#xff09;中的一个函数&#xff0c;用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…

[C]基础13.深入理解指针(5)

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对比 2、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1 代码12.2.2 代码22.2.3 代码32.2.4 …

OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 YUV 色彩空间转换为 RGB。 该函数将输入图像从 YUV 色彩空间转换为 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图像必须是 8…

hbuilderx云打包生成的ipa文件如何上架

使用hbuilderx打包&#xff0c;会遇到一个问题。开发的ios应用&#xff0c;需要上架到app store&#xff0c;因此&#xff0c;就需要APP store的签名证书&#xff0c;并且还需要一个像xcode那样的工具来上架app store。 我们这篇文章说明下&#xff0c;如何在windows电脑&…

Golang | 位运算

位运算比常规运算快&#xff0c;常用于搜索引擎的筛选功能。例如&#xff0c;数字除以二等价于向右移位&#xff0c;位移运算比除法快。

产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号

单分子荧光成像技术&#xff0c;作为生物分子动态研究的关键工具&#xff0c;对捕捉微弱信号要求严苛。传统EMCCD相机因成本高昂&#xff0c;动态范围有限&#xff0c;满阱容量低等问题&#xff0c;制约单分子研究成果产出效率。 千眼狼精准把握科研需求与趋势&#xff0c;自研…

Hot100方法及易错点总结2

本文旨在记录做hot100时遇到的问题及易错点 五、234.回文链表141.环形链表 六、142. 环形链表II21.合并两个有序链表2.两数相加19.删除链表的倒数第n个节点 七、24.两两交换链表中的节点25.K个一组翻转链表(坑点很多&#xff0c;必须多做几遍)138.随机链表的复制148.排序链表 N…

网络:手写HTTP

目录 一、HTTP是应用层协议 二、HTTP服务器 三、HTTP服务 认识请求中的uri HTTP支持默认首页 响应 功能完善 套接字复用 一、HTTP是应用层协议 HTTP下层是TCP协议&#xff0c;站在TCP的角度看&#xff0c;要提供的服务是HTTP服务。 这是在原来实现网络版计算器时&am…

【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析

基于YOLOv5的人脸检测与关键点定位系统深度解析 1. 技术背景与项目意义传统方案的局限性YOLOv5多任务方案的优势 2. 核心算法原理网络架构改进关键点回归分支损失函数设计 3. 实战指南&#xff1a;从环境搭建到模型应用环境配置数据准备数据格式要求数据目录结构 模型训练配置文…

【python】如何将python程序封装为cpython的库

python程序在发布时&#xff0c;往往会打包为cpython的库&#xff0c;并且根据应用服务器的不同架构&#xff08;x86/aarch64&#xff09;&#xff0c;以及python的不同版本&#xff0c;封装的输出类型也是非常多。本文介绍不同架构指定python下的代码打包方式&#xff1a; 首…

计算机组成原理 课后练习

例一&#xff1a; 例二&#xff1a; 1. 原码一位乘 基本原理 原码是一种直接表示数值符号和大小的方式&#xff1a;最高位为符号位&#xff08;0表示正&#xff0c;1表示负&#xff09;&#xff0c;其余位表示数值的绝对值。原码一位乘的核心思想是逐位相乘&#xff0c;并通…

SVN仓库突然没有权限访问

如果svn仓库突然出现无法访问的情况&#xff0c;提示没有权限&#xff0c;所有账号都是如此&#xff0c;新创建的账号也不行。 并且会突然提示要输入账号密码。 出现这个情况时&#xff0c;大概率库里面的文件有http或者https的字样&#xff0c;因为单独给该文件添加权限导致…

【Qt】文件

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; Qt 文件概述 二&#xff1a;&#x1f525; 输入输出设备类 三&#xff1a;&#x1f525; 文件读写类 四&#xff1a;&#x1f525; 文件和目录信息类 五&…

【AI】[特殊字符]生产规模的向量数据库 Pinecone 使用指南

一、Pinecone 的介绍 Pinecone是一个完全托管的向量数据库服务&#xff0c;专为大规模机器学习应用设计。它允许开发者轻松存储、搜索和管理高维向量数据&#xff0c;为推荐系统、语义搜索、异常检测等应用提供强大的基础设施支持。 1.1 Pinecone的核心特性 1. 高性能向量搜…

dstream

DStream转换DStream 上的操作与 RDD 的类似&#xff0c;分为 Transformations&#xff08;转换&#xff09;和 Output Operations&#xff08;输出&#xff09;两种&#xff0c;此外转换操作中还有一些比较特殊的原语&#xff0c;如&#xff1a;updateStateByKey()、transform(…

HFSS5(李明洋)——设置激励(波端口激励)

Magnetic是适用于铁磁氧导体的&#xff0c;只有前三种激励类型可以用于计算S参数 1波端口激励 也可以设置在模型内部&#xff0c;如果是设置在模型内部必须加一段理想导体&#xff0c;用于指定端口方向 1.1——模式 number 输入N&#xff1a;计算1-N的模式都计算 1.2——模式…

ubiquant比赛系列——用docker准备ubipoker开发环境

比赛过程&#xff1a; 环境准备&#xff1a; #在云服务器上拉python官方的docker镜像并下载到本地 https://hub.docker.com/_/python/ sudo docker pull python:3.11.12-slim-bullseye sudo docker images sudo docker save -o 3.11.12-slim-bullseye.tar python:3.11.12-slim…

Rust实现高性能目录扫描工具ll的技术解析

Rust实现高性能目录扫描工具ll的技术解析 一、项目概述 本项目使用Rust构建了一个类ls命令行工具&#xff0c;具备以下核心特性&#xff1a; 多格式文件信息展示并行目录扫描加速人类可读文件大小运行时性能统计交互式进度提示 二、技术架构 1. 关键技术栈 clap&#xff…

深入理解C语言变量:从基础到实践

在编程世界中&#xff0c;变量是最基础也是最重要的概念之一。作为C语言的核心组成部分&#xff0c;变量承载着程序运行时数据的存储和传递功能。理解变量的工作原理和正确使用方法&#xff0c;是成为一名合格C程序员的必经之路。本文将全面介绍C语言变量的各个方面&#xff0c…