多点 Dmall x TiDB:出海多云多活架构下的 TiDB 运维实战

news2025/1/24 22:46:18

作者:多点,唐万民

导读

时隔 2 年, 在 TiDB 社区成都地区组织者冯光普老师的协助下,TiDB 社区线下地区活动再次来到成都。来自多点 Dmall 的国内数据库负责人唐万民老师,在《出海多云架构,多点 TiDB 运维实战》的主题分享中,介绍了多点在出海业务场景部署和使用 TiDB 的经历。本文根据唐万民老师的演讲实录进行整理,你可以从中了解到多点从无到有,使用 TiDB 的业务场景,多云架构的实践经验,以及版本升级遇到问题的解决方案。

多点的 TiDB 之路

目前,多点在国内和出海都有使用 TiDB 的业务,线上生产环境中共有 46 套 TiDB 集群,300+节点,400TB+ 数据量。这些集群支撑着包含业财融合、TMS、结算、采销、物流、库存凭证、履约、存货核算等在内丰富的业务场景。底层的云资源也根据各地业务需求,选择了腾讯云、华为云、微软云、火山云等众多公有云。

多点大概有二十多个线上生产环境,上图是其中一个环境的部分 TiDB 集群,从中能看出业财一体化的数据库流量非常大,入网出网都是 500 MB/s 左右,QPS 17, 000 看着好像不高,但其实都是一些大的查询和操作。

多点目前部署的 TiDB 版本很多,从上图可以看出,从 5.1.1、5.1.2,一直到现在最新升级的 6.5.8 版本都有。其中,线上版本分布最多的是 6.1.5 版。那为什么多点会有如此多的 TiDB 版本,而不全部升级到 6.5.8?其实作为 DBA 而言,对待数据库一般情况下都是能不动就不动,一旦动了就有出问题的风险。而数据库的绝大多数问题、风险是由变更引起的。

但为什么我们又要做升级呢?一是因为业务推动,数据库当前这个版本可能已经满足不了业务需求,不得不升;二是高版本实在太香了,有一些新功能很想用,这个需求已经超过了升级带来的风险。一旦做出选择,我们就会对 TiDB 的新版本做一些调研,看看升级到哪个版本更好。这时候就不得不提到 TiDB 社区的氛围真的非常好,TiDB 的各个版本社区小伙伴都有在用,社区里会有很多人热心地回答我们的一些问题,也会有很多升级、部署的实践分享,我们在选择新版本时就会有更多的经验来参考。

多点与 TiDB 携手前行

作为 TiDB 的老朋友,多点和 TiDB 的缘分很早,从 2018 年起就接触了 TiDB,那时候还是 2.0.3 版本。当时我们想把 MySQL 的一些复杂查询拿到 TiDB 里做,但是测试发现 TiDB 2.0.3 版性能确实不是那么好,MySQL 解决不了的问题,TiDB 也解决不了。

直到 2020 年的 TiDB 4.0 版本开始,TiFlash 出现了,我们就又想尝试一下 TiDB。当时多点的业财业务非常复杂,数据量非常多,MySQL 已经承载不了这个数据。通过调研,我们最终选择将这部分数据迁移到 TiDB。2020 年 6 月开始,TiDB 上线测试环境;9 月,生产环境正式升级到 TiDB 4.0 GA 版本;10 月,生产环境又升级到 4.0.6 版本;2021 年 4 月,继续升级到 4.0.9 版本;2021 年 10 月,升级到 5.1.2 版本;2022 年,升级到 5.1.4;2023 年,升级到 6.1.5;直到最近,我们升级到 TiDB 的 6.5.8 版本。其实,多点每年都在升级新的版本,这里面当然也有一些线上的问题在推动着我们升级,后面会详细展开。

数据库类型选择

多点用 TiDB 到底在做什么?为什么要选择 TiDB?我会从四个场景展开分享多点将 TiDB 应用到哪些场景中。

