《高性能Linux服务器构建实战》——3.2节剖析Memcached的工作原理

简介: 本节书摘来自华章社区《高性能Linux服务器构建实战》一书中的第3章,第3.2节剖析Memcached的工作原理,作者:高俊峰,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.2 剖析Memcached的工作原理

3.2.1 Memcached的工作过程
Memcached是一种C/S模式,在服务器端启动服务守护进程,此时可以指定监听的IP地址、端口号以及使用多少内存来处理客户端的请求等几个关键参数。服务器端的服务启动后就一直处于等待处理客户端的连接状态。Memcached 是由C语言来实现的,采用的是异步I/O,其实现方式是基于事件的单进程和单线程的。使用libevent 作为事件通知机制,多个服务器端可以协同工作,但这些服务器端之间没有任何通信关系,每个服务器端只对自己的数据进行管理。客户端通过指定服务器的IP地址和端口进行通信。
需要被缓存的对象或数据以key/value对的形式保存在服务器端,每个被缓存的对象或数据都有唯一的标识符key,存取操作通过这个key 进行。保存到 Memcached 中的对象或数据放置在内存中,并不会作为文件存储在磁盘上,所以存取速度非常快。由于没有对这些对象进行持久性存储,因此在服务器端的服务重启之后存储在内存中的这些数据就会消失。而且当存储的容量达到启动时设定的值时,就自动使用LRU算法删除不用的缓存。Memcached是为缓存而设计的服务器,因此在设计之初并没有过多考虑数据的永久性问题。Memcached支持各种语言编写的客户端API,目前包括 Perl、PHP、Python、Ruby、Java、C#和C等。

3.2.2 Slab Allocation的工作机制
Memcached利用Slab Allocation机制来分配和管理内存。传统的内存管理方式是:使用完通过malloc分配的内存后通过free来回收内存。这种方式容易产生内存碎片并降低操作系统对内存的管理效率。Slab Allocation机制不存在这样的问题,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,可以重复利用。
Memcached服务器端保存着一个空闲的内存块列表,当有数据存入时根据接收到的数据大小,分配一个能存下这个数据的最小内存块。这种方式有时会造成内存浪费,例如:将一个200字节的数据存入一个300字节的内存块中,会有100字节内存被浪费掉,不能使用。避免浪费内存的办法是,预先计算出应用存入的数据大小,或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀,这样就可以减少对内存的浪费。还有一种办法是,在启动时指定“-f”参数,能在某种程度上控制内存组之间的大小差异。在应用中使用Memcached时,通常可以不重新设置这个参数,使用默认值1.25进行部署。如果想优化Memcached对内存的使用,可以考虑重新计算数据的预期平均长度,调整这个参数来获得合适的设置值。

3.2.3 Memcached的删除机制
上一节已经介绍过,Memcached不会释放已分配的内存空间,在数据过期后,客户端不能通过key取出它的值,其存储空间被重新利用。
Memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/value对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期。这种策略不会在过期检测上浪费CPU资源。
Memcached在分配空间时,优先使用已经过期的key/value对空间,当空间占满时,Memcached就会使用LRU算法来分配空间,删除最近最少使用的key/value对,将其空间分配给新的key/value对。在某些情况下,如果不想使用LRU算法,那么可以通过“-M”参数来启动Memcached,这样,Memcached在内存耗尽时,会返回一个报错信息。

3.2.4 Memcached的分布式算法
前面已经介绍过,Memcached的分布式是通过客户端的程序库来实现的。下面举例描述其工作过程。
假设有node1、node2、node2三台Memcached服务器,应用程序要实现保存名为“tokyo”、“ tokyo1”、“ tokyo2”、“ tokyo3”的数据,如图3-2所示。


e4d5c55d6a9c02df69b9035a3630da5ed0f1b3a5

向Memcached中存入“tokyo”,将“tokyo”传给客户端程序后,客户端实现的算法就会根据这个“键”来决定保存数据的Memcached服务器,选定服务器后,就命令该服务器保存“tokyo”及其值,如图3-3所示。
同样,存入“tokyo1”、“ tokyo2”和“ tokyo3”的过程都是先通过客户端的算法选择服务器再保存数据。
接下来获取保存的数据。获取保存的key/value对时也要将要获取的键“tokyo”传递给函数库。函数库通过与存取数据操作相同的算法,根据“键”来选择服务器。只要使用的算法相同,就能确定存入在哪一台服务器上,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值,如图3-4所示。


48fee1c819d218cecacabfa27bf76f54d07a096c

