Memcached的冗余机制与节点失效应对策略

Memcached的冗余机制与节点失效应对策略

引言

Memcached是一种高性能的分布式内存对象缓存系统,用于加速动态Web应用程序,减轻数据库负载。然而,在分布式环境中,节点失效和数据丢失是常见的挑战。本文将通过具体代码示例,深入探讨Memcached的冗余机制和节点失效的应对策略。

Memcached简介

Memcached是一种分布式缓存系统,通常用于提升数据库驱动型网站的响应速度。其主要功能是将数据存储在内存中,以减少数据库查询的次数。

冗余机制

1. 数据复制

Memcached本身不提供内置的数据复制机制,但可以通过客户端实现。例如,在Python中使用pymemcache库,可以手动实现数据的复制。

from pymemcache.client.base import Clientservers = [('memcached1.example.com', 11211), ('memcached2.example.com', 11211)]
clients = [Client(server) for server in servers]def set_data(key, value):for client in clients:client.set(key, value)def get_data(key):for client in clients:value = client.get(key)if value is not None:return valuereturn None# 设置数据
set_data('foo', 'bar')# 获取数据
print(get_data('foo'))

2. 一致性哈希

一致性哈希通过在哈希环上分布节点,使得每个节点只负责部分数据。当一个节点失效时,只有该节点负责的数据需要重新分布。使用hash_ring库可以实现一致性哈希。

from hash_ring import HashRingnodes = ['memcached1', 'memcached2', 'memcached3']
ring = HashRing(nodes)def get_node(key):node = ring.get_node(key)return node# 获取节点
print(get_node('foo'))

3. 多层缓存

多层缓存通过在本地缓存和分布式缓存之间构建多层结构,以提高数据的可用性和访问速度。

from cachetools import TTLCache
from pymemcache.client.base import Clientlocal_cache = TTLCache(maxsize=100, ttl=300)
client = Client(('memcached.example.com', 11211))def set_data(key, value):local_cache[key] = valueclient.set(key, value)def get_data(key):if key in local_cache:return local_cache[key]value = client.get(key)if value is not None:local_cache[key] = valuereturn value# 设置数据
set_data('foo', 'bar')# 获取数据
print(get_data('foo'))

节点失效应对策略

1. 客户端重试机制

客户端可以实现自动重试机制,当一个Memcached节点失效时,尝试访问其他节点。

from pymemcache.client.base import Client
from pymemcache.exceptions import MemcacheErrorservers = [('memcached1.example.com', 11211), ('memcached2.example.com', 11211)]
clients = [Client(server) for server in servers]def get_data(key):for client in clients:try:value = client.get(key)if value is not None:return valueexcept MemcacheError:continuereturn None# 获取数据
print(get_data('foo'))

2. 动态节点管理

使用Twemproxy或其他动态节点管理工具,可以实现对Memcached节点的动态添加和删除。

配置twemproxy的示例nutcracker.yml文件:

alpha:listen: 127.0.0.1:22121hash: fnv1a_64distribution: ketamatimeout: 400redis: falseservers:- 127.0.0.1:11211:1- 127.0.0.1:11212:1

3. 数据持久化

结合持久化存储(如Redis或数据库),在节点失效时从持久化存储中恢复数据。

import redis
from pymemcache.client.base import Clientclient = Client(('memcached.example.com', 11211))
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)def set_data(key, value):client.set(key, value)redis_client.set(key, value)def get_data(key):value = client.get(key)if value is None:value = redis_client.get(key)if value is not None:client.set(key, value)return value# 设置数据
set_data('foo', 'bar')# 获取数据
print(get_data('foo'))

4. 心跳检测与自动切换

通过实现心跳检测机制,可以及时发现节点失效并进行自动切换。

import time
from pymemcache.client.base import Client
from pymemcache.exceptions import MemcacheErrorclass MemcachedClientWithHeartbeat:def __init__(self, servers, check_interval=5):self.servers = serversself.clients = [Client(server) for server in servers]self.check_interval = check_intervalself.active_clients = self.clients[:]self._start_heartbeat()def _check_servers(self):while True:for client in self.clients:try:client.version()except MemcacheError:if client in self.active_clients:self.active_clients.remove(client)else:if client not in self.active_clients:self.active_clients.append(client)time.sleep(self.check_interval)def _start_heartbeat(self):import threadingthread = threading.Thread(target=self._check_servers)thread.daemon = Truethread.start()def get_data(self, key):for client in self.active_clients:try:value = client.get(key)if value is not None:return valueexcept MemcacheError:continuereturn None# 使用心跳检测机制的客户端
servers = [('memcached1.example.com', 11211), ('memcached2.example.com', 11211)]
client = MemcachedClientWithHeartbeat(servers)# 获取数据
print(client.get_data('foo'))

总结

Memcached的冗余机制和节点失效应对策略是确保其高可用性和稳定性的关键。通过数据复制、一致性哈希、多层缓存等机制,可以有效提高数据的可用性。结合客户端重试、动态节点管理、数据持久化和心跳检测等应对策略,可以在节点失效时迅速恢复系统功能,确保服务的连续性。

参考文献

  1. Memcached官方文档
  2. 一致性哈希算法
  3. Twemproxy - A fast, light-weight proxy for memcached and redis
  4. Ketama: A consistent hashing algorithm for distributed cache systems

以上内容通过具体代码示例,详细介绍了Memcached冗余机制与节点失效应对策略,希望能为实际应用提供实质性帮助。

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

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

相关文章

Python爬虫掌握-----4实战(爬取视频)

我们使用爬虫时难免会遇到爬取视频的情况,其实爬取图片视频,内容都是一样的。这里以b站视频为例。 一、开始 1.找到url,请求url 防盗链,需要写在UA伪装中 正常的三步: 1.url 2.requests请求 3.UA伪装 import req…

