TcaplusDB表数据缓写
表数据缓写服务是指Tcaplus的增量数据可以缓写到第三方系统(目前支持MySQL和Kafka),用作产品数据查询与分析。其原理为Tcapsvr将(从启用缓写开始的)增量写入数据(基于Tcaplus Binlog)同步到Tcapdb,Tcapdb再写入/更改到MySQL或者Kafka中。所以该功能必须保证Tcapdb机器有访问MySQL或者Kafka的权限,如果是MySQL,还要有MySQL的建表权限,否则改功能无法配置成功。MySQL 、Kafka两种缓写的区别及适用Case:
- 同一张表MySQL和Kafka只能配置一种。MySQL或者Kafka地址都需要业务提供,并确保Tcaplus有相关访问权限。
- MySQL缓写适用于业务想要获取指定表(可以是全部字段,也可以是部分字段)相对实时数据,配置缓写时间窗口N,Tcaplus将最近N秒内的写请求做合并,相同记录保留最后一次更新的数据发给Tcapdb->MySQL。时间窗口N,对于MySQL默认30s,也可以给的更大或者更小,看业务对实时性的要求。给0也可以,给0就不会做合并了,这样不利于性能优化。
- Kafka缓写适用于业务想要订阅指定表(可以是全部字段,也可以是部分字段)的变更动作,Tcaplus将变更前后的数据发给Tcapdb->Kafka。时间窗口N,对于Kafka默认0s。
- 使用MySQL缓写的业务基本都能接受分钟级别的延迟,所以MySQL缓写默认是在Slave上做的,对于在线服务的影响小,但配置Mysql缓写时可以设置"缓写周期"为0,表示不希望延迟。选使用Kafka缓写的业务一般对实时性要求比较高,Kafka缓写默认是在Master上做的,会消耗一些Master的处理能力 。
特别说明:
- Tcaplus缓写功能只会同步缓写启用之后的增量数据及修改到第三方系统,缓写没有启用之前的数据是没有同步过去的,这部分数据如果也希望同步的话需要DBA拉取冷备,将Tcaplus引擎文件dump出来导入进第三方系统,再开启缓写。
- 目前,整个缓写流程的性能瓶颈在于Tcapsvr同步线程的CPU,Tcapsvr侧单机缓写QPS最大可达到8w/s。Tcapdb侧的能力可以水平扩展不是瓶颈。
配置方法:
进入表管理页面,找到相应的表,右边有"编辑"->"缓写"的入口。
缓写页面如下,选择MySQL或者Kafka类型(MySQL、GCS都是MySQL,其中GCS是腾讯的分布式MySQL集群,SO插件目前不再使用不做描述):
其中:
缓写周期:即上面讲到的“缓写时间窗口N”,代表数据用户可以接受的数据从Tcapdb同步到第三方系统的延迟,这个值越大,代表用户对时延越不敏感。Tcapdb侧会对缓写周期时间窗口内的请求做去重(例如,30s内对同一个key的记录有多次Replace操作,去重后只需要将最后一次Replace后的内容同步给第三方系统,前两次的都不用同步过去了,可以省去前两次的请求),从而降低整体同步的QPS提升性能。
key字段映射:Tcaplus表key字段到MySQL表或者Kafka的key字段的映射,无特别要求的话两个系统的表字段最好保持一致,利于定位问题。不支持二进制类型的key字段(即tdr中的数组、二级字段,pb中的 bytes 、repeated等类型)缓写。对于MySQL缓写,key字段必须全部选中。对于Kafka缓写,可以只选择部分key字段,配置上生效后还能再动态调整变更,选择部分字段的话Tcaplus只会将包含这些字段的变更同步给Kafka,建议key字段全选。
value字段映射:Tcaplus表value字段到MySQL表或者Kafka的value字段的映射,无特别要求的话两个系统的表字段最好保持一致,利于定位问题。value字段如果是二进制类型,会以binary同步到MySQL或者Kafka,需要用户自己反序列化解析。对于MySQL缓写和Kafka缓写,value字段可以选择全部字段,也可以选择部分字段,选择部分字段的话Tcaplus只会将包含这些字段的变更同步给MySQL或者Kafka。配置上生效后还能再动态调整变更。
Tcaplus发给Kafka的消息类型如下:
INSERT: { "timestamp":"xxxx",//更新tcaplus记录的时间 "type": "insert", "appid": "app1", "zoneid": "zone1", "table": "test_table", "keyfields":"k1,k2,k3", "NewRecord":{"k1":"key1","k2":"key2","k3":"key3", "v2":"Tom","v4":"10"} } DELETE: { "timestamp":"xxxx",//更新tcaplus记录的时间 "type": "delete", "appid": "app1", "zoneid": "zone1", "table": "test_table", "keyfields":"k1,k2,k3", "OldRecord":{"k1":"key1","k2":"key2","k3":"key3", "v2":"Tom","v4":"5"} } UPDATE: { "timestamp":"xxxx",//更新tcaplus记录的时间 "type": "update", "appid": "app1", "zoneid": "zone1", "table": "test_table", "keyfields":"k1,k2,k3", "OldRecord":{"k1":"key1","k2":"key2","k3":"key3", "v2":"Tom","v4":"5"} "NewRecord":{"k1":"key1","k2":"key2","k3":"key3", "v2":"Tom","v4":"10"} }