云数据库memcached之热点key问题解决方案

背景

在分布式K-V存储系统中,对某个key进行读写时,会根据该key的hash计算出一台固定的server来存取该K-V,如果集群不发生服务器数量变化,那么这一映射关系就不会变化。
云数据库memcached就是这样一种K-V缓存系统。因此在实际应用中,某些高峰时段,有的云数据库memcached用户会大量请求同一个Key(可能对应应用的热卖商品、热点新闻、热点评论等),所有的请求(且这类请求读写比例非常高)都会落到同一个server上,该机器的负载就会严重加剧,此时整个系统增加新server也没有任何用处,因为根据hash算法,同一个key的请求还是会落到同一台新机器上,该机器依然会成为系统瓶颈。这个问题称为“热点key”问题。

现状

用户使用云数据库memcached就是为了提升业务性能,难免会触发“热点key问题”。但云数据库memcached做为公有云服务,在发现有热点的情况下,如果继续放任该热点无限激增,就会带来整个系统雪崩似宕机。所以当前的做法会对每个用户在每台服务器上分配一定的QPS或带宽,当用户在某台服务器上的请求超过该用户的配额,我们就会对用户进行流控,服务端返回TEMPORARY_FAILURE。该限制会影响用户正常请求,持续时间分钟级。

思考

用户触发热点问题是业务需要,是理所当然;云数据库memcached对热点key进行流控是保障系统稳定性,也在情理之中。但有没有一种既能提供用户热点key访问的需求,又能保护云数据库memcached服务器的方法,正是本文所要阐述的。
解决热点问题有很多办法,比如用户如果提前知道某些key可能成为热点,那么客户端可以提前拆分热点key;也可以搭建一个备用集群,写的时候双写,然后随机双读。这些方案的实现前提和难度,可想而知。下面给出的是对应用透明,且动态发现热点的解决方案。

解决方案

整体思路

本方案解决的是用户读热点问题,不解决写热点问题。
首先,云数据库memcached简单架构图如下:

我们的proxy是无状态层,上面做了些访问控制功能,用户客户端到proxy是随机的,不受固定算法(如hash)控制。而proxy到DataServer的链路是根据key决定的,当用户访问热点key时,所有proxy上关于该key的请求都会落到同一台DataServer。
所以解决热点问题,其核心思路是:每台DataServer对所有key进行采样、定位,实时计算出当前热点key,将其反馈给proxy层,由proxy缓存备份。即负载压力由DataServer转向proxy。理由是:Proxy可以无状态扩容,而DataServer不可以。

DataServer如何发现热点

每台服务器有个HotKey逻辑,让每个到达服务器的目标请求(可配置不同类型请求)经历三个流水阶段:
a. 采样阶段(根据配置设定采样次数sample_max)
本阶段输出:是否有热点现象,如果有热点,输出热点的桶号供下阶段使用。

b. 定位阶段(根据配置设定采样次数reap_max)
本阶段输出:热点key(如果满足阈值)。 并添加到服务端的LRU链表。

c. 反馈阶段
对到达服务器的目标请求,取出key,然后查询LRU链表判断该key是否为热点key。如果是热点,就会在请求结束后,向proxy发送一个feedback包,通知proxy。
至此,服务器hot-key逻辑结束。流程图如下:

发现热点后proxy怎么处理

当Proxy收到DataServer的热点反馈之后,会将该key写入到自己的LRU-cache里面,该cache的过期时间和容量大小都交由用户通过控制台设置,默认分别是100ms和30。这样,热点的key就已经存在于与proxy中了,下次用户请求就可以直接返回了。

如何保证数据一致性呢?

下面讨论都是用户client已经触发了热点key问题,假设用户client跟每个proxy都建立了链接,并且每个proxy上都有对热点key的请求,那么理论上每个proxy的LRU-cache都有一份数据。
我们保证单条连接上的一致性。
当用户client和proxy1建立连接,用户修改了一个key(任何写操作),proxy1上会在LRU-cache中同步删除该key,新key就会写到DataServer上,然后在读数据的时候,由于LRU-cache不命中,就会从DataServer上拿到最新数据。
不同链接上只能提供弱一致性。
如果这个时候用户从proxy2上读热点数据呢?理论上就会读到老数据,该数据将于100ms之后从proxy-cache中过期淘汰掉,之后就会更新会最新数据,即不同连接间可能有100ms不一致。
怎样看待弱一致性。
事实上,不开启热点key功能,在不同链接上也会存在弱一致。假设用户client建立了两条链接到云数据库memcached,在链接1上写入key-value1,在链接1、2上分别读该key。当链接1上用户update了key-value2,这个请求需要一定的网络延迟才能写入到服务端,如果这个时候链接2上同时发起对key的读取操作,如果读请求先到服务端,它将读到的是value1的老值。
所以开启热点key功能,只是增加了不一致时间,且该功能为可选。控制权由用户掌握。

适用场景

由以上分析可以看到,开启热点key功能之后,只会对用户的读请求产生影响,该影响增加了不同链接上的弱一致性的时间。因此,该功能适合读多写少,且对强一致性要求不高的应用。

收益

整个方案核心是负载压力由DataServer转移到Proxy。好处如下:
1、因为DataServer扩容也解决不了热点问题,而Proxy可以无状态扩容,对用户来讲就极大提升了热点key访问的能力,不受单点制约。
2、缩短了服务端处理链路,对用户平均RT也所降低。
3、免除服务端热点流控的分钟级别影响。

时间: 2024-10-31 09:34:02

云数据库memcached之热点key问题解决方案的相关文章

Memcached · 最佳实践 · 热点 Key 问题解决方案

