NoSql之key-value数据库------腾讯CKV海量分布式存储系统其中有和memcache, redis的对比

转载地址:https://www.csdn.net/article/2014-03-11/2818723


摘要:腾讯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将会助力更多的业务发展。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc