TcaplusDB是专为游戏设计的分布式 NoSQL 数据库,作为腾讯云的数据库服务的一部分为广大客户提供极致的游戏数据体验。目前已为《王者荣耀》、《穿越火线》、《火影忍者》等千万级 DAU 大作提供了稳定的数据存储服务,依托腾讯云遍布全球五大洲(亚洲、欧洲、北美洲、南美洲、大洋洲)的基础设备服务节点,游戏开发商只需接入一次,便可方便全球游戏用户体验。具体产品详情请参考官网链接。
编号 | 组件名称 | 描述 |
---|---|---|
1 | Tcapcenter | 处理来自Web页面的请求,作为zookeeper管理整个Tcaplus集群的各个节点。 |
2 | Tcaproxy | 接入层,接收来自SDK/API的请求,再与Master节点交互,获得Master节点的返回信息后,再返回至SDK/API请求方。 |
3 | Tcapdir | 目录服务器。存储和维护Tcaproxy集群的节点信息,响应来自SDK/API查询Tcaproxy节点信息(IP地址与服务端口)的请求。 |
4 | Tcapsvr-Master | 存储层的主节点,存储数据分片,负责响应Tcaproxy请求。 |
5 | Tcapsvr-Slave | 存储层的备份节点,存储备份数据,实时备份Master节点数据。当Master节点故障时,升级作为Master节点,作为备份节点时,不与Tcaproxy通讯。 |
6 | Backup Center | 跨城市/地域冷备中心,冷备中心部署在与Master节点异地的数据中心,每日定时从Slave节点进行存储层数据冷备,每15分钟从Slave节点进行Binlog流水日志备份。 |
7 | Data Analysis | 负责将TcaplusDB中的结构化数据导出,参见6.2。 |
一个表通过HASH分表,按照路由数组长度(默认为10k)进行取模运算分片(Mod Sharding),所以每张表最多可以分成10k个分片(Shard)。以下图为例,1个TcaplusDB表被分为5个Shard文件分布到不同存储节点,每个结点分布有1个或多个分片的数据。
TcaplusDB扩容分别在存储层和接入层进行。从第2章节的架构图中,可以看到接入层即Tcap Proxy层,存储层即Tcapsvr层(主备节点)。对于接入层而言,采用的是无状态设计,所以可以灵活水平扩缩容,且不影响线上业务,对业务无感知 ; 对于存储层而言,由于表采用的是分片设计,在扩容时需要将原机器上的分片水平迁移到新机器上,达到扩容存储空间的目的。以图3.2为例,Table A在扩容前,只有一个分片Shard 1, 路由数组长度为10k。在扩容时,将该表分为两个分片,其中路由项0-5k放在Shard1 , 路由项5001-10k放在Shard2,2个shard分别存储到两个存储节点上。
数据迁移过程见图3.3,原TcaplusDB Salve节点上数据会复制到新的TcaplusDB Master节点,通过binlog同步保持数据完整性,接入层tcapoxy的数据请求重定向到新的TcaplusDB集群。
接入层扩容,如图3.4所示,通过一致性哈希路由切换,将原来由4个tcaproxy负责转发的路由,平均分配给5个tcaproxy,路由切换过程不会造成消息丢失。
TcaplusDB的扩容基于存储节点的磁盘使用率和QPS (Queries per Second) 2个维度。当单台存储节点容量使用达到一定阈值后即触发扩容操作。
TcaplusDB组件默认采用高可用部署:
TcaplusDB API维护了一致性Hash环,当增加或者减少接入层节点时,TcaplusDB API会自动调整接入层tcaproxy的信息。
接入层tcaproxy和存储层tcapsvr均有过载保护功能,超过预留读写的请求会触发错误码返回。
对于TcaplusDB来说,有完善的数据一致性保障措施,具体如下所示:
目前TcaplusDB支持两种方式数据备分:全量数据文件冷备,每日定时进行,表创建好后,自动有脚本去备份存储数据文件,全量备份文件保存周期25天;另一种是增量备份,主要基于TcaplusDB的binlog进行,每15分钟进行一次, 增量流水保存周期15天。通过两种方式备份的结合,保障了系统异常期间通过备份快速恢复的能力。
TcaplusDB的回档支持两种方式:
回档方式 | 描述 | 支持方式 |
---|---|---|
冷备回档 | 使用备份文件回档到冷备的时间点,精确到毫秒。 | 暂时通过工单支持 |
精确回档 | 使用备份文件和binlog文件回档到任意指定的时间点,精确到毫秒。 | 暂时通过工单支持 |
冷备回档和精确回档支持以下4种回档范围:
回档范围 | 描述 | 支持方式 |
---|---|---|
全服回档 | 所有表均回档 | 暂时通过工单支持 |
单表回档 | 仅单个表回档 | 暂时通过工单支持 |
记录回档 | 对单个记录回档, 回档时指定KEY即可 | 腾讯云控制台支持 |
条件回档 | 指定过滤条件回档, 如指定要回档的key | 暂时通过工单支持 |
接入层tcaproxy响应与处理请求默认使用内存池(Memory Pool)技术,从而减少内存占用。
存储层tcapsvr采用谷歌snappy压缩算法,约节省30%存储空间,可按配置的过期时间和表名进行过期数据淘汰。
存储层tcapsvr每台服务器采用单进程运行,由36个线程组成,包括主线程、30个工作线程、LRU线程、主从同步线程、数据搬迁线程、缓写线程、刷Binlog流水线程。30个工作线程分为快慢线程,例如get(按主键查找)、replace(更新)等由快线程处理,getbypartkey(按索引查找)等由慢线程处理。通过不同线程的功能划分,提升了处理效率。
TcaplusDB支持邮件、微信和电话告警,常见告警监控指标如下:
指标 | 描述 |
---|---|
一般错误率 | 用户使用错误导致的请求数占总请求数比 |
系统错误率 | 存储层节点因为TcaplusDB错误导致错误请求数目占总的请求数目的比例 |
平均错误率 | 错误请求数(一般错误数与系统错误数之和)占总请求数比 |
实际读容量单位 | 读CU,1个读CU是1次4KB的读操作 |
实际写容量单位 | 写CU,1个写CU是1次4KB的写操作 |
平均读时延 | 60秒内所有读请求的平均时延 |
平均写时延 | 60秒内所有写请求的平均时延 |
存储容量 | 存储的数据大小(GB) |
TcaplusDB支持2种类型的表,protobuf(Protocol Buffers)表TDR(Tencent Data Representation)表。Protobuf是Google开发的一种描述性语言,针对结构化数据进行序列化,同时强调简单性和性能; TDR是由腾讯开发的跨平台数据表示语言,结合了XML,二进制和ORM(对象关系映射)的优势,在腾讯游戏数据的序列化场景中广泛使用。
以下是protobuf表game_players.proto
的示例,您可以将文件上传到腾讯云控制台并创建该表。
syntax = "proto3"; // 指定protobuf语言版本,proto3.
// 导入TcaplusDB公共定义服务
import "tcaplusservice.optionv1.proto";
message game_players { // 定义TcaplusDB表,包含message类型
// 基于选择项tcaplusservice.tcaplus_primary_key创建主键字段
// TcaplusDB单个表最多能指定4个主键字段
option(tcaplusservice.tcaplus_primary_key) = "player_id, player_name, player_email";
// 基于选择项tcaplusservice.tcaplus_index创建主键索引
option(tcaplusservice.tcaplus_index) = "index_1(player_id, player_name)";
option(tcaplusservice.tcaplus_index) = "index_2(player_id, player_email)";
// TcaplusDB支持的数值类型:
// int32, int64, uint32, uint64, sint32, sint64, bool, fixed64, sfixed64, double, fixed32, sfixed32, float, string, bytes
// 嵌套类型: message
// 主键字段
int64 player_id = 1;
string player_name = 2;
string player_email = 3;
// 普通(非主键) 字段
int32 game_server_id = 4;
repeated string login_timestamp = 5;
repeated string logout_timestamp = 6;
bool is_online = 7;
payment pay = 8;
}
message payment {
int64 pay_id = 1;
uint64 amount = 2;
int64 method = 3;
}
TDR支持通用(generic
)表和列表(list
)表。 generic表是以表的形式表示元素属性的表,例如学生,雇主,游戏玩家。 list表是一系列记录,例如游戏排行榜,游戏中的邮件(通常是最近的100封邮件)。
推荐在一个XML文件中创建两种不同类型的表。
users_mails.xml
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<metalib name="tcaplus_tb" tagsetversion="1" version="1">
<!-- generic_table `users`, store the user' information -->
<!-- an user may has many roles -->
<struct name="users" version="1" primarykey="user_id,username,role_id" splittablekey="user_id" desc="user table">
<entry name="user_id" type="uint64" desc="user id"/>
<entry name="username" type="string" size="64" desc="login username"/>
<entry name="role_id" type="int32" desc="a user can have multiple roles"/>
<entry name="level" type="int32" defaultvalue="1" desc="role's level"/>
<entry name="role_name" type="string" size="1024" desc="role's name"/>
<entry name="last_login_time" type="string" size="64" defaultvalue="" desc="user login timestamp"/>
<entry name="last_logout_time" type="string" size="64" defaultvalue="" desc="user logout timestamp"/>
<index name="index1" column="user_id"/>
</struct>
<!-- list_table `mails`, store the role's mails -->
<struct name="mails" version="1" primarykey="user_id,role_id" desc="mail table">
<entry name="user_id" type="uint64" desc="user id"/>
<entry name="role_id" type="int32" desc="a user may has many roles"/>
<entry name="text" type="string" size="2048" desc="mail text"/>
<entry name="send_time" type="string" size="64" defaultvalue="" desc="timestamp of the mail sent"/>
<entry name="read_time" type="string" size="64" defaultvalue="" desc="timestamp of the mall read"/>
</struct>
</metalib>
<macro name="DB_MAX_USER_MSG_LEN" value="301" desc="Max length of the message that user can define"/>
<union name="DBPlayerMsg" version="1" desc="DB Player message">
<entry name="SysMsgID" type="uint8" desc="Message ID" />
<entry name="UsrMsg" type="string" size="DB_MAX_USER_MSG_LEN" desc="player created message" />
</union>
下载最新的TcaplusDB API 3.36程序包并解压缩该文件。 您应该在TcaplusDB应用程序的同一VPC中的CVM上执行所有操作。下载地址: TcaplusServiceApi3.36
# 解压TcaplusDB API包
tar -zxvf TcaplusServiceApi3.36.0.192960.x86_64_release_20200115.tar.gz
# 重命名TcaplusDB目录
mv TcaplusServiceApi3.36.0.192960.x86_64_release_20200115 TcaplusDBServiceApi3.0
# 找到TcaplusDB客户端
cd TcaplusDBServiceApi3.0/release/x86_64/bin
# 连接TcaplusDB应用
./tcaplus_client -a {APP ID} -z {ZONE ID} -s {TcaplusDB PASSWORD} -d {Tcapdir IP}:{Tcapdir PORT}
# 例子:
./tcaplus_client -a 21 -z 1 -s "Changeme12" -d 10.0.0.2:9999
上述TcaplusDB_client连接参数获取方式如下:
1) 打开表控制台,进入集群列表页面, 从页面获取Tcapdir IP(对应: Private Address/内网地址), Tcapdir PORT(对应:Private Port/内网端口),获取Zone ID (对应页面 : Table Group ID/表格组ID) 。
2) 点击上述截图的集群ID,进入应用详情页面, 获取 APP ID(对应: Access ID/接入ID), 以及TcaplusDB password(对应:Connection Password/连接密码)。 具体截图如下所示:
TcaplusDB提供了一种类似SQL的查询语言,使您能像使用关系数据库一样操作TcaplusDB表。
命令 | 含义 | |
---|---|---|
desc {table name} | 描述表字段 | |
count {table_name} | 返回表记录数目 | |
clean {table_name} | 清空(truncate)表, 此操作高度敏感,需要开白使用 | |
select | 查询表记录,示例: select * from BattleInfo where game_id = 100 and area_id=200 \G; \G标记符类似MySQL命令行格式化查询输出 | |
update | 更新表记录,若该记录不存在,则会插入该条记录,示例: update BattleInfo set player_number = 10 where game_id = 100 and area_id=200; | |
delete | 删除1条或多条记录,where语句需指定全部主键字段或索引字段。示例: delete from BattleInfo where game_id = 100 and area_id=200; | |
dump | 遍历表并将数据导出到文本文件,示例:dump * from BattleInfo into BattleInfo.csv; | |
load | 从文本文件导入数据到表,示例:load BattleInfo from BattleInfo.csv; |
注意: 使用tcaplus_client在操作PB类型(protobuf)的表时有一些限制,如下所示:
您可以通过运行help或help +命令获得更多的TcaplusDB语法。 请注意,上表中未列出的命令正在逐步淘汰或不建议使用。
编号 | 资源 | 上限 |
---|---|---|
1 | 单表格组允许表格数 | 256 |
2 | 分标键(shard键) | 1 |
3 | 单表的Shard数 | 10,000 |
4 | 单shard大小 | 256GB |
5 | 单表大小 | 2.56PB |
6 | generic表主键字段 | 4 |
7 | generic表非主键字段 | 128 |
8 | list表组件字段 | 3 |
9 | list表非主键字段 | 127 |
10 | list表中的记录数 | 1024 |
11 | 表索引 | 8 |
12 | 字段长度(亦称属性长度) | 32B |
13 | 主键字段长度 | 1KB |
14 | 非主键字段长度 | 256KB |
15 | 单记录大小 | 1MB |
16 | 单索引关联记录数 | 无限制 |
17 | 单表允许分布的表格组数 (同一个表允许分布在一个表格组也可以分布在多个表格组) | 8 |
18 | 批量查询返回记录数 | 1024 |
腾讯云提供了一个API在线使用的平台: API 3.0 Explorer。通过这个平台,用户可以方便在线测试对应产品的API接口调用逻辑。目前支持Java,Python, Node.js, PHP, Go和.Net等开发语言API ,只需在页面选择对应的API接口方法,填入对应方法参数后,定位到“在线调用”页面点击“发送请求”即可在线返回API的调用结果。API Explorer 支持两种方式API调用:一种是根据输入参数自动生成对应语言的调用代码,可以把这些代码放到自己的云环境机器中调用,方便更灵活的使用API; 另一种是根据输入参数自动生成Http调用代码,可直接在云环境机器用curl方式调用获取API返回结果。这里介绍下如何通过API Explorer来操作TcaplusDB及获取TcaplusDB表监控指标数据, 关于TcaplusDB表操作相关API请参考:TcaplusDB API, 关于监控数据获取API请参考: Monitor API。下面介绍下通过API Explorer 获取TcaplusDB表监控数据的例子。
调用代码生成如下:
调用返回结果如下:
TcaplusDB支持用户选择部分Table的明文字段实时导入Mysql等关系型数据库,使用SQL语句查询和分析。
实现原理如下图所示:
TcaplusDB支持通过数据导出工具直接导出数据到JSON文件, 同上面用tcaplus_client导出csv文件类似。
编号 | 旧术语 | 使用场景 | 新术语 | 使用场景 |
---|---|---|---|---|
1 | Application | 仅适用TcaplusDB Client | Cluster | TcaplusDB云控制台 |
2 | Deployment Unit (Zone) | 仅适用TcaplusDB Client | Table Group | TcaplusDB 云控制台 |
3 | Application ID | 仅适用TcaplusDB Client | Cluster ID | TcaplusDB云控制台 |
4 | Deployment Unit ID (Zone ID) | 仅适用TcaplusDB Client | Table Group ID | TcaplusDB 云控制台 |
5 | app_id | 仅适用TcaplusDB Client | access_id | SDK中关于CRUD操作部分 |
6 | app_pwd | 仅适用TcaplusDB Client | access_passwd | SDK中关于CRUD操作部分 |
7 | zone_id | 仅适用TcaplusDB Client | table_group_id | SDK中关于CRUD操作部分 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。