docker基于外部缓存加速构建方案

开启外部缓存 http://your_apt_cacher_ng_server:3142 是一个示例 URL,表示需要设置的 apt-cacher-ng 代理服务器的地址。apt-cacher-ng 是一个本地代理服务器,可以缓存从官方 APT 仓库下载的软件包,从而加速后续的下载过程,并减…

linux c 递归锁的介绍

递归锁的递归特性确实只是对于持有锁的线程。当一个线程获取了递归锁后,它可以多次重复获取该锁,而不会导致自身阻塞或死锁。这是递归锁的重要特点,它允许同一个线程在已经持有锁的情况下,再次获取相同的锁。 然而,对…

Zabbix基本介绍

文章目录 一、监控为什么需要监控需要监控什么Zabbix使用场景及系统概述zabbix介绍Zabbix功能Zabbix架构Zabbix术语 二、部署安装编译安装 一、监控 为什么需要监控 监控功能 在需要的时刻,提前预警即将出问题,避免故障发生。实时监控系统和业务,当出问题之后&am…

在本地远程访问云Linux服务器部署的tomcat管理控制台

样例: 我们将创建一个 SSH 隧道,将本地计算机的端口映射到远程服务器的端口,以达到在本地的windows系统中访问云Linux中tomcat的管理控制台的目的 1.打开终端,输入以下字段 ssh -L 8080:localhost:8080 userserver_ip 其中各项代表的值为: -L [local_port]:[remo…

Android11 framework 禁止三方应用通过广播开机自启动-独立方案

之前的文章Android11 framework 禁止三方应用开机自启动记录了我调试Android11应用自启动限制的全过程,但是之前的方案感觉还能再研究,所以有了这一篇文章。 这一篇文章主要探讨Android11上,以广播来进行自启动的应用的限制,极个别…

数据库安全:MySQL安全配置,MySQL安全基线检查加固

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们需…

Java中的字符串类型——String

字符串类型 不可变类型:一旦创建,值就不会改变fianl修饰类不能继承,不能被重写,修饰char类型后,地址不可变,内容可变,没有具体方法修改内容,保证不可变性 常用方法 长度&#xff…

(十七)原生js案例之h5中的几个特性记录

h5 中的新特性 语义化标签增强型表单元素选择器 querySelectorquerySelectorAllgetElementsByClassName class 的操作 classList.addclassList.removeclassList.toggleclassList.containsclassList.replace JSON JSON.stringifyJSON.parseeval 可以解析任何字符串变成 jspares…

配置Linux客户端免密登录服务端Linux主机的root用户

1.安装shh服务 首先安装shh服务,redhat端通过下面代码进行安装服务 sudo yum install sshd sudo yum install openssh-server 2.生成密钥(公钥+私钥) 执行ssh-keygen命令,会生成id_rsa(私钥&#xff0…

【ffmpeg命令入门】再论ffmpeg通用选项

文章目录 前言强制使用特定的文件格式1. 将 MP4 文件转换为 AVI 格式2. 录制音频3. 从摄像头录制视频 指定输入文件覆盖同名文件限制输入/输出文件的时间指定结束点时间主要区别举例说明1. 使用 -t 截取前 10 秒的视频2. 使用 -to 截取到第 10 秒的视频 实际应用中的区别1. 从第…

并发编程--synchronized介绍

1.初步认识synchronized 先来看下利用 synchronized 实现 同步的基 础 : Java 中的每一个 对 象都可以作 为锁 。具体表 现 为 以下 3 种形式。 : 对于普通同步方法, 锁 是当前 实 例 对 象。 对于静 态 同步方法, 锁 是当前 类…

python-首字母移位(PythonTip)

[题目描述] 编写一个程序,将句子中每个单词的首字母移位到下一个单词。定义函数shift_first_letter(),参数为sentence(字符串)。在函数内,将句子中每个单词的首字母移位到下一个单词。最后一个单词的首字母移位到句子的…

python进阶---闭包与装饰器

一、闭包 在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。 闭包的三要素: 1、外部函数嵌套内部函数 2、外部函数返回内…

SQL 注入漏洞详解 - Union 注入

1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,…

罗技 F710 无线游戏手柄用户指南

罗技 F710 无线游戏手柄用户指南 Gamepad F710功能系统XInput 游戏DirectInput的 游戏1.左键/触发器按钮为数字; 触发器是模拟的按钮和触发器是数字的和可编程的*2.右键/触发器按钮为数字; 触发器是模拟的按钮和触发器是数字的和可编程的*3.方向键8 向方…

记录|C#+winform创建扁平化风格界面

本项目的C#内容是自己跟做的,自己做的内容已经打包,可以通过自己跟做写的Dashboard界面,C#下的winform模式下载获得,但是需要花费3个积分 目录 前言一、左边设置和步骤界面步骤Step1.Step2.Step3.Step4Step5 二、右边属性和步骤属…

【BUG】已解决:ModuleNotFoundError: No module named ‘requests‘

ModuleNotFoundError: No module named ‘requests‘ 目录 ModuleNotFoundError: No module named ‘requests‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身&a…

Django已经登录但是还是提示登录

问题描述 在使用 Django 开发网站时,你可能会遇到一个问题:当用户在访问网站时,如果 URL 从 https://200sm.com/chat/ 切换到 https://www.200sm.com/chat/,用户可能会被要求重新登录或遇到其他验证问题。这是因为 Django 默认情…

Python怎样读取URL生成PDF

1. 安装依赖的exe 需要在这个网址,安装一个exe包,地址:https://wkhtmltopdf.org/ 进入网址后,点这个位置: 选择一个你的操作系统的下载链接: 安装后的exe文件: C:\Program Files\wkhtmltopdf…