一款受欢迎的KV存储数据库是如何炼成的?
共 2828字,需浏览 6分钟
·
2021-05-22 08:05
自2015年开始,手游从萌芽期发展到如今炙手可热的领域,发展的速度之快一定推动了背后技术的改革换新,传统的技术为了适应新时代的变化,也会不断进化,而Tendis的出现也让所有关注朋友们眼前一亮,那么,如何打造一款受欢迎的KV存储数据库?
5月22日08:50-18:00,3306π将集结多位行业专家,在广东广州天河区黄埔大道中322号粤大金融城国际酒店六楼平安厅与大家相约互动,点击「阅读原文」即可报名。
此次活动中,腾讯云数据库专家工程师,Tendis技术负责人陈福荣也将分享《如何打造一款受欢迎的KV存储数据库》,同时,在会前针对这个话题,陈福荣也给出了他的见解和思考,以下是访谈实录:
请陈老师先简单聊聊自己,以及自己当初是如何考虑从事数据库研发这个方向呢?
其实我的本科是非计算机专业,但在大二的时候,发现编程是一个非常有意思的事情,于是就考虑转专业并且报考计算机专业的研究生。
第一次接触数据库的时候,是当时加入学校的技术社团并开发了一些网站,后台数据库使用的是SQL SERVER。当时就觉得二维表的库表结构和SQL语句都非常强大和灵活,很多逻辑可以直接通过SQL语句来解决,但理解还比较肤浅。
本科毕业后,就报考了数据库专业的研究生。算起来,今年刚好毕业10年,比较幸运的是,自己也一直从事数据库内核开发的相关工作。经历了移动互联网以及云计算的爆发性增长,数据库相关工作逐步变得香饽饽。
数据库是一个理论和工程实践结合得特别好的学科。大家会发现,随着对数据库的理解越深入,以前在计算机课程上的基础理论知识就越重要。例如,ACID、CAP、隔离级别、分布式事务等等理论知识,都是理解一个数据库系统的最重要基础。
拥有了基础的理论知识,结合当前最流行的开源数据库(mysql, redis, rocksdb等),多动手操作,带着疑问去理解和学习源码,最终都可以深入理解一个数据库。介绍一个经验,例如学习mysql,可以先尝试单步跟踪一个insert语句的完整流程,并且可以优先跟踪innodb内部的流程。这样可以对存储格式、B树、缓存系统、redo log有一个大概的理解。然后不断反复这个跟踪过程,最终把关联模块也搞清楚了。
重复这个流程,扩大到更多场景,例如更新、删除、查询等,尽量不放过任何一个细节,同时多写一些学习记录,巩固自己的理解,最后源码面前是没有秘密的。
陈老师能否给我们介绍一下Tendis的产生背景?
从2012年开始,腾讯游戏就开始使用redis来作为业务缓存来提供服务。随着业务的不断壮大,特别是手游爆发性增长,redis作为缓存暴露了一些比较大的问题:
1. 成本。redis作为纯内存数据库,性能特别高。但随着业务的不断接入,数据量越来越大,也发现不少业务把redis直接当成了存储,QPS和访问延时其实并不高。这个时候,基于纯内存的redis成本就显得太高,并且存在浪费。
2. 可靠性。redis毕竟是一个内存数据库,数据的可靠性并不能让人放心。因此,业务上redis+mysql这样的组合被广泛使用,但业务必须小心翼翼地处理缓存和存储的一致性问题。
因此,需要有一个redis协议的存储来降低成本以及替代部分mysql存储场景。于是,Tendis就立项了。从2015年立项到现在,已经有了6年时间。
同样作为优秀的KV数据库产品,Tendis也有着它的独到之处,基于Redis与RocksDB的组合取长补短,非常新颖,还请陈老师为社区朋友们介绍一下Tendis这款产品。
简单地理解,Tendis就是一个支持redis协议的KV分布式存储。因此,Tendis首先需要保证数据落地存储,其次协议和命令完全兼容。
数据落地,我们选择的是rocksdb,看中的是它成熟的社区,强大的功能和高性能。rocksdb可以认为是目前最强大和最可靠的事务型存储引擎之一。
对于协议和命令的兼容,Tendis的目标是真正的完全兼容。协议兼容,其实这个比较容易,更困难的是命令的完全兼容。例如,zset在redis使用内存skiplist来实现,那么在Tendis基于rocksdb如何实现呢?目前Tendis的实现方式跟其他类似的redis存储都不太一样,我们基于什么考虑?5月22日的分享会有这方面的解读。
另外,Tendis的目标是命令的完全兼容,例如LUA和SCAN,我们也是花了较大的精力去实现和支持。因为,在过去几年的业务推动发现,只要与redis少量的不兼容或行为不一致,业务从redis迁移过来都需要花很大精力去评估和沟通。因此,命令兼容性是Tendis目前非常重要的一个方向。Tendis也是目前命令兼容性做得最好的redis存储。
最后,其分布式解决方案也是非常重要的一点,也是这次分享的重点。
Tendis自2019年内部发布,沉淀了一年终于在2020年面终于向大众,相对于19年,Tendis面向外界后又带来了哪些亮点,可否介绍一下呢?
2019年以来,Tendis主要做了两个方向的优化:
1. 存储版去中心化架构,实现类似redis cluster的去中心化架构,减少运维成本
2. 冷热混合存储架构,热数据在缓存层,全量数据在存储层,加速热数据的访问效率。
这两个架构都会在5月22日的分享中更详细地介绍,敬请期待。
最后小编想就Tendis的使用,替大家咨询陈老师一个问题,一款优秀的产品的推广,除了本身产品的优秀设计之外,运行的稳定性和适用场景也是至关重要。陈老师可否简单介绍下呢?
Tendis在2015年立项以来,其实架构也经历过多次调整,也踩过很多坑,经历了腾讯海量业务的洗礼。运行的稳定性,除了一些基本设计外,有几个原则需要保证:
1. 化繁为简。当设计一个功能,逻辑特别复杂,耦合模块特别多的时候,要时刻提醒是不是搞复杂了。是需求不合理还是设计有问题?需要敢于否定以前的设计和实现。需要用简单的逻辑来解决大部分的问题。
2. 测试的完备性。Tendis在设计与实现的初期,就非常重视单元测试框架的开发与编写。后面逻辑变复杂了,模块测试和集成测试的测试用例也需要不断丰富。另外,版本的灰度验证策略也非常重要。
3. 诊断的能力。目前Tendis仍在不断完善的就是暴露更多的有价值的内部信息,用于评估内部运行的稳定性。例如rocksdb关键特性,过期处理信息,compaction行为,内部排队情况,锁持有情况等等。一个系统的稳定需要依赖长期的运营,而长期的运营需要依赖一些内部数据进行优化分析和决策。
这些方面的思考,期待5月22日的分享中与大家的讨论。