第一个场景 是 持续增长类数据 。TiDB 在持续 增长类的场景中是非常适合使用的,一个是它只管写入,无限扩容,不像 MySQL,如果写多了就要做迁移,做分库分表,要去保证集群的高可用,迁移代价也非常高,要去做各种各样的沟通,还有很多迁移风险。TiDB 有一个平滑迁移的功能,并且存储成本降低了 70%。同时,TiDB 在存储数据时和 MySQL 不一样, MySQL 是没有经过压缩的, TiDB 会经过压缩算法将数据进行压缩。经过我们测试,TiDB 的一个单副本和 MySQL 的单副本比起来最大有接近 10 倍的差距。即便是日志类的数据, TiDB 是三副本, MySQL 是主从两份数据,TiDB 的数据存储成本也会降低很多。

第二个场景 是 数据冷热分离,历史数据归档 。我们在刚开始用 TiDB 时, DM 还没有现在的 DM cluster 那么成熟,所以我们自研 了 DRC-TiDB 同步工具,用这个工具去做从 MySQL 到 TiDB 的同步,将一些冷数据、历史归档数据放到 TiDB 里面。然后 MySQL 就保持高性能读写, TiDB 全量储存。

第三个场 景是 合库合表,**OLAP** 聚合查询 。MySQL 里的数据 分布在不同的库和不同的表里面,研发在查询时就会非常痛苦。做分库分表的都知道,在分库分表里去做查询、聚合都非常痛苦。研发其实很喜欢把很多的分库分表,很多的数据聚合在一起,TiDB 可以非常好地支持做这个事情,并且 TiFlash 是列存的数据,有全量数据,我们可以用 TiFlash 去加速一些统计的操作。

第四个场 景是 替换 ES 。在多点内部, ES 用的非 常多,但 ES 的成本非常高。如果涉及到大数据量存储的话,ES 需要很多机器,我们用 TiDB 做了一些 ES 的替换。实话实说,有一些查询场景,比如模糊查询, ES 其实比 TiDB 会更好一些。所以做 ES 替换的时候,我们也做了一些测试,如果迁到 TiDB 里查询性能没有 ES 好,我们就不会去替换。实际结果测下来,有大概 60% 的 ES 是可以替换的,整体成本也降低了很多。

多点的数据技术栈架构

上图是多点数据技术栈的整体架构。数据从 MySQL、仓储、销售、支付这些数据库,通过 DRC-TiDB,流转到 TiDB 集群里;财务引擎也可以直接把数据清洗转换过来,在 TiDB 里面去做读写;其他一些业务也会在 TiDB 里面去做读写。在这个流程的下游,我们会在 TiDB 里面直接去做一些分析,比如一些财务相关 API 、财务核算、全流程的跟踪系统、经营分析等。此外,我们还有一些大数据的需求,是通过 TiCDC 将数据流转到 Kafka,然后再到 Spark,再到大数据离线数仓。比如说有一些离线的报表需求,都是到 Hive 里面去做,整个流程较长。

出海业务 TiDB 部署的架构选择

之前,多点出海业务只部署在微软云上,但慢慢出现了一些问题:

  • 第一是多点的 RTA OS (多点的零售技术平台)部署在微软云新加坡 region 上,但经常出现基础设施不稳定的状况,比如云主机异常重启,网络异常,这些问题会导致多点的机器重启或者服务不可用、服务之间断联;
  • 第二是 IO 性能不符合预期。比如说有一些磁盘虽然支持 ADE 磁盘加密,但 IO 性能就不是很好。如果不支持,可能又无法满足我们在海外的一些安全要求;
  • 第三是微软云的成本较高。

基于这些原因,我们就从只部署微软云改为“微软云+华为云”双机房的部署模式,目标是当任意机房不可用时,TiDB 都可以自动恢复补救数据。我们通过微软云和华为云,在新加坡为 RTA 搭建同城双活架构,应用、中间件、数据库跨 2 个公有云部署,实现 3 个同城机房,任意一个机房不可用业务都可以快速恢复,提高 RTA OS 可用性。

上图是双机房部署方案的架构图,微软云有两个 zone,华为云有一个 zone,TiDB 的 PD 集群跨三个 zone 部署, TiCDC 在微软云和华为云各部署一个节点,TiDB 也在微软云和华为云各部署一套,各部署一些节点。这样做的话,需要在 TiKV 节点打上 dc 的 label,然后去把 region 分布在三个机房。TiDB 至少 2 个节点,跨 2 个机房部署,TiCDC 也是跨 2 个机房部署。我们也对 DRC-TiDB 同步链路恢复做了一些优化,做了一些 master standby 的结构,如果一个 DRC-TiDB 链路中, MySQL 到 TiDB 的链路挂了,另外一个能起到 standby 的作用。

