腾讯CKV海量分布式存储系统

摘要:腾讯CKV,是腾讯自主研发的高性能、低延时、持久化、分布式KV存储服务。在腾讯的微信平台、开放平台、腾讯云、腾讯游戏和电商平台广泛使用,日访问量超过万亿次。本文将全面剖析CKV的实现原理和技术挑战。

与Memcached和Redis等开源NoSQL相比,CKV具有以下优点。

  • 低成本:CKV利用数据冷热自动分离技术,将热数据存储在内存,冷数据存储在SSD中,从而大幅度降低成本,且保证99%以上的访问命中内存。而Memcached和Redis的数据都存储在内存中,成本是CKV的3倍。
  • 可扩展性强:CKV单表存储空间可以在1GB到1PB之间在线自动无损伸缩,业务基本无感知,适合各种规模的业务和业务的各个生命周期。而Memcached和Redis是单机的,受限于单机的性能和内存容量,虽然可以通过客户端或者Twemproxy等构建分布式集群,但是不能做到完全无损扩容,伸缩修改配置较麻烦。
  •  高性能:CKV单表最大支持千万次/秒的访问,通过网络访问的延时在1ms左右,单台Cache服务器千兆网络环境支持50万/秒的访问,万兆网络环境支持超过100万/秒的访问。Memcached采用多线程,但性能比CKV Cache略低。而Redis是单线程的,性能垂直扩展性差。
  • 可用性超过99.95%:CKV软硬件全冗余设计,双机热备,主备切换对业务透明,跨机架跨交换机部署。Memcached机器死机后,部分key访问就会miss。Redis有双机方案,但还不成熟。
  • 数据持久性超过8个9:CKV数据在磁盘存储,多内存和磁盘副本,具有灾难时回档能力。Memcached死机后,数据就丢失了。Redis虽然数据有双机方案,但还不成熟。
  • 完善的运维体系:CKV能预防并及时发现和处理故障,自动化运营。而Mem-cached和Redis缺乏专门的运维系统。

图1  CKV SET架构

CKV系统包含多个SET。SET包含多种角色的服务器,是一个独立完整可运营的单元。图1是一个完整的CKV SET架构图。本文将主要介绍CKV系统的基本原理,如何实现高性能、可扩展性强、高可用、数据持久化,以及完善的运维体系。

基本原理

每个业务都有一个唯一的tid。Master负责管理tid的路由表,路由表描述tid的key存储在Cache的位置信息。Access是无状态、全镜像的,Access启动或者业务路由表发生变化时,Master向Access推送tid路由表。


图2  CKV SET操作流程

我们以写入key-value的set操作为例,说明业务访问流程(如图2所示):业务向L5服务获取负载和延时最佳Access地址;业务向Access发送写入数据请求;Access根据业务的tid找出相应的路由表,对key进行sharding,把key映射为一个shard ID,然后在路由表中找出key所属的shard位于的Cache地址;Access向Cache发送写入数据请求,Cache把数据写入内存并落磁盘;Cache向Access返回操作结果;Access将结果传回给业务。

对key进行sharding的方法很多,最简单的是对key进行Hash然后取余。

CKV读写访问都能做到高性能、低延时,能够解决Memcached+MySQL不能解决的海量低延时写问题。

Cache集群定期将内存中的冷数据存储到SSD中,当这些冷数据再次被访问时,数据会按一定策略从SSD迁移到内存,从而大幅度降低成本,且保证99%以上的访问命中内存。

单机高性能

CKV单台Cache机器具有极高性能,且具有垂直可扩展性,能够充分发挥高配置机器的CPU和网络性能。优化的方法主要有:充分运用Zero-copy的思想,模块间消息传递时尽量减少内存拷贝的次数;快速Hash技术;快速内存分配和回收技术;利用多队列网卡提高网络小包处理能力;多线程无锁共享技术;通过这些优化方法,单台Cache可以支撑超过100万/秒的访问。

水平可扩展性

对于单个业务表而言,CKV集群具有良好的水平可扩展性,可以通过水平扩展来提高表的容量和性能。CKV Access和Cache都具有很好的水平可扩展性。

Access水平扩展

由于Access是无状态、全镜像的,所以很容易通过L5名字服务实现水平扩容和缩容。业务只配置表的L5服务ID,而不是具体的机器IP。L5服务类似DNS,将L5服务ID映射为机器IP和端口,而且能够根据机器的负载和延时情况选择最佳的机器IP和端口,起到负载均衡和容错的作用。

当Access整体负载过高或者过低时,通过增加或者删除Access机器,并在L5服务中增加或删除Access地址,实现Access的扩容和缩容。

Cache水平扩展

当业务表空间使用率过高或者过低时,需要对业务表进行容量扩容或者缩容。如图3所示,业务数据的key空间划分为4个shard,原来存储在2台Cache中。扩容过程如下:Master将禁止shard2数据写访问命令发送给Access;Transfer模块把Cache1属于shard2的数据搬迁到Cache3;Master将更新后的tid路由表和恢复shard数据访问命令发送给Access;搬迁其他shard,重复以上过程。缩容的过程与扩容过程类似。