将不同的键保存到不同的服务器上,就实现了Memcached的分布式算法。部署多台Memcached服务器时,将键分散保存到这些服务器上,当某一台Memcached服务器发生故障无法连接时,只有分散到这台服务器上的key/values对不能访问,其他key/value对不受影响。
目前有两种分布式算法使用得最多,一种是根据余数来计算分布,另一种是根据一致性散列算法来计算分布。根据余数分布式算法先求得键的整数散列值,再除以服务器台数,根据余数来选择将键存放到哪一台服务器上。这种方法虽然计算简单,效率很高,但在服务器增加或减少时,会导致几乎所有的缓存失效,所以在大规模部署中,很少使用这种方法。一致性散列的原理如图3-5所示,先算出Memcached服务器(节点)的散列值,并将其分散到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射到圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上。如果超过232仍然找不到服务器,就会将数据保存到第一台Memcached服务器上。


19e0dd572ad6273a4d17c2f452f8a0cbb37e5bd9

当需要添加一台Memcached服务器时,由于保存键的服务器的个数发生了变化,因此余数分布式算法的余数结果也会发生巨大变化,几乎所有的键都找不到之前存入的服务器,导致所有的缓存失效。但在采用一致性散列算法时,添加服务器后,只有在圆上增加服务器地点的逆时针方向的第一台服务器上的键会受到影响,如图3-6所示。
一致性散列算法对数据的存储是不均匀的,但可以最大限度地减少缓存的失效量。在大规模部署Memcached时,容灾和扩容一定要使用一致性散列算法,以确保在出现故障或容量问题时减小对数据库的影响。


478da637144fcaffbc8257771f16de21a2029a8a
相关文章
|
10天前
|
弹性计算 资源调度 搜索推荐
阿里云ECS中长期成本节省计划解析:从原理到实战,助力企业降本提效
阿里云ECS节省计划的推出为企业用户提供了一种全新的成本优化方案。通过一次性购买的方式享受长期按量付费的折扣权益,客户不仅可以大幅降低ECS资源的使用成本还可以享受更高的灵活性和便捷性。本文将从多个维度深入剖析阿里云ECS节省计划,包括其核心优势、详尽的购买使用指引、与传统付费模式的全面对比,以及一客户成功案例,以供大家了解和参考。
|
27天前
|
人工智能 安全 大数据
【限时特惠】阿里云服务器7折抢购!高性能+高性价比,开发者与企业必备攻略
阿里云服务器限时7折特惠,高性能、高性价比,为开发者和企业量身打造!新老用户均可参与,灵活配置满足多种需求,全球节点低延迟覆盖。自研神龙架构保障稳定性,安全防护全面,操作便捷,生态丰富。适用于个人开发、企业部署、跨境业务及AI计算等场景。点击专属链接立即抢购,活动名额有限,速来享受云端算力带来的高效体验!
49 0
|
2月前
|
存储 人工智能 弹性计算
2025年阿里云企业高性能云服务器租用价格与选型详解
随着企业数字化转型,阿里云于2025年推出多款高性能云服务器实例,涵盖计算、通用和内存密集型场景。文章分析了企业选择云服务器的核心要点,包括明确业务需求(如计算密集型任务推荐计算型实例)、性能与架构升级(如第八代实例性能提升20%),以及第九代实例支持AI等高算力需求。同时提供了配置价格参考和成本优化策略,助力企业实现效率与成本的最优平衡。
|
3月前
|
存储 缓存 Java
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
69 9
|
4月前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
6月前
|
机器学习/深度学习 弹性计算 运维
云计算系列之阿里云ECS服务器管理实战
本文档介绍了阿里云ECS(Elastic Compute Service)的基本概念、实例管理、磁盘操作、快照与镜像功能及其应用场景,最后通过具体案例解析ECS的实际应用。ECS是阿里云提供的高效、可靠的云计算服务,支持多种业务需求,如Web应用、高并发网站、数据库等,帮助企业快速构建稳定安全的应用,提升运维效率,降低IT成本。文档还详细说明了ECS实例的创建方式、连接方法及日常管理操作,帮助用户更好地利用ECS服务。
190 2
云计算系列之阿里云ECS服务器管理实战
|
7月前
|
网络协议
keepalived对后端服务器的监测方式实战案例
关于使用keepalived进行后端服务器TCP监测的实战案例,包括配置文件的编辑和keepalived服务的重启,以确保配置生效。
123 1
|
8月前
|
SQL 缓存 自然语言处理
实战案例1:基于C语言的Web服务器实现。
实战案例1:基于C语言的Web服务器实现。
|
8月前
|
运维 数据安全/隐私保护 数据库管理
企业实战项目之服务器用户权限集中管理
企业实战项目之服务器用户权限集中管理
|
8月前
|
弹性计算 监控 网络安全
解锁云端力量:ECS全攻略,从新手到专家的实战之旅!轻松掌握云计算核心技能,驾驭数字浪潮之巅!
【8月更文挑战第22天】云计算中的弹性计算服务(ECS)让企业和开发者能按需获取虚拟服务器,灵活配置CPU、内存等资源。本文从零开始指导ECS的基础操作与高级技巧,包括实例创建、SSH连接、Web应用部署及利用ELB和自动伸缩优化性能。同时介绍监控工具和数据备份方法,帮助您全方位掌握ECS的高效运用,满足业务需求并保障数据安全。
115 3