这是我们在 TiKV 上打的一些 dc 的 label,里面的 zone、dc、rack、 host 其实大家都可以自己配置,这只是标识出你要把 region 分布在哪些机器、zone 上。不过,Placement rules 跟这个方法是不能一起使用的,有可能出现预期外的一些问题。

实施方面,我们将 PD 集群从微软云迁移 1 个节点到华为云,TiKV 节点打上 dc label,从微软云迁出部分节点到华为云,等它自动 rebalance 完,然后 TiDB 也从微软云迁出一个节点到华为云。整个过程其实是非常平滑的,如果我们用 MySQL 从一个云迁移到多个云的话,就会非常麻烦。或者将 MySQL 从一个云迁移到另外一个云,也非常麻烦。我们其实做过很多 MySQL 的迁移工作,比如前段时间把腾讯云上的 MySQL 整体迁移到火山云,其中一些环境的工作量非常大,而且风险也很大,但 TiDB 做这种迁移就非常平滑。

多云 TiDB 集群实践过程中的问题

我们在使用 TiDB 的时候也会遇到一些问题,并不是说 TiDB 就完美无缺了。但 TiDB 的社区非常开放活跃,不管遇到什么问题,你去 asktug 上一查,很多问题都有人遇到过了,从他们的分享中你可以直接获得帮助。

比如在 4.0.9 版本,我们遇到过 TiDB Server 的 OOM 问题。它的 expensive SQL hashagg to sreamagg 有一个问题,在内存里面去做一个哈希,TiDB server 耗费的内存非常高。我们当时改成 stream aggregation 走这个执行计划,内存消耗一下就降下来。在 TiDB 更新的版本里,这些问题都已经解决了。其实,在 TiDB 4.0.9 版本中,不论是 TiDB Server、TiKV 或是 TiFlash,内存控制都没现在的版本好。那为什么现在的版本就会好很多?这是因为大量的社区用户都反馈了使用 TiDB 时遇到的问题,经过官方优化,新版本自然就解决了。

4.0.9 还有一个 CDC 的问题。CDC 因为主要是涉及到一些大数据需求,或者需要流转到下游的需求才会用到。如果数据量小的话,应该不会遇到很多问题。当时,我们的 CDC 就是重启后 checkpoint 不推进,挂了以后起不来。这主要是因为当时 sort-engine 默认是 memory,如果机器内存不够,在重启后做排序的时候,它内存就不够了。后面的新版本有 unified sort DR,内存不够了就会先放到磁盘,然后再去做一些排序,做一些 check。

此外,我们的 dashboard 当时按非时间排序查询 slowlog ,导致了 TiDB OOM ,这是因为 plan decode 引起 insert SQL 较大。如果 insert SQL 不大这个问题是不会产生的。还有一些执行计划跑偏的问题,TiFlash 重启起不来的问题,当时我们都遇到过,后续的版本都已经解决了。其实,任何数据库,数据量很小的时候都会没问题,一旦上了量,问题就会变多。所以有我们这种数据量比较大的用户使用 TiDB,就会帮大家把这些雷都排了,大家再遇到这些问题就可以放心使用了。

升级也是大家都会关心的问题,升级后 TiDB 万一起不来怎么办?我们在 5.1.2 版本就遇到了这个问题。TiDB 升级的正常顺序应该是 TiFlash、PD、TiKV、 pump、tidb、drainer、cdc、prometheus、grafana、alertmanager 这样一个顺序。有一次,我们升级的时候 TiFlash 升级完马上就升级 CDC 组件,跳过了 PD、TiKV、 pump,最后升级失败了。当时 TiUP 1.5.1 版本组件可能存在问题,升级到更新的 TiUP 版本就解决了这个问题。

