作者: 靳献旗 DBA 张帆 RD
1. 背景
“818全球汽车夜"是由汽车之家与湖南卫视联手打造的汽车行业顶级盛典,今年已经成功举办两届。本年度"818全球超级车展” 由 “网上车展”、“超级合伙人嘉年华”、“车模大赛”、“行业峰会” 等一些列精彩活动逐步拉开序幕,并在"818全球汽车夜"达到高峰,为8月的汽车行业带来了一场购车盛宴。
2. 业务场景
作为"818全球汽车夜"最重要的一个环节,"818晚会"台网互动项目包含了一元秒杀车、抽奖、摇红包等业务环节,参与用户数以百万,晚会期间系统并发峰值达数十万,活动发出奖品、红包等数百万,更因每轮秒杀、摇奖等活动时间短,流量集中,以及业务场景涉及到对账核销,对系统设计提出了很高的要求。
3. 为什么选择 TiDB
业务场景如此,数据持久层的选型在系统设计中显的更为重要,因此我们基于以下原因采用了 TiDB 两地三中心的方案作为底层存储。
- 跨城级高可用
两地三中心架构,即生产数据中心、同城灾备中心、异地灾备中心的高可用容灾方案。在这种模式下,两个城市的三个数据中心互联互通,如果一个数据中心发生故障或灾难,其他数据中心可以正常运行并对关键业务或全部业务实现接管。相比同城多中心方案,两地三中心具有跨城级高可用能力,可以应对城市级自然灾害。
- 实时 HTAP
提供行存储引擎 TiKV、列存储引擎 TiFlash 两款存储引擎,TiFlash 通过 Multi-Raft Learner 协议实时从 TiKV 复制数据,确保行存储引擎 TiKV 和列存储引擎 TiFlash 之间的数据强一致。TiKV、TiFlash 可按需部署在不同的机器,解决 HTAP 资源隔离的问题。利用 TiFlash 解决了实时大屏展示的问题。
- 一键水平扩容或者缩容
得益于 TiDB 存储计算分离的架构的设计,可按需对计算、存储分别进行在线扩容或者缩容,扩容或者缩容过程中对应用运维人员透明。
- 兼容 MySQL 5.7 协议和 MySQL 生态
兼容 MySQL 5.7 协议、MySQL 常用的功能、MySQL 生态,应用无需或者修改少量代码即可从 MySQL 迁移到 TiDB。提供丰富的数据迁移工具帮助应用便捷完成数据迁移。
- 良好口碑和经验
用户产品中心在汽车之家是最早使用 TiDB 的 BU,早期将核心业务论坛回复从 SQL SERVER 迁移到了 TiDB,将车主价格从 MySQL 迁移到了 TiDB。具备迁移,使用,优化经验,且积累了良好的口碑。
4. 集群架构
4.1 架构简介
两地三中心架构,即生产数据中心、同城灾备中心、异地灾备中心的高可用容灾方案。在这种模式下,两个城市的三个数据中心互联互通,如果一个数据中心发生故障或灾难,其他数据中心可以正常运行并对关键业务或全部业务实现接管。相比同城多中心方案,两地三中心具有跨城级高可用能力,可以应对城市级自然灾害。TiDB 分布式数据库通过 Raft 算法原生支持两地三中心架构的建设,并保证数据库集群数据的一致性和高可用性。而且因同城数据中心网络延迟相对较小,可以把业务流量同时派发到同城两个数据中心,并通过控制 Region Leader 和 PD Leader 分布实现同城数据中心共同负载业务流量的设计。
4.2 集群信息
818期间我们使用的国内一线云厂商高速云主机部署 TiDB 集群 ,云主机分布在云 C区、H区、G区,多 IDC 部署。TiDB 集群两地三中心架构相关组件如下,五副本
模块名称 | 版本信息 | 数量 |
---|---|---|
TiDB | v4.0.3 | 10 |
PD | v4.0.3 | 5 |
TiKV | v4.0.3 | 10 |
TiFlash | v4.0.3 | 2 |
TiCDC | v4.0.3 | 4 |
MySQL | 5.7.25 | 1 |
说明
- TiDB、PD、TiKV不再赘述,这里介绍一下 TiFlash 和 TiCDC
- TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展,在提供了良好的隔离性的同时,也兼顾了强一致性。列存副本通过 Raft Learner 协议异步复制。我们利用 TiFlash 解决统计分析类的 SQL,实时展示在大屏。
- TiCDC 是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具,具有将数据还原到与上游任意 TSO 一致状态的能力,同时提供开放数据协议 (TiCDC Open Protocol),支持其他系统订阅数据变更。使用 TiCDC 将 TiDB 集群数据实时同步至下游的 MySQL 数据库,作为故障应急的备份,实现业务容灾能力的提升。TiCDC 数据同步的延迟在秒级别,很好地满足了线上促销类业务的实时性要求。
- MySQL 作为 TiDB 集群的应急,降级之用,实现业务容灾能力的提升。
4.3 集群架构
TiDB+TiFlash+TiCDC 整体架构图如下图所示
5. 测试
台网互动项目前期我们根据自己的业务场景分别对 3.0.16、4.0.1、4.0.2、4.0.3 两地三中心方案做了充分测试,测试过程中遇到一个问题和 Bug,在 PingCAP 小伙伴的帮助下都及时的得到了解决。
5.1 测试工具
测试过程中我们使用了 Sysbench 和业务模拟程序,因为 Sysbench 不具备重连功能,对于一些测试场景无法满足。
工具名称 | 说明 |
---|---|
Sysbench | 性能测试和部分功能测试 |
业务模拟程序 | 模拟业务,功能测试和性能测试 |
5.2 测试内容
818晚会持续3个小时,因此我们根据实际业务场景制定了测试方案,主要测试项如下
测试分类 | 测试描述 |
---|---|
单节点故障 | 模拟一个 tidb-server 故障 |
单节点故障 | 模拟一个 pd follower 故障 |
单节点故障 | 模拟 pd leader 故障 |
单节点故障 | 模拟一个 tikv-server 故障 |
单节点故障 | 模拟两个 tikv-server 故障 |
IDC 故障 | 模拟IDC2所有服务器宕机,PD leader 在 IDC 1内 |
IDC 故障 | 模拟IDC2所有服务器宕机,PD leader 在 IDC 2内 |
IDC 故障 | 模拟IDC2网络隔离,PD leader 在 IDC 1内 |
IDC 故障 | 模拟IDC2网络隔离,PD leader 在 IDC 2内 |
性能测试 | oltp_read_write测试,五副本,乐观事务 |
性能测试 | oltp_read_write测试,五副本,悲观事务 |
性能测试 | oltp_read_write测试,三副本,乐观事务 |
性能测试 | oltp_read_write测试,三副本,乐观事务 |
5.3 测试结果
详细测试结果不再列出,主要测试结论如下:
无论是单节点故障,还是 IDC 级别的故障,都可以保证集群在30秒左右恢复,继续提供业务,满足业务需求。
5.4 测试总结
测试过程中遇到一些问题和 Bug,这里简单总结一下
- 现象:关闭 IDC2 模拟 IDC 故障时,再将五副本降为三副本,会导致集群几分钟不可用
原因:因为 IDC2 故障时,此时操作副本配置从 5 变成 3,这个时候如果 PD 还没感知到 IDC2故障,可能出现下发删除正常副本的命令,导致三个正常的副本会删掉两个,然后因为有两个副本down 了,所以导致region 不可用。
解决办法:当 IDC2 故障后,先通过 pd-ctl 将 IDC2 TiKV 实例设置为 offline,然后将 5 副本调整为 3 副本时候,PD 就知道不会误删除 online 的region,就不会出现读写请求因为 region is unavailable 导致不可用问题。
- 现象:设置调度参数 store-balance-rate 后,导致 pd 不断重启,导致集群不可用
原因:触发 bug 导致,新版本已取消此参数
- 现象:将三副本调整为五副本不生效
原因:开启enable-placement-rules后不兼容,目前五副本和此特性不兼容
- 现象:测试期间 TPS 在 15K 左右
原因:主要瓶颈在磁盘,优化磁盘挂载参数后,TPS 可以达到 60K
解决办法:优化磁盘挂载参数mount 参数改为 rw,noatime,nodiratime,nodelalloc,journal_checksum,journal_async_commit,nobarrier,commit=60,data=writeback,inode_readahead_blks=4096
请注意根据实际业务情况修改,是否可接受。
- 现象:建表时主键使用了 AUTO_RANDOM 特性,压测时集群依然存在热点,导致集群 TPS 很低,业务响应超时
原因:起初建表时表结构使用的是自增 ID 作为主键,虽然后来将自增主键改造为了 AUTO_RANDOM,但是数据还是老数据,ID 依然比较集中,导致 Update 主键产生热点。
解决办法:清空测试数据,重新生成新数据后,热点问题解决,业务超时消失。
- 现象:TiCDC 的 CheckPoint 不平稳,呈现跳跃式
原因:目前 TiCDC 的 CheckPoint 触发方式有两种,一种是达到一定时间进行 CheckPoint ,一种是达到设置的 max-txn-row 值进行 CheckPoint,而我们创建任务时设置的比较大,为 10000,导致了 CheckPoint 不平稳,呈现跳跃式
解决办法:创建 TiCDC 任务时,根据下游 MySQL 处理能力设置,这里设置为 2000 后,CheckPoint 相对比较平稳,TiCDC 的延迟也减小了
6. 818晚会期间表现
818晚会期间,TiDB 集群表现良好,为秒杀、摇奖、红包等场景提供全方位的数据保障。
- 通过使用 TiFlash 将面板实时统计 SQL 由 0.5s 提高到 0.01s
- TiCDC 向下游 MySQL 同步延迟平均在2秒左右
- TiDB 集群 SQL 99 响应时间在 20ms 以下,9000多个连接
7. 总结与展望
TiDB 两地三中心的方案具备很多优点:
- 五副本,多 IDC 部署,金融级高可用
- 实时 HTAP ,一站式解决 OLTP 和 OLAP 业务
- 一键水平扩容或者缩容
- TiCDC 高可用,低延迟,支持大规模集群
在测试 TiDB 两地三中心期间和使用过程中也发现一些小问题,相信这些问题官方在不久的将来都会得到解决,也希望TiDB越来越好。
- 同一类 SQL 在 TiFlash 上响应时间不稳定
业务压测期间,发现同一类 SQL 在 TiFlash 上会产生多个执行计划,导致响应时间不稳定
- TiCDC 对于单表的并发处理不足
业务压测期间,发现 TiCDC 对于单表的处理能力不足,导致单表延迟时间可能达到分钟级。这个问题是由于单表需要集中排序,所以如果单表吞吐非常大的分布式集群,这个问题很难彻底解决,研发也在尽量优化这个问题。
- TiCDC 任务分配不均衡
创建 TiCDC 任务时,如果是按照表级别创建的任务,可能会导致建的任务全部分配到同一个 Capture 上,尽管部署了多个 Capture。这个问题可以通过在一个 changefeed 下创建多个表来解决,同一个 changefeed 下的表可以自动均衡。
8. 感谢
818晚会的完美举行和台网项目重保的顺利实施,离不开李坤、李仲舒、赵一霖、杨非、韦万等 PingCAP 小伙伴在测试过程中的帮助和建议,及时的解决了测试过程中遇到的问题和 Bug,并亲临818全球超级车展指挥中心现场,为818全球汽车夜保驾护航。