精华内容
下载资源
问答
  • 2022-04-24 15:22:21

    TcaplusDB 是腾讯自主研发的NOSQL数据库,本文介绍其技术原理。

    数据库技术是通过研究数据库的结构、存储、设计、管理以及应用的基本理论和实现方法,并利用这些理论和方法来实现对数据库中的数据的处理、分析、转化等操作。
    数据库技术作为计算机数据处理与信息管理系统的核心,研究和解决了计算机信息处理过程中大量数据有效地组织和存储的问题,在数据库系统中减少数据存储冗余、实现数据共享、保障数据安全以及高效地检索数据和处理数据。


    存储原理

    一个表通过HASH分表,按照路由数组长度(默认为10k)进行取模运算分片(Mod Sharding),所以每张表最多可以分成10k个分片(Shard)。以下图为例,1个TcaplusDB表被分为5个Shard文件分布到不同存储节点,每个结点分布有1个或多个分片的数据。
    在这里插入图片描述

    ​ 图3.1 TcaplusDB存储技术示意图
    3.2 系统扩容
    TcaplusDB扩容分别在存储层和接入层进行。从第2章节的架构图中,可以看到接入层即Tcap Proxy层,存储层即Tcapsvr层(主备节点)。对于接入层而言,采用的是无状态设计,所以可以灵活水平扩缩容,且不影响线上业务,对业务无感知 ; 对于存储层而言,由于表采用的是分片设计,在扩容时需要将原机器上的分片水平迁移到新机器上,达到扩容存储空间的目的。以图3.2为例,Table A在扩容前,只有一个分片Shard 1, 路由数组长度为10k。在扩容时,将该表分为两个分片,其中路由项0-5k放在Shard1 , 路由项5001-10k放在Shard2,2个shard分别存储到两个存储节点上。

    在这里插入图片描述

    ​ 图3.2 存储节点扩容示意图
    数据迁移过程见图3.3,原TcaplusDB Salve节点上数据会复制到新的TcaplusDB Master节点,通过binlog同步保持数据完整性,接入层tcapoxy的数据请求重定向到新的TcaplusDB集群。
    在这里插入图片描述

    ​ 图3.3 扩容后请求重定向示意图
    接入层扩容,如图3.4所示,通过一致性哈希路由切换,将原来由4个tcaproxy负责转发的路由,平均分配给5个tcaproxy,路由切换过程不会造成消息丢失。
    在这里插入图片描述

    ​ 图3.4 接入层扩容示意图
    TcaplusDB的扩容基于存储节点的磁盘使用率和QPS (Queries per Second) 2个维度。当单台存储节点容量使用达到一定阈值后即触发扩容操作。


    img

    TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。

    更多相关内容
  • 01【TcaplusDB知识库】什么是TcaplusDB数据库? TcaplusDB与MongoDB术语对比 SQL术语/概念 MongoDB术语/概念 TcaplusDB术语/概念 解释/说明 database database cluster 数据库 table collection table...

    01【TcaplusDB知识库】什么是TcaplusDB数据库?

    TcaplusDB与MongoDB术语对比

    SQL术语/概念MongoDB术语/概念TcaplusDB术语/概念解释/说明
    databasedatabasecluster数据库
    tablecollectiontablegroup/table数据库表/集合
    rowdocumentrecord数据记录行/文档
    columnfieldfield数据字段/域
    indexindexindex索引
    primary keyprimary keyprimary key“主键,MongoDB自动将_id字段设置为主键”

    TcaplusDB表由主键字段和非主键字段两部分组成,主键字段最多可以指定8个,普通字段(非普通字段)最多可以指定256个。

    img

    按照表定义可分为Protobuf表和TDR表,按照表结构可以分为Generic表和List表。

    Protobuf表定义

    TDR表定义

    Generic表和List表

    分表因子

    Tcaplus的表定义要求设置一个分表因子(splittablekey)属性,分表因子必须是主键字段(primarykey)的子集。本质上,splittablekey所包含的字段将参与hash计算,然后根据hash值决定该记录被存储至集群中的哪个节点。因此,一个表的多个记录,它们splittablekey字段的值应该是多样化的,这样数据分布才比较均衡。举例来说,假设一个表的primarykey是"uid,role_id,zone_id",其中uid和role_id的值足够多样,而zone_id只有几个、最多几百个不同的值,那么使用zone_id作为splittablekey将会有很大的风险,若某个特定zone_id对应的记录特别多,会导致Tcaplus特定的存储节点严重过载,甚至数据量超过机器存储容量而无法提供服务。假设一个表的分表因子是性别,这会导致数据最多分布到2个存储节点, 那么业务的分布式能力就会被限制到最多2个存储节点的性能上。

    分表因子决定了数据的物理分布(系统根据该字段做hash分散到不同节点),建议取离散度高的字段,利于负载均衡。不指定时默认取primarykey的所有字段。

    记录

    TcaplusDB记录由一行字符串组成每个字段的数字都支持嵌套类型,嵌套最多32层。单个记录大小最高10MB,可以将常用的对象文件序列化成二进制文件存储。

    img

    索引

    TcaplusDB支持两种形式的索引:本地索引和全局索引。

    • 本地索引:基于TcaplusDB主键字段建立的索引,在建表时随表一起建立。
    • 全局索引:基于TcaplusDB表一级字段(包括主键字段和非主键字段)建立的索引。

    通过本地索引和全局索引,用户可方便利用索引进行数据查询。优势:

    • 基于本地索引查询,可以满足用户通过部分主键字段进行索引查询
    • 基于全局索引,可以满足用户通过任意一级字段进行多种形式查询,如范围、模糊、聚合、分页等。

    img

    本地索引

    基于TcaplusDB主键字段建立的索引,在建表时随表一起建立。

    创建

    本地索引是在建立表的时候,在表定义中申明的,比如proto或者xml文件中。并且一旦表创建后,就不能再增加、修改和删除本地索引了,删除表的时候,本地索引会一并删除。

    查询

    本地索引只支持等值查询,也就说,使用本地索引查询时,需要将本地索引中定义的字段全部都给值,比如定义了本地索引,包含字段为key1, key2,那么使用该索引进行查询时,就必须把key1和key2的值给出来才可以,并且是key1=XXX and key2=XXX的方式进行查询;

    在tcaplus中,对应的是GetByPartKey请求,只有该请求是利用本地索引进行查询的;

    由于本地索引查询时,可能会返回非常多的数据,此时,tcaplus会进行分包返回的,如果业务侧收包速度低于tcaplus返回响应包的速度,那么就可能导致tcaplus出现因为网络缓存区满而丢包的情况,一般建议是使用本地索引查询时,利用limit和offset的方式来分多次请求数据,特别是当数据量很大时。

    特点

    • 本地索引是实时索引,当插入或者删除数据时,会同时更新索引数据;
    • 本地索引的字段必须包含在主键字段中,并且字段中还必须包含分表因子,因此,查询时最终只会落到一个数据分片上进行查询;
    • 本地索引只支持等值查询;
    • 一个表可以建立多个本地索引,查询时必须包含某一个本地索引的全部字段;
    • 目前只有generic表支持本地索引;

    约束

    • 本地索引一旦创建,无法在使用期间修改、删除、新增,随表删除而删除。
    • 本地索引只支持精确匹配,即在用本地索引字段作为查询条件时,只能精确匹配到具体值,不支持模糊、范围匹配。
    • 本地索引必须包含分片因子。
    • 本地索引中的字段都必须属于主键字段。
    • 对其它非主键字段建立本地索引也是不允许的。

    注意事项

    假设本地索引包含的字段为key1, key2,如果出现key1=XXX and key2=XXX的记录数非常多时,当进行这个条件的本地索引查询时,就很容易出现性能问题,需要尽量避免,当然,目前tcaplus是没有限制记录数个数的。

    全局索引

    全局索引是基于TcaplusDB表一级字段(包括主键字段和非主键字段)建立的索引,顾名思义,就是tcaplus与索引系统之间是相互独立的,通过异步同步的方式,将tcaplus中的数据同步到索引系统,因此,全局索引是一个准实时索引系统,即进行索引查询时,tcaplus表中新更新的数据无法实时查询出来,正常情况下,新更新的数据到能够通过索引查询出来的时延为秒级,大部分情况是1秒之内;

    全局索引目前只支持对generic表建立索引,并且只支持表的一级字段(包括key字段和value字段)建立索引;并且也只支持简单类型建立索引,支持的类型包括:int8, uint8, int16, uint16, int32, uint32, int64, uint64, float, double, string(字符串); 对于pb表的bool和enum类型也支持,当pb表字段定义为string类型,如果该字段存储的是二进制,那么查询结果可能会不符合预期;对于uint64类型,如果值大于int64的最大值,查询结果将不符合预期,因此,如果该字段值会超过int64的最大值,建议不要为该字段建立索引;

    tcaplus支持动态创建和修改索引,业务可以随时增加或删除或者修改全局索引,修改全局索引时,比如增加了一个索引字段,不会影响业务对修改前的全局索引查询;

    tcaplus与全局索引之间的架构如下图所示:

    img

    创建

    创建或者修改全局索引,需要在页面上进行申请,进入oms页面,点击 “业务管理” ---- > “表管理” ---- > 选择要创建全局索引的表,拉到最右侧,如下图:

    img

    点击 “索引”,进入到索引配置页面,在该页面勾上要建立索引的字段,然后点击“确认创建索引”按钮,这样就生成了创建全局索引的申请单,dba审核之后,会生成一个创建全局索引的事务,当事务执行成功后,该索引就可以被访问了。

    数据同步

    数据同步,是指tcaplus数据同步到索引系统,两者之间的数据是最终一致的,数据同步架构如下图所示:

    img

    查询

    tcaplus提供sql查询语句进行索引查询,其中,sql查询条件中的字段必须是建立了全局索引的字段,另外,如果是聚合查询,那么聚合查询的字段也必须是建立了全局索引的字段;

    一个索引查询请求,当前限制最多返回3000条记录;

    img

    索引使用方式

    • tcaplus_client客户端工具

    tcaplus_client工具支持全局索引查询,查询命令直接使用sql查询语句进行查询即可,使用help select 命令可以获取相关查询命令。注意tcaplusdb_client使用版本,目前最新的支持3.46.0。

    • C++ SDK

    C++ SDK 已集成相关全局索引API,在示例代码中也有相关实现,具体请参考:

    C++ TDR SDK 全局二索引示例路径

    TcaplusServiceApiXXX/release/x86_64/examples/tcaplus/C++_tdr1.0_syncmode_generic_simpletable/SingleOperation/globle_index_query
    

    C++ PB SDK全局索引示例路径

    TcaplusPbApiXXX/release/x86_64/examples/tcaplus/C++_pb2_coroutine_simpletable/SingleOperation/global_index_query
    

    支持的sql语句

    1. 条件查询

    支持 =, >, >=, <, <=, !=, between, in, not in, like, not like, and, or , 比如:

    select * from table where a > 100 and b < 1000;
     
    select * from table where a between 1 and 100 and b < 1000;
     
    select * from table where str like "test";
     
    select * from table where a > 100 or b < 1000;
    

    注意:between查询时,between a and b,对应的查询范围为[a, b],比如 between 1 and 100, 是会包含1和100这两个值的,即查询范围为[1,100]

    注意:like查询是支持模糊匹配,其中"%"通配符,匹配0个或者多个字符; “_”通配符,匹配1个字符;

    1. 分页查询

    支持limit offset分页查询,比如:

    select * from table whre a > 100 limit 100 offset 0;
    

    注意:当前limit必须与offset搭配使用,即不支持limit 1 或者 limit 0,1这种;

    1. 聚合查询

    当前支持的聚合查询包括:sum, count, max, min, avg,比如:

    select sum(a), count(*), max(a), min(a), avg(a) from table where a > 1000;
    

    注意:聚合查询不支持limit offset,即limit offset 不生效;

    注意:目前只有count支持distinct,即 select count(distinct(a)) from table where a > 1000; 其他情况均不支持distinct

    1. 部分字段查询

    支持查询部分字段的值,比如:

    select a, b from table where a > 1000;
    

    对于pb表,还支持查询嵌套字段的值,类似:

    select field1.field2.field3, a, b from table where a > 1000;
    

    不支持的sql查询语句

    1. 不支持聚合查询与非聚合查询混用
    select *, a, b from table where a > 1000;
     
    select sum(a), a, b from table where a  > 1000;
     
    select count(*), * from table where a  > 1000;
    
    1. 不支持order by查询
    select * from table where a > 1000 order by a;
    
    1. 不支持group by查询
    select * from table where a > 1000 group by a;
    
    1. 不支持having查询
    select sum(a) from table where  a > 1000 group by a having sum(a) > 10000;
    
    1. 不支持多表联合查询
    select * from table1 where table1.a > 1000 and table1.a = table2.b;
    
    1. 不支持嵌套select查询
    select * from table where a > 1000 and b in (select b from table where b < 5000);
    
    1. 不支持别名
    select sum(a) as sum_a from table where a > 1000;
    
    1. 不支持的其他查询
    • 不支持join查询;
    • 不支持union查询;
    • 不支持类似 select a+b from table where a > 1000 的查询;
    • 不支持类似 select * from table where a+b > 1000 的查询;
    • 不支持类似 select * from table where a >= b 的查询;
    • 不支持其他未提到的查询。

    img

    TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。

    展开全文
  • 而今年,是TcaplusDB发展的第十年,TcaplusDB在这十年里的经历,就像一棵树的成长,背负着许多人的期望与信任,从找不到需求险些被叫停,到支撑亿级DAU的数据库行业标杆,TcaplusDB一直在不断前行。我仿佛看到了十年...

    春发芽

    夏开花

    秋叶落

    冬休憩

    伴随着春天的到来,又是万物生长的季节,一年一度的植树节到来了。

    植下一棵树,收获万点绿,种下一棵树,也就代表着种下了一份希望,这棵树在会抽枝发叶,开花结果,这些变化都是值得期待的。

    而今年,是TcaplusDB发展的第十年,TcaplusDB在这十年里的经历,就像一棵树的成长,背负着许多人的期望与信任,从找不到需求险些被叫停,到支撑亿级DAU的数据库行业标杆,TcaplusDB一直在不断前行。我仿佛看到了十年前创建TcaplusDB的前辈在跟我们说:“期待莫辜负,扎根做大树。”

    在这里插入图片描述

    不知不觉中,腾讯云数据库TcaplusDB在风雨中已经走过了整整10年。

    这10年里,我们经历了很多,但不变的是我们想做一款好用的数据库的初心。

    出发

    2010年前后,QQ空间很火,带动了基于SNS互动页游(WebSNS)的火爆,腾讯内部开始考虑怎么做页游。也开始建设页游基础技术体系,其中最重要的产出是研发自己的分布式数据库TcaplusDB。

    与MMOG游戏不同,通常WebSNS游戏是全区全服的,数据集中存储;而其游戏逻辑服务器是对等的,web客户端通过短连接与服务器进行通信,也就是说玩家游戏过程,后端交互的逻辑服务器随时会变动;这些特性导致在逻辑层不方便对用户数据做缓存。

    此外,WebSNS游戏基于玩家之间社会关系的互动场景非常多,玩家的一个互动操作,需要读取和修改与此关联的其他多个玩家的数据;这意味着web游戏中数据读写访问频率高于同时在线数,其访问频率实际上是在线数的N倍;假如某个100万在线的web游戏,平均每个玩家有50个好友,如果同时有1%的玩家触发一个好友动作,则可能会触发50万次数据访问。也就是说,基于这样的场景,web游戏的数据库层需要支持比传统MMOG游戏大的多的访问频率,如果仍然采用传统的数据库管理系统(如MySQL),要支持这么大的访问频率,其代价非常大。

    因此,在游戏逻辑层和传统数据库管理系统之间架设高速的缓存系统,对web游戏来说至关重要。 当时业界已经有比较多的提供高速数据访问的NoSQL产品,不可否认,这些NoSQL产品在一定场景下使用是很优秀的,但在部分场景或需求下存在不支持或不够出色的情况——比如全内存带来的成本问题或对异步数据读写支持不够等。

    2011年起,腾讯内部开始着手研发一款自己的分布式游戏数据库系统——TcaplusDB。这是个很美好的愿景。但从零开始自己研发一款数据库又谈何容易?2009 年开始,大量新的NoSQL数据库涌现,在整个行业掀起了一场NoSQL 革命,如今赫赫有名的 Redis、MongoDB 皆诞生于那一年。研发TcaplusDB是高楼万丈平地起的事情,我们一边调研外部产品,一边抓住游戏行业特定的场景和需求,做最小化的产品验证。经过不断的验证,第一个版本在2012年初终于出炉。

    时机

    2012年4月,TcaplusDB首次正式提供服务,支持腾讯自研的页游《夜店之王》。《夜店之王》是腾讯自主研发的一款以时尚夜店为题材,以夜店经营为核心,融入吸血鬼元素的模拟经营类社交游戏。在这里插入图片描述
    当时的游戏,大部分是“分区分服”的形式,每个区域内的玩家自己玩。但基于社交场景的WebSNS需要所有的好友在一起玩。《夜店之王》就是这样典型的场景,TcaplusDB的高性能和低成本赢得了项目组的青睐。由于采用了包括 TcaplusDB 数据库在内的新技术,《夜店之王》通过“全区全服”,让玩家在一个池子里“大乱斗”并通过实时派对邀请好友体验。《夜店之王》通过QQgame游戏大厅、空间、游戏人生、朋友等诸多渠道进入取得了相当不错的成绩。

    发展过程中,挫折并不是没有,2013年9月腾讯移动游戏《天天酷跑》火爆公测,开启QQ、微信双平台登陆,随时与QQ、微信好友一起玩。上线后,在不到一天的时间内就迅速登上了苹果App Store畅销榜第一位。
    在这里插入图片描述

    当初公测的时候,内部霸气地给《天天酷跑》这款新游戏配了100台服务器,对于一款新游戏,这显然是一个很充裕的配置。然而谁都没想到《天天酷跑》会这么火爆,准备的100台服务器很快就要高容量了。最后,在多部门的协同下,扩容的50台服务器快上架。硬件上架、网络打通、操作系统安装妥当,TcaplusDB的系统软件也很快部署完成。 但接下来就要通过部分数据的搬迁来实现数据库承载能力的扩容。按照正常逻辑,哪怕是停服维护,通常的扩容都有一个提前准备的过程,这次来得实在太快了,眼看旧数据库在逼近存储极限,那边不断涌入的玩家还在不断地制造新数据,搬迁的速度必须足够快,才能避免数据库爆仓。当时在业内深耕多年的大牛苦笑着说:“按照当前的情况,24小时后数据库就会崩溃,游戏只能暂时停服。” 谁都不敢面对这样的结局。

    24小时很短,也能做很多事情,一个字,干! 于是,我们和当时酷跑的业务团队一起挺身而出,背水一战,连夜调试搬迁工具,在凌晨紧急上线,硬是抗住了一波又一波海量的用户访问冲击。有了这次的经历,我们下定决心,我们要做得更好。之后的几个月,我们都在重复一件事——一行一行地码代码,看得最多的是星夜、喝得最多的是咖啡,终于把这套数据库的自动扩容系统打磨得稳定高效。

    成长

    2014年2月,TcaplusDB已经深度优化了存储引擎,推出全托管的分布式存储服务。 但还不够,远远不够。 还记得上面说的《夜店之王》吗?经过2年多的发展,此时的《夜店之王》已经是排名第一的经营类社交游戏。而《夜店之王》使用的却还是TcaplusDB的老版本。TcaplusDB的全托管版本,性能得到了较大的提升,在服务上给项目组带来了较大的便利性。因此,将《夜店之王》TcaplusDB切换到全托管版本被提升日程。在这里插入图片描述

    由于《夜店之王》是线上业务,且此次切换TcaplusDB不能停服,还得解决新老协议不同、落地数据格式不同、数据分布不同等问题。对于任何一个团队,都是一个很大的挑战。 最终,在跟《夜店之王》团队的联合攻坚之下,我们通过数据双写、增加协议转换层、数据一致性校验工具等工作。最终完美实施了服务的迁移,在这个时期积累的数据迁移方案,也为后续TcaplusDB在无损水平扩展、无损数据迁移能力的产品化打下了坚实的基础。

    2015年年底《王者荣耀》正式公测。这款游戏的火爆程度又一次突破了大家的想象力,这个游戏就像一个永远不能满足的巨兽,势不可挡地吞噬着各种后台资源。在打破各种游戏记录的同时,这个逆天的游戏每一秒钟都在创造数据库的新纪录。

    最疯狂的游戏浪潮,一般出现在周末。回想那个时候,一到周末,我们就在家盯着电脑,看着各种数字疯狂飙升。前期的技术积累终于派上了用场,严阵以待的技术人也终究见证了历史。几千台服务器在预先设定好的统一调度机制下不停服自动扩容,完美扛过流量高峰。同年,TcaplusDB又相继推出故障自动恢复、不停服升级、不停服扩缩容功能,成功支持了《天天爱消除》、《全民飞机大战》、《全民突击》、《CF手游》和《火影忍者手游》等游戏。

    2016年,TcaplusDB陆续推出细粒度备份回档、软硬件升级、机房裁撤搬迁、软硬件故障对业务无损等核心能力。同时优化单业务海量数据访问能力,提供稳健高性能的数据存储服务。 2017年元宵晚会,在春晚小品《回家》中,主持人提到了《王者荣耀》,这让团队即紧张又兴奋。接着,又是一路不断飙升的QPS陪伴着我们度过一个不眠之夜,好在最后又是有惊无险。 同年,TcaplusDB支持protobuf数据格式定义及访问,协议更加开放,兼容行业使用习惯。

    2018年,TcaplusDB将高可用、无损扩缩容做到极致,深度优化性能降低成本,提升Api多语言、多平台、多模式、易使用的能力,陆续为《QQ飞车》、《无限法则》等游戏提供高品质数据存储服务。

    开放

    2019年凭借多年的积累和在游戏分布式系统情景中适配能力,TcaplusDB做为腾讯完全自研的NoSQL数据库,正式成为腾讯云Tcaplus,通过腾讯云对外提供服务。结合了腾讯云的优势后,腾讯云Tcaplus又在多租户、安全性、开放API和多语言SDK等方面有了极大的提升。

    2020年NEXON、上海盛趣等游戏厂商开始选择腾讯云TcaplusDB做为游戏的核心数据库支撑业务。根据客户的测试与使用反馈,TcaplusDB的毫秒级时延、千万级QPS、无限水平扩展无需分库分表、细粒度回档、合服和无损弹性变配等能力能够实实在在的帮助到游戏业务。 腾讯云TcaplusDB的核心能力得到了客户的认可的同时,不得不提一提我们强大的迁移服务。当时上海盛趣使用的是DynamoDB,上海盛趣的技术团队需要解决开发者不熟悉腾讯云TcaplusDB的用法和已有代码迁移的问题。

    通过沟通,腾讯云TcaplusDB的接口的易用性得到了客户的充分认可,重点转移到了已有代码如何迁移到腾讯云TcaplusDB 接口上。经过双方技术团队的沟通,上海盛趣的架构中有一个数据访问适配层,所有的数据库访问均通过该适配层,问题一下变得清晰和简单了起来。腾讯云派出技术专家驻场,仅仅用了两周时间就和上海盛趣的研发团队一起完成了代码迁移的工作。

    至此,TcaplusDB开始全面为公有云客户提供服务。在这里插入图片描述

    2020年12月14日,中国信息通信研究院官方权威公布第十一批大数据产品能力评测结果,腾讯云TcaplusDB成为首批通过键值型内存数据库功能评测的分布式NoSQL数据库产品。

    2021年1月,TcaplusDB社区上线,这标志着TcaplusDB将通过和广大的用户及行业合作伙伴进行交流和共建,持续推动国产分布式NoSQL数据库生态的繁荣。

    下一个十年:为行业提供更多助力

    自诞生以来,腾讯云TcaplusDB就以服务更多开发者为目标,面向拥有使用高性能数据库的研发人员,分享经过腾讯内部检验的存储研发经验、工具和行业资源。

    而在未来,腾讯云TcaplusDB还将以国产数据库领航者的身份,在这条道路上走得更远,根据行业动态为平台引入更多元化的功能。同时,腾讯云TcaplusDB将和行业合作伙伴一起,继续分享腾讯分布式数据库方面的经验,并将积极投入基于多模和多负载能力的一站式低成本数据处理能力的研发;满足基于全球分布式能力,助力企业解决业务出海、全球同服/多活、跨域数据迁移等关键业务领域需求。

    在下一个十年,诞生于游戏的TcaplusDB,还将继续为更多行业优化数据服务能力,贡献自己的力量。

    展开全文
  • 【深入理解TcaplusDB技术】TcaplusDB数据库介绍 TcaplusDB与MongoDB概念对比 SQL术语/概念 MongoDB术语/概念 TcaplusDB术语/概念 解释/说明 database database cluster 数据库 table collection table...

    【深入理解TcaplusDB技术】TcaplusDB数据库介绍

    TcaplusDB与MongoDB概念对比

    SQL术语/概念MongoDB术语/概念TcaplusDB术语/概念解释/说明
    databasedatabasecluster数据库
    tablecollectiontablegroup/table数据库表/集合
    rowdocumentrecord数据记录行/文档
    columnfieldfield数据字段/域
    indexindexindex索引
    primary keyprimary keyprimary key“主键,MongoDB自动将_id字段设置为主键”

    TcaplusDB表由主键字段和非主键字段两部分组成,主键字段最多可以指定8个,普通字段(非普通字段)最多可以指定256个。

    img

    按照表定义可分为Protobuf表和TDR表,按照表结构可以分为Generic表和List表。

    Protobuf表定义

    TDR表定义

    Generic表和List表

    分表因子

    Tcaplus的表定义要求设置一个分表因子(splittablekey)属性,分表因子必须是主键字段(primarykey)的子集。本质上,splittablekey所包含的字段将参与hash计算,然后根据hash值决定该记录被存储至集群中的哪个节点。因此,一个表的多个记录,它们splittablekey字段的值应该是多样化的,这样数据分布才比较均衡。举例来说,假设一个表的primarykey是"uid,role_id,zone_id",其中uid和role_id的值足够多样,而zone_id只有几个、最多几百个不同的值,那么使用zone_id作为splittablekey将会有很大的风险,若某个特定zone_id对应的记录特别多,会导致Tcaplus特定的存储节点严重过载,甚至数据量超过机器存储容量而无法提供服务。假设一个表的分表因子是性别,这会导致数据最多分布到2个存储节点, 那么业务的分布式能力就会被限制到最多2个存储节点的性能上。

    分表因子决定了数据的物理分布(系统根据该字段做hash分散到不同节点),建议取离散度高的字段,利于负载均衡。不指定时默认取primarykey的所有字段。

    记录

    TcaplusDB记录由一行字符串组成每个字段的数字都支持嵌套类型,嵌套最多32层。单个记录大小最高10MB,可以将常用的对象文件序列化成二进制文件存储。

    img

    索引

    TcaplusDB支持两种形式的索引:本地索引和全局索引。

    • 本地索引:基于TcaplusDB主键字段建立的索引,在建表时随表一起建立。
    • 全局索引:基于TcaplusDB表一级字段(包括主键字段和非主键字段)建立的索引。

    通过本地索引和全局索引,用户可方便利用索引进行数据查询。优势:

    • 基于本地索引查询,可以满足用户通过部分主键字段进行索引查询
    • 基于全局索引,可以满足用户通过任意一级字段进行多种形式查询,如范围、模糊、聚合、分页等。

    img

    本地索引

    基于TcaplusDB主键字段建立的索引,在建表时随表一起建立。

    创建

    本地索引是在建立表的时候,在表定义中申明的,比如proto或者xml文件中。并且一旦表创建后,就不能再增加、修改和删除本地索引了,删除表的时候,本地索引会一并删除。

    查询

    本地索引只支持等值查询,也就说,使用本地索引查询时,需要将本地索引中定义的字段全部都给值,比如定义了本地索引,包含字段为key1, key2,那么使用该索引进行查询时,就必须把key1和key2的值给出来才可以,并且是key1=XXX and key2=XXX的方式进行查询;

    在tcaplus中,对应的是GetByPartKey请求,只有该请求是利用本地索引进行查询的;

    由于本地索引查询时,可能会返回非常多的数据,此时,tcaplus会进行分包返回的,如果业务侧收包速度低于tcaplus返回响应包的速度,那么就可能导致tcaplus出现因为网络缓存区满而丢包的情况,一般建议是使用本地索引查询时,利用limit和offset的方式来分多次请求数据,特别是当数据量很大时。

    特点

    • 本地索引是实时索引,当插入或者删除数据时,会同时更新索引数据;
    • 本地索引的字段必须包含在主键字段中,并且字段中还必须包含分表因子,因此,查询时最终只会落到一个数据分片上进行查询;
    • 本地索引只支持等值查询;
    • 一个表可以建立多个本地索引,查询时必须包含某一个本地索引的全部字段;
    • 目前只有generic表支持本地索引;

    约束

    • 本地索引一旦创建,无法在使用期间修改、删除、新增,随表删除而删除。
    • 本地索引只支持精确匹配,即在用本地索引字段作为查询条件时,只能精确匹配到具体值,不支持模糊、范围匹配。
    • 本地索引必须包含分片因子。
    • 本地索引中的字段都必须属于主键字段。
    • 对其它非主键字段建立本地索引也是不允许的。

    注意事项

    假设本地索引包含的字段为key1, key2,如果出现key1=XXX and key2=XXX的记录数非常多时,当进行这个条件的本地索引查询时,就很容易出现性能问题,需要尽量避免,当然,目前tcaplus是没有限制记录数个数的。

    全局索引

    全局索引是基于TcaplusDB表一级字段(包括主键字段和非主键字段)建立的索引,顾名思义,就是tcaplus与索引系统之间是相互独立的,通过异步同步的方式,将tcaplus中的数据同步到索引系统,因此,全局索引是一个准实时索引系统,即进行索引查询时,tcaplus表中新更新的数据无法实时查询出来,正常情况下,新更新的数据到能够通过索引查询出来的时延为秒级,大部分情况是1秒之内;

    全局索引目前只支持对generic表建立索引,并且只支持表的一级字段(包括key字段和value字段)建立索引;并且也只支持简单类型建立索引,支持的类型包括:int8, uint8, int16, uint16, int32, uint32, int64, uint64, float, double, string(字符串); 对于pb表的bool和enum类型也支持,当pb表字段定义为string类型,如果该字段存储的是二进制,那么查询结果可能会不符合预期;对于uint64类型,如果值大于int64的最大值,查询结果将不符合预期,因此,如果该字段值会超过int64的最大值,建议不要为该字段建立索引;

    tcaplus支持动态创建和修改索引,业务可以随时增加或删除或者修改全局索引,修改全局索引时,比如增加了一个索引字段,不会影响业务对修改前的全局索引查询;

    tcaplus与全局索引之间的架构如下图所示:

    img

    创建

    创建或者修改全局索引,需要在页面上进行申请,进入oms页面,点击 “业务管理” ---- > “表管理” ---- > 选择要创建全局索引的表,拉到最右侧,如下图:

    img

    点击 “索引”,进入到索引配置页面,在该页面勾上要建立索引的字段,然后点击“确认创建索引”按钮,这样就生成了创建全局索引的申请单,dba审核之后,会生成一个创建全局索引的事务,当事务执行成功后,该索引就可以被访问了。

    数据同步

    数据同步,是指tcaplus数据同步到索引系统,两者之间的数据是最终一致的,数据同步架构如下图所示:

    img

    查询

    tcaplus提供sql查询语句进行索引查询,其中,sql查询条件中的字段必须是建立了全局索引的字段,另外,如果是聚合查询,那么聚合查询的字段也必须是建立了全局索引的字段;

    一个索引查询请求,当前限制最多返回3000条记录;

    img

    索引使用方式

    • tcaplus_client客户端工具

    tcaplus_client工具支持全局索引查询,查询命令直接使用sql查询语句进行查询即可,使用help select 命令可以获取相关查询命令。注意tcaplusdb_client使用版本,目前最新的支持3.46.0。

    • C++ SDK

    C++ SDK 已集成相关全局索引API,在示例代码中也有相关实现,具体请参考:

    C++ TDR SDK 全局二索引示例路径

    TcaplusServiceApiXXX/release/x86_64/examples/tcaplus/C++_tdr1.0_syncmode_generic_simpletable/SingleOperation/globle_index_query
    

    C++ PB SDK全局索引示例路径

    TcaplusPbApiXXX/release/x86_64/examples/tcaplus/C++_pb2_coroutine_simpletable/SingleOperation/global_index_query
    

    支持的sql语句

    1. 条件查询

    支持 =, >, >=, <, <=, !=, between, in, not in, like, not like, and, or , 比如:

    select * from table where a > 100 and b < 1000;
     
    select * from table where a between 1 and 100 and b < 1000;
     
    select * from table where str like "test";
     
    select * from table where a > 100 or b < 1000;
    

    注意:between查询时,between a and b,对应的查询范围为[a, b],比如 between 1 and 100, 是会包含1和100这两个值的,即查询范围为[1,100]

    注意:like查询是支持模糊匹配,其中"%"通配符,匹配0个或者多个字符; “_”通配符,匹配1个字符;

    1. 分页查询

    支持limit offset分页查询,比如:

    select * from table whre a > 100 limit 100 offset 0;
    

    注意:当前limit必须与offset搭配使用,即不支持limit 1 或者 limit 0,1这种;

    1. 聚合查询

    当前支持的聚合查询包括:sum, count, max, min, avg,比如:

    select sum(a), count(*), max(a), min(a), avg(a) from table where a > 1000;
    

    注意:聚合查询不支持limit offset,即limit offset 不生效;

    注意:目前只有count支持distinct,即 select count(distinct(a)) from table where a > 1000; 其他情况均不支持distinct

    1. 部分字段查询

    支持查询部分字段的值,比如:

    select a, b from table where a > 1000;
    

    对于pb表,还支持查询嵌套字段的值,类似:

    select field1.field2.field3, a, b from table where a > 1000;
    

    不支持的sql查询语句

    1. 不支持聚合查询与非聚合查询混用
    select *, a, b from table where a > 1000;
     
    select sum(a), a, b from table where a  > 1000;
     
    select count(*), * from table where a  > 1000;
    
    1. 不支持order by查询
    select * from table where a > 1000 order by a;
    
    1. 不支持group by查询
    select * from table where a > 1000 group by a;
    
    1. 不支持having查询
    select sum(a) from table where  a > 1000 group by a having sum(a) > 10000;
    
    1. 不支持多表联合查询
    select * from table1 where table1.a > 1000 and table1.a = table2.b;
    
    1. 不支持嵌套select查询
    select * from table where a > 1000 and b in (select b from table where b < 5000);
    
    1. 不支持别名
    select sum(a) as sum_a from table where a > 1000;
    
    1. 不支持的其他查询
    • 不支持join查询;
    • 不支持union查询;
    • 不支持类似 select a+b from table where a > 1000 的查询;
    • 不支持类似 select * from table where a+b > 1000 的查询;
    • 不支持类似 select * from table where a >= b 的查询;
    • 不支持其他未提到的查询。

    img

    1. 不支持的其他查询
    • 不支持join查询;
    • 不支持union查询;
    • 不支持类似 select a+b from table where a > 1000 的查询;
    • 不支持类似 select * from table where a+b > 1000 的查询;
    • 不支持类似 select * from table where a >= b 的查询;
    • 不支持其他未提到的查询。

    [外链图片转存中…(img-WSIGuAjY-1652081105349)]

    TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。

    展开全文
  • 在计算机系统上运行的数据库中往往存储着大量重要信息,涉及金融、生活、隐私等方方面面,对于一个数据库来说,数据安全的重要性不言而喻,本文从4个方面介绍TcaplusDB的系统安全。 网络安全 互联网给人们带来了...
  • TcaplusDB 版本在 3.57.1 之后兼容 MySQL 5.7 协议,支持MySQL 的基本功能和语法。MySQL 生态的客户端驱动、工具均适用于 TcaplusDB。 兼容 MySQL 协议是 TcaplusDB 的新特性,目前支持的 SQL 功能有限,包括以下7个...
  • TcaplusDB知识库】TDR 表中Tcaplus的相关属性 主键 primarykey primarykey属性指明此元素对应数据库表的主键,其取值为以当前元素为父元素的特定子元数据成员名串,如果有多个成员组成表的主键,则成员名之间用...
  • 实验简介 相关概念 TcaplusDB:腾讯出品的分布式NoSQL数据库...通过本实验,我们将学习如何在CVM实例部署 TcaplusDB 本地 Docker 环境,并通过TcaplusDB Web 控制台完成建表,再通过 JDBC Driver 以及 TcaplusDB Conso
  • 前提 成功创建:集群,表格组,PLAYERONLINECNT表 PLAYERONLINECNT表描述文件table_test.xml如下: <?xml version="1.0" encoding="GBK" standalone="yes" ?> <metalib name="tcaplus_tb" tagsetversion="1...
  • TcaplusDB服务体系揭秘

    2021-02-26 14:50:32
    TcaplusDB服务体系揭秘 作者:张铭 导言 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的...
  • TcaplusDB-JDBC 概述 TcaplusDB为用Java编程语言开发的客户端应用程序提供了可连接性,TcaplusDB-JDBC实现了JDBC API以及它的一些增值扩展。 TcaplusDB提供了易于开发的特性,包括向驱动程序管理器自动注册、标准化...
  • please check them first." ] } TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷...
  • 为方便客户在开发过程中能在 Windows10 机器上直接部署 TcaplusDB 本地 Docker 版,介绍如何借助 Windows 已有的组件来完成整个部署过程。 前置 环境要求 依赖项 说明 Windows10 Build Version >=18362, ...
  • 数据库作为信息系统的核心,数据库设计需要根据用户的需求,针对业务逻辑上,设计结构和建立数据库。由于数据库应用系统的复杂性,数据库的...TcaplusDB作为专为游戏设计的分布式 NoSQL 数据库,作为腾讯云的数据库服务
  • tcaplus_client 是一个 TcaplusDB 表访问的客户端工具,C++编写,可以用于从命令行管理TcaplusDB。目前工具集成在C++ SDK中. 下载 Client 版本 下载地址 TcaplusPbApi3.36.0.192960.x86_64_release_20200115...
  • 而今年,是TcaplusDB发展的第十年,TcaplusDB在这十年里的经历,就像一棵树的成长,背负着许多人的期望与信任,从找不到需求险些被叫停,到支撑亿级DAU的数据库行业标杆,TcaplusDB一直在不断前行。我仿佛看到了十年...
  • TcaplusDB的开发人员考虑到了这些存储问题,在本期的知识库中,TcaplusDB君将介绍TcaplusDB的存储分配策略,关于数据的读写逻辑我们将会在下期的知识库中进行介绍。 存储空间分配的基本策略 TcaplusDB优先使用数据...
  • 简介 在PB表中批量添加数据,可指定插入方式。批量插入接口非原子接口,允许部分成功,部分失败,用户需根据返回值来判断...#TcaplusDB本地docker版 RESTful Endpoint, ip:31001, 端口默认31001 http://9.135.8.93:3100
  • 如果内网没有浏览器使用,则需要给TcapOMS机器配上外网IP,并打开其80端口给外网访问(建议限制访问源) 如果希望TcaplusDB能从外网被访问(从数据库安全考虑,只建议从内网访问DB), 那tcaproxy与tcapdir的机器...
  • 作为 NOSQL 数据库,TcaplusDB提供可扩展性以及跨数据中心场景下的高可用。本文档旨在介绍同城双数据中心部署 TcaplusDB 方案。 TcaplusDB的高可用技术原理 Tcaplus各个服务模块均已支持高可用部署 以下逐一介绍: ...
  • TcaplusDB是专为游戏设计的分布式 NoSQL 数据库,作为腾讯云的数据库服务的一部分为广大客户提供极致的游戏数据体验。目前已为《王者荣耀》、《穿越火线》、《火影忍者》等千万级 DAU 大作提供了稳定的数据存储服务...
  • ip:80, 端口默认80 http://172.17.0.22 #TcaplusDB本地docker版 RESTful Endpoint, ip:31001, 端口默认31001 http://9.135.8.93:31001 Http头 名称 是否必填 限制条件 说明 x-tcaplus-target 是 无 Tcaplus....
  • 游戏数据库TcaplusDB解决方案能力.docx
  • 而今年,是TcaplusDB发展的第十年,TcaplusDB在这十年里的经历,就像一棵树的成长,背负着许多人的期望与信任,从找不到需求险些被叫停,到支撑亿级DAU的数据库行业标杆,TcaplusDB一直在不断前行。我仿佛看到了十年...
  • 数据库大都支持命令行访问,TcaplusDB也不例外,通过安装TcaplusDB客户端,您可以方便快捷地从命令行管理与访问数据库。 TcaplusDB客户端 首先在 TcaplusServiceApi3.36下载最新的TcaplusDB API 3.36程序包并解压该...
  • TcaplusDB 是腾讯自主研发的NOSQL数据库,满足海量数据场景下的高性能、低时延、高可用性、数据持久化、无损容量弹性变配和安全合规的需求。本文介绍其技术原理。 TcaplusDB 是腾讯自主研发的NOSQL数据库,本文介绍...
  • PROTO表是基于PROTOBUF协议设计的TcaplusDB表,PROTOBUF协议是Google开源的通用RPC通信协议,用于TcaplusDB存储数据的序列化、反序列化等操作,具体关于PROTO表的定义说明可参考章节:表定义语言(PB,TDR)。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,371
精华内容 1,348
关键字:

TcaplusDB