在 6.1.5 版本升级的时候,我们也遇到过问题。当时升级后发现 TiDB 起不来,经过仔细检查发现是因为我们升级前有一个大的 DDL 在跑,升级过程中这个 DDL 阻塞了升级数据字典的操作,数据字典一直没有升级成功,导致 TiDB 就起不来。

从上图可以看到,有一个 alter table mysql.stats_meta 去加字段的时候加不了,这是我们升级过程中遇到的异常。所以,我建议升级的时候一定要检查有没有大的 DDL。实际上,这个问题也是因为我们的数据量很大,DDL 执行的时间很长,当时没有等 DDL 跑完就重启了,如果数据量小的话应该就不会遇到这个问题。

综上所述,曾经遇到的问题都可以在 TiDB 的新版本得到解 决。 我给大家的建议是能用新版本就不要用旧版本 。很多问题在我们这些老用户用 的时候就已经遇到过,这些问题已经反馈给了社区,并陆续在新版本中都已经解决了。我相信,如果用 TiDB 的人越来越多,社区也像现在这样一直活跃的话,TiDB 就会越来越好!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【class9】人工智能初步(处理单张图片)

Class9的任务:处理单张图像 为了更高效地学习,我们将“处理单张图像”拆分成以下几步完成: 1. 读取图像文件 2. 调用通用物体识别 3. 提取图像分类信息 4. 对应分类文件夹还未创建时,创建文件夹 5. 移动图像到对应文件夹 0.获取…

Qt---TCP文件传输服务器

文件传输流程&#xff1a; 服务器端&#xff1a; serverwidget.ui serverwidget.h #ifndef SERVERWIDGET_H #define SERVERWIDGET_H#include <QWidget> #include<QTcpServer>//监听套接字 #include<QTcpSocket>//通信套接字 #include<QFile> #includ…

查看Linux系统是Ubuntu还是CentOS

要查看Linux系统是Ubuntu还是CentOS&#xff0c;可以通过多种方式进行确认&#xff1a; 查看/etc/os-release文件&#xff1a; 在终端中执行以下命令&#xff1a; cat /etc/os-release 如果输出中包含"IDubuntu"&#xff0c;则表示系统是Ubuntu&#xff1b;如果输出中…

构建智能电子商务系统:数字化引领未来商业发展

随着互联网技术的飞速发展和消费者行为的变革&#xff0c;电子商务系统的重要性日益凸显。在这一背景下&#xff0c;构建智能电子商务系统成为推动商业数字化转型的关键举措。本文将深入探讨智能电子商务系统的构建与优势&#xff0c;助力企业把握数字化转型的主动权。 ### 智…

【Linux】19. 习题②

2022-11-12_Linux环境变量 1. 分页存储(了解) 一个分页存储管理系统中&#xff0c;地址长度为 32 位&#xff0c;其中页号占 8 位&#xff0c;则页表长度是__。 A.2的8次方 B.2的16次方 C.2的24次方 D.2的32次方 【答案解析】A 页号即页表项的序号&#xff0c;总共占8个二进制…

数字化智能:Web3时代的物联网创新之路

引言 随着科技的不断发展&#xff0c;物联网&#xff08;IoT&#xff09;技术正在迅速普及和应用。而随着Web3时代的到来&#xff0c;物联网将迎来新的发展机遇和挑战。本文将探讨Web3时代的物联网创新之路&#xff0c;深入分析其核心技术、应用场景以及未来发展趋势。 Web3时…

C语言性能深度剖析:从底层优化到高级技巧及实战案例分析

C语言以其接近硬件的特性、卓越的性能和灵活性&#xff0c;在系统编程、嵌入式开发和高性能计算等领域中占据着举足轻重的地位。本文将深入探讨C语言性能优化的各个方面&#xff0c;包括底层原理、编译器优化、内存管理和高级编程技巧&#xff0c;并结合多个代码案例来具体分析…

2024042002-计算机网络 - 应用层

计算机网络 - 应用层 计算机网络 - 应用层 域名系统文件传送协议动态主机配置协议远程登录协议电子邮件协议 1. SMTP2. POP33. IMAP 常用端口Web 页面请求过程 1. DHCP 配置主机信息2. ARP 解析 MAC 地址3. DNS 解析域名4. HTTP 请求页面 域名系统 DNS 是一个分布式数据库&…