图3  Cache扩容/缩容路由表变化

容量扩容除了能够增加表的容量外,将shard分散到更多的Cache机器,或者将shard迁移到负载低的Cache机器上,能够实现表的整体性能提升。

高可用

CKV所有的服务器和网络全冗余。每对Access和每对主备Cache机器位于不同的交换机和机架上,避免某台交换机故障或者机架掉电导致所有Access、主备Cache都不可用。

正常的访问流程是业务通过Access访问主Cache上的数据,主Cache将变化的数据同步到备Cache中。当某台Access出现故障时,L5服务将出现故障的Access剔除,业务通过L5服务获取正常的Access地址。当主Cache出现故障时,Master通知Access把访问切换到备Cache。当备Cache出现故障时,服务不受影响。备Cache恢复后,主Cache把数据重新同步到备Cache。通过硬件冗余和软件的容灾处理,CKV可用性超过99.95%。

数据持久化

单台Cache死机,数据不会丢失,且不影响访问。如果主备Cache都死了,只要Cache磁盘的数据正常,那么Cache重启后,通过磁盘上的备份和流水重构内存数据,就能恢复服务。即便主备Cache同时死机并且磁盘损坏,也能通过备份中心的备份和流水中心的流水回档到任意5分钟的Cache内存状态。回档功能还能减少用户自己误操作造成的损失。曾经有业务人员由于误操作,把自己的表数据写错了,最后通过CKV的备份和流水才恢复到正确的数据状态。

运维系统

云服务除了要有好的架构设计和实现外,更需要好的运营。CKV运营近万台服务器,机器故障、表容量满等问题每天都会出现几个,有时甚至几十个。因而,需要全面的监控,及时的告警,提供快速的故障处理工具,以及常见的故障自动化处理。

多维度的监控

  • 软件层面。监控进程自身的资源使用率,例如TCP连接数量、存储空间使用率、进程是否死掉、数据迁移失败、信息同步失败等异常状态。
  • 硬件层面。监控机器的CPU、内存、磁盘、网络的使用率、机器死机等。
  • 整个系统层面。空闲的资源是否足够满足业务的增长扩容,业务调用CKV服务的成功率和延时。

告警方式多样化

  • 日报。汇总系统的隐患,例如系统空闲的资源不足、互为主备的机器位于相同的机架或者交换机下、机器之间的网络延时过大、机器的负载偏高等。通过日报能够把潜在的隐患处理掉,减少故障的出现。
  • 短信告警。通知处于萌芽状态的故障,例如表空间使用率超过90%、需要提前扩容和机器的负载偏高等。
  • 电话告警。需要紧急处理的故障。例如表空间使用率超过95%、需要紧急扩容、机器的CPU使用率100%和机器死机等。

总结

CKV利用数据冷热分离技术大幅度降低了成本,同时保证99%以上的访问命中内存,做到与纯内存访问延时几乎无差别。内存存储的CKV集群具有高性能、性能和容量可扩展性强、高可用、数据持久化等特点。完善的运维体系保证了大规模的CKV服务高效和可靠性。

CKV已经持续稳定运营4年多,成熟可靠,根据业务增长弹性伸缩,解决业务海量存储访问的难题,业务可以更加专注于自己的领域。云的时代已经到来,CKV将会助力更多的业务发展。

作者梁晓湛,腾讯TEG(技术工程事业群)基础架构部工程师,主要负责CKV海量分布式存储系统架构和运营优化工作。曾从事千万亿次超级计算机管理和作业调度系统开发。

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

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

相关文章

Apache RocketMQ 安装、测试、报错解决

1. 准备 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 64bit OS, Linux/Unix/Mac 64bit JDK 1.8; Maven 3.2.x 2.下载和构建 下载 4.2.0 源代码版本地址:http://mirro…

编程之法:面试和算法心得

《编程之法:面试和算法心得》高清中文版PDF 含书目录 下载地址: 链接:https://pan.baidu.com/s/1Kcd2bRsIfhagKZR6NaOgXg 提取码:054s 《编程之法:面试和算法心得》高清中文版PDF高清中文版PDF 含书目录,36…

localStorage存、取数组