背景 在分布式K-V存储系统中,对某个key进行读写时,会根据该key的hash计算出一台固定的server来存取该K-V,如果集群不发生服务器数量变化,那么这一映射关系就不会变化. 云数据库 memcached 就是这样一种K-V缓存系统.在实际应用中的某些高峰时段,有的云数据库 memcached 用户会大量请求同一个Key(可能对应应用的热卖商品.热点新闻.热点评论等),所有的请求(且这类请求读写比例非常高)都会落到同一个server上,该机器的负载就会严重加剧,此时整个系统增加新serv

一分钟了解阿里云产品:云数据库Memcache版

一.             概述   阿里云产品种类繁多,今天让我们一起来了解下云数据库Memcache版(AliCloudDB for Memcache,原OCS)吧.   什么是云数据库Memcache版呢?   一句话,云数据库Memcache版是基于内存的缓存服务,支持海量小数据的高速访问.     那么,云数据库Memcache有什么优势呢?我来给大家说说吧.   云数据库Memcache可以极大缓解对后端存储的压力,提高网站或应用的响应速度.云数据库Memcache支持Key-Va

阿里云双11访谈之云数据库

以下内容根据访谈视频整理而成. 阿里云数据库产品特性介绍 云数据库产品在阿里云集团里做了很多额外的工作和专研.在安全线上云数据库达到了很高的安全要求,引入了更多的硬件,在架构上.在代码层都做了很多的优化.相对于传统数据出来说,云数据库在稳定性和高可用上面达到了较高的技术上的提升.阿里云产品都有一个通用特性就是应用可以快速实现自动化,实现对实例级别的管理.监控,对程序的迁移.阿里云云数据库团队不仅在业界上是顶级的专家团队,在专业上也是属于国内顶级的水平,阿里云数据库为用户在云上的业务做保驾护航的工

一分钟了解阿里云产品:云数据库Redis版

一.             概述   阿里云发布了很多款产品,几天让我们来一起了解下云数据库Redis版(AliCloudDB for Redis)吧.     什么是云数据库Redis呢?   运输库Redis是兼容开源Redis协议的Key-Value类型在线存储服务.云数据库Redis版支持字符串.链表.集合.有序集合.哈希表等多种数据类型,及事务(Transactions).消息订阅与发布(Pub/Sub)等高级功能.通过内存+硬盘的存储方式,云数据库Redis版在提供高速数据读写能力

云数据库Redis版备份恢复解决方案上线,数据可靠性全面升级!

阿里云云数据库Redis版致力于为用户提供稳定可靠.性能卓越.可弹性伸缩的数据库服务,并提供全套的容灾切换.故障迁移.在线扩容.性能优化的数据库解决方案. 云数据库Redis版采用双击热备的架构保证服务高可用,并且提供了持久化机制来保证数据可靠性.但是随着越来越多的业务开始使用Redis作为最终的持久化存储引擎,用户对于数据可靠性就提出了更高的需求.经过一段时间的打磨,我们正式推出了Redis备份恢复解决方案,全面的升级云数据库Redis的数据可靠性.   1.     数据备份一键式操作 由于

云数据库Redis游戏行业解决方案解读

Redis作为最流行的Key-value数据库,近年来在游戏行业有着广泛的应用.阿里云云数据库Redis于2015年正式商业化,提供了全套的容灾切换.故障迁移.在线扩容.性能优化的数据库解决方案,同时也对游戏行业推出了许多便捷的功能. 下面我就来解读云数据库Redis版针对游戏行业的特性 1.数据持久化,保证数据高可靠性 传统的数据库架构往往是采用关系型数据库存储数据(如:MySQL),在MySQL前端利用缓存来存储访问量极高的数据(如:Redis),整体提升系统性能. 然而有时游戏公司为了快速

彩虹桥——云数据库Greenplum版数据同步解决方案

云数据库Greenplum版(ApsaraDB for Greenplum)目前已经开始公测,大家对它的使用评价还是非常高的.但是也有看到朋友反映说在把业务数据同步到云数据库的过程中还有一些不那么灵活的地方.就在前几天,笔者经朋友推荐在阿里云市场找到了这款叫彩虹桥的软件,在用了一段时间后,想在此提一些自己的看法.言而总之在业务数据同步方面,笔者认为彩虹桥应该是greenplum目前最好用的配套辅助工具. 首先让我们来看看正在公测的云数据库Greenplum版.云数据库Greenplum版是基于G

阿里云数据库,破解大型网站架构设计中的数据存储难题

摘要:3月10日,2017阿里云网站行业热点问题和解决方案线下研讨会在上海举行.在本次研讨会上,阿里云数据库团队产品专家王义成(花名挚尤)针对于大型网站的数据库架构设计以及阿里云ApsaraDB所提供的服务管理和解决方案进行了深入介绍. 分享者简介:王义成(花名挚尤),阿里云数据库团队产品专家,负责阿里云NoSQL数据库的产品规划.加入阿里巴巴近5年的时间,参与过多种云数据库的产品设计工作.目前主要负责阿里云的MongoDB.Redis以及MemCache产品,旨在为广大客户提供安全可靠的数据库

一分钟了解阿里云产品:云数据库MongoDB版

一.             概述   阿里云产品种类齐全,今天让我们一起来了解下云数据库MongoDB版(AliCloudDB for MongoDB)吧.   什么是云数据库MongoDB版呢?我来给大家说说吧.   云数据库MongoDB版基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化.并提供专业的数据库在线扩容.备份回滚.性能优化等解决方案.   与自建数据库相比, 云数据库MongoDB版有什么优势呢?我们为您提供更优质的服务:   云数据库