ApiHug - 闭门造车, 出门合辙

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

Python函数之旅专栏(导航)

Python内置函数(参考版本:3.11.8)AELRabs( )enumerate( )len( )range( )aiter( )eval( )list( )repr( )all( )exec( )locals( )reversed( )anext( )round( )any( ) ascii( )FM  filter( )map( )S float( )max( )set( )Bformat( )memoryview( )setattr( )bin( )frozenset( )…

TensorFlow的学习

0.基础概念 术语表&#xff1a; https://developers.google.cn/machine-learning/glossary?hlzh-cn#logits 1.快速入门 https://tensorflow.google.cn/tutorials/quickstart/beginner?hlzh-cn 2.基于Keras进行图像分类 https://tensorflow.google.cn/tutorials/keras/cl…

SMB攻击利用之-mimikatz上传/下载流量数据包逆向分析

SMB协议作为windows环境下最为常见的一种协议,在历史上出现过无数的通过SMB协议进行网络攻击利用的案例,包括针对SMB协议本身以及通过SMB协议实施网络攻击。 本文将介绍一种通过SMB协议的常见利用方式,即向远程主机传输mimikatz,作为我的专栏《SMB攻击流量数据包分析》中的…

【Python】图像批量合成视频,并以文件夹名称命名合成的视频

一个文件夹中有多个子文件夹&#xff0c;子文件夹中有多张图像。如何把批量把子文件夹中的图像合成视频&#xff0c;视频名称是子文件夹的名称&#xff0c;生成的视频保存到指定文件夹&#xff0c;效果记录。 代码 import os import cv2def create_video_from_images(image_f…

Mamba:7 VENI VIDI VICI

若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。 序列模型的效率与有效性之间的权衡取决于状态编…

[Java基础揉碎]多线程基础

多线程基础 什么是程序, 进程 什么是线程 什么是单线程,多线程 并发, 并行的概念 单核cpu来回切换, 造成貌似同时执行多个任务, 就是并发; 在我们的电脑中可能同时存在并发和并行; 怎么查看自己电脑的cpu有几核 1.资源监视器查看 2.此电脑图标右键管理- 设备管理器- 处理器…

安防监控视频平台智能边缘分析一体机视频存储系统客流统计检测算法

智能边缘分析一体机的客流统计检测算法是一种基于人工智能与边缘计算技术的解决方案&#xff0c;专门设计用来实时、准确地统计通过特定区域的人流量。这项技术广泛应用于零售、交通、场馆管理、智慧城市等领域&#xff0c;以帮助管理者更好地理解顾客行为、优化资源配置、提升…

百度百舸 AIAK-LLM 的大模型训练和推理加速实践

本文整理自 4 月 16 日的 2024 百度 Create 大会的公开课分享《百舸 AIAK-LLM&#xff1a;大模型训练和推理加速实践》。 今天要分享的主题是 AI Infra 相关的内容&#xff0c;主要内容分为四部分。 首先和大家一起讨论大模型给基础设施带来的挑战。第二部分则是向大家介绍一个…

深度优先搜索汇总

常用英文 最近公共祖先&#xff08;Lowest Common Ancestor&#xff0c;简称LCA&#xff09; posterity&#xff0c;英语单词&#xff0c;主要用作名词&#xff0c;作名词时译为“子孙&#xff0c;后裔&#xff1b;后代”。 什么是深度优先搜索 深度优先搜索&#xff0c;D…

linux安装python3.8

一、卸载损坏的yum并安装 本来想直接下载安装python3.8,结果过程中损坏了yum,导致yum无法使用。 参考了【故障】6、yum不可用_yum命令无法使用-CSDN博客 1、删除python #删除现有的python rpm -qa|grep python|sudo xargs rpm -ev --allmatches --nodeps #强制删除已安装程…

tomcat--应用部署

tomcat根目录结构 Tomcat中默认网站根目录是/usr/local/apache-tomcat-8.5.100/webapps/在Tomcat的webapps目录中&#xff0c;有个非常特殊的目录ROOT&#xff0c;它就是网站默认根目录。将eshop解压后的文件放到这个/usr/local/apache-tomcat-8.5.100/webapps/ROOT中。bbs解压…