localStorage存储数组时需要先使用JSON.stringify()转成字符串,取的时候再字符串转数组JSON.parse()。 var arr[1,2,3,4];localStorage.setItem(key,arr);console.log(localStorage(key); //打印出字符串:1,2,3,4 正常存储:localStorage.setI…

10岁起编程,并不认为自己是“黑客”

摘要:一直以来,女性在“黑客”群体中缺乏代表性,但这不是因为她们缺乏兴趣。麻省理工学院的Liz Denys从十岁开始接触编程,但由于被忽视以及性别歧视问题,她和许多女性一样,游走在“黑客”圈子之外。 我10岁…

Redis原理及拓展

Redis是单线程程序。单线程的Redis为何还能这么快? 1、所有的数据都在内存中,所有的运算都是内存级别的运算(因此时间复杂度为O(n)的指令要谨慎使用) 2、单线程操作,避免了频繁的上下文切换 3、多路复用(非…

日常问题 - 远程服务器运行Tomcat出现卡顿阻塞

问题描述: 远程服务器Tomcat容器运行一个WEB项目,浏览器访问时,请求一直得不到响应,并且除此之外没有出现任何异常,像是被阻塞了。查看远程Tomcat窗口,也没有任何报错。鼠标在Tomcat窗口右键点击后&#xf…

linux : ulimit 命令使用说明、参数解说

ulimit -a 用来显示当前的各种用户进程限制 Linux 对于每个用户,系统限制其最大进程数,为提高性能,可以根据设备资源情况, 设置个Linux用户的最大进程数,一些需要设置为无限制: 数据段长度:uli…

给技术人上的管理课:平衡和集中

摘要:大中型团队管理是技术人转型的巨大挑战,这个阶段的管理工作,仍然可以归为技术范畴,依靠的大抵是管理人的筋肉力量。是否会管理,要看能否管好超出自己筋肉力量规模的团队。此中的关键,在于把握平衡和集…

理解分布式id生成算法--雪花算法(SnowFlake)

分布式ID生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。 注: 1B就是1个字节。Byte、KB、B、MB、GB之间的关系是:Bit——比特 ; B ——字节;KB——千字节;MB——兆字节;GB——吉字节…

[ZJOI2010]贪吃的老鼠

P2570 [ZJOI2010]贪吃的老鼠 在Ta的博客查看 显然二分,最大流判定 要满足两个条件: (1) 在任一时刻,一只老鼠最多可以吃一块奶酪; (2) 在任一时刻,一块奶酪最多被一只老鼠吃。 先按照奶酪的边界进行离散化&#xff0c…

IP: 169.254.0.0/16 地址用途

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 一直困惑169.254.0.0/16是干嘛的,每次笔记本dhcp获取地址失败后,就会随机在这个B类地址段获取一个地址&#…

值得借鉴的30条好习惯

我有幸一直能生活在比较好的圈子中,我的优秀的同学、舍友,乃至我现在创业后遇到的优秀创业者,从他们身上看到和学到一些好的习惯。 我一直觉得,好的习惯,是成功和进步的重要一点。我随手总结一些给大家,零散…

【PKUSC2019】线弦图【计数】【树形DP】【分治FFT】

Description 定义线图为把无向图的边变成点,新图中点与点之间右边当且仅当它们对应的边在原图中有公共点,这样得到的图。 定义弦图为不存在一个长度大于3的纯环,纯环的定义是在环上任取两个不相邻的点,它们之间都没有边&#xff0…

注解 @PostConstruct 与 @PreDestroy 详解及实例

简介 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Java EE5 引入了PostConstruct和PreDestroy这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操…

别让6种不良心理偷走你的好人缘

众所周知,拥有正常、健康的交际圈对于人的身心健康都是很有帮助的。但是若想维系好自己的交际圈,也是很不容易的,甚至在不经意间产生的某些心理,就会直接给大家的人际交往带来影响。那么接下来,小编就先为大家归纳一下…

PHP 安装xdebug

xdebug官网: https://xdebug.org 安装步骤如下: 使用 phpinfo() 打印出PHP相关信息, 全选, 复制 打开 xdebug 网站: https://xdebug.org/wizard.php 在图中输入框中粘贴你复制的信息, 点击 Analyse my phpinfo() output 在结果中点击下载, 然后按照它提示的步骤进行操作即可…

apt-clone:备份已安装的软件包并在新的 Ubuntu 系统上恢复它们

当我们在基于 Ubuntu/Debian 的系统上使用 apt-clone,包安装会变得更加容易。如果你需要在少量系统上安装相同的软件包时,apt-clone 会适合你。 如果你想在每个系统上手动构建和安装必要的软件包,这是一个耗时的过程。它可以通过多种方式实现…

分布式消息中间件 : Rocketmq

简述 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 分布式消息中间件,主要是实现分布式系统中解耦、异步消息、流量销锋、日志处理等场景。生产中用的最多的消息队…

PV、UV、UIP、VV、CPC、CPM、RPM、CTR指的是什么?

PV(PageView):网站浏览量,指页面的浏览次数,用以衡量网站用户访问的网页数量。用户没打开一个页面便记录1次PV,多次打开同一页面则浏览量累计;UV(UniqueVistor):独立访客数,指1天内访问某站点的…

linux opencl(AMD) Example

最近对并行计算很感兴趣。不过搞MPI对我来说暂时没什么用,基于GPU的并行计算倒是挺实用。网上的资料都是CUDA的。实质上我对CUDA一点兴趣都没有。无论别人的架构多么先进,我这个只有AMD显卡的小孩都是旁观者而已。在这里记录一下一个opencl程序的编译过程…