TiDB 在小米的应用实践

作者:张良,小米 DBA 负责人;潘友飞,小米 DBA;王必文,小米开发工程师。

一、应用场景介绍

MIUI 是小米公司旗下基于 Android 系统深度优化、定制、开发的第三方手机操作系统,也是小米的第一个产品。MIUI 在 Android 系统基础上,针对中国用户进行了深度定制,在此之上孕育出了一系列的应用,比如主题商店、小米音乐、应用商店、小米阅读等。

图 1  MIUI Android 系统界面图

<center>图 1  MIUI Android 系统界面图</center>

目前 TiDB 主要应用在:

  • 小米手机桌面负一屏的快递业务
  • 商业广告交易平台素材抽审平台

这两个业务场景每天读写量均达到上亿级,上线之后,整个服务稳定运行;接下来我们计划逐步上线更多的业务场景,小米阅读目前正在积极的针对订单系统做迁移测试。

二、TiDB 特点

TiDB 结合了传统的 RDBMS 和 NoSQL 的最佳特性,兼容 MySQL 协议,支持无限的水平扩展,具备强一致性和高可用性。

具有如下的特性:

  • 高度兼容 MySQL,大多数情况下无需修改代码即可从 MySQL 轻松迁移至 TiDB,即使已经分库分表的 MySQL 集群亦可通过 TiDB 提供的迁移工具进行实时迁移。
  • 水平弹性扩展,通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景。
  • 分布式事务,TiDB 100% 支持标准的 ACID 事务。
  • 真正金融级高可用,相比于传统主从(M-S)复制方案,基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可以实现故障的自动恢复(auto-failover),无需人工介入。

TiDB 的架构及原理在 官网 里有详细介绍,这里不再赘述。

图 2  TiDB 基础架构图

<center>图 2  TiDB 基础架构图</center>

三、背景

跟绝大数互联网公司一样,小米关系型存储数据库首选 MySQL,单机 2.6T 磁盘。由于小米手机销量的快速上升和 MIUI 负一屏用户量的快速增加,导致负一屏快递业务数据的数据量增长非常快,每天的读写量级均分别达到上亿级别,数据快速增长导致单机出现瓶颈,比如性能明显下降、可用存储空间不断降低、大表 DDL 无法执行等,不得不面临数据库扩展的问题。比如,我们有一个业务场景(智能终端),需要定时从几千万级的智能终端高频的向数据库写入各种监控及采集数据,MySQL 基于 Binlog 的单线程复制模式,很容易造成从库延迟,并且堆积越来越严重。

对于 MySQL 来讲,最直接的方案就是采用分库分表的水平扩展方式,综合来看并不是最优的方案,比如对于业务来讲,对业务代码的侵入性较大;对于 DBA 来讲提升管理成本,后续需要不断的拆分扩容,即使有中间件也有一定的局限性。同样是上面的智能终端业务场景,从业务需求看,需要从多个业务维度进行查询,并且业务维度可能随时进行扩展,分表的方案基本不能满足业务的需求。

了解到 TiDB 特点之后,DBA 与业务开发沟通确认当前 MySQL 的使用方式,并与 TiDB 的兼容性做了详细对比,经过业务压测之后,根据压测的结果,决定尝试将数据存储从 MySQL 迁移到 TiDB。经过几个月的线上考验,TiDB 的表现达到预期。

四、兼容性对比

TiDB 支持包括跨行事务、JOIN、子查询在内的绝大多数 MySQL 的语法,可以直接使用 MySQL 客户端连接;对于已用 MySQL 的业务来讲,基本可以无缝切换到 TiDB。

二者简单对比如下几方面:

  • 功能支持

    • TiDB 尚不支持如下几项:

      • 增加、删除主键
      • 非 UTF8 字符集
      • 视图(即将支持)、存储过程、触发器、部分内置函数
      • Event
      • 全文索引、空间索引
  • 默认设置

    • 字符集、排序规则、sql_mode、lower_case_table_names 几项默认值不同。
  • 事务

    • TiDB 使用乐观事务模型,提交后注意检查返回值。
    • TiDB 限制单个事务大小,保持事务尽可能的小。
  • TiDB 支持绝大多数的 Online DDL。
  • 另,一些 MySQL 语法在 TiDB 中可以解析通过,不会产生任何作用,例如: create table 语句中 engine、partition 选项都是在解析后忽略。
  • 详细信息可以访问官网:https://pingcap.com/docs-cn/sql/mysql-compatibility/ 。

五、压测

5.1 目的

通过压测 TiDB 了解一下其 OLTP 性能,看是否满足业务要求。

5.2 机器配置

组件实例数量CPU 型号内存磁盘版本操作系统
TiDB3Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz128GSSD Raid 52.0.3CentOS Linux release 7.3.1611
PD3Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz128GSSD Raid 52.0.3CentOS Linux release 7.3.1611
TiKV4Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz128GSSD Raid 52.0.3CentOS Linux release 7.3.1611

5.3 压测内容以及结果

5.3.1 标准 Select 压测

ThreadsQPSLatency (avg / .95 / max)
812650.810.63 / 0.90 / 15.62
1621956.210.73 / 1.50 / 15.71
3231534.81.01 / 2.61 / 25.16
64382171.67 / 5.37 / 49.80
12839943.053.20 / 8.43 / 58.60
25640920.646.25 / 13.70 / 95.13

图 3  标准 Select 压测图

<center>图 3  标准 Select 压测图</center>

5.3.2 标准 OLTP 压测

ThreadsTPSQPSLatency (avg / .95 / max)
8428.98578.0918.65 / 21.89 / 116.06
16731.6714633.3521.86 / 25.28 / 120.59
321006.4320128.5931.79 / 38.25 / 334.92
641155.4423108.955.38 / 71.83 / 367.53
1281121.5522431114.12 / 161.51 / 459.03
256941.2618825.1271.94 / 369.77 / 572.88

更正-oltp压测

<center>图 4  标准 OLTP  压测图</center>

5.3.3 标准 Insert 压测

ThreadsQPSLatency (avg / .95 / max)
83625.752.20 / 2.71 / 337.94
166527.242.45 / 3.55 / 160.84
3210307.663.10 / 4.91 / 332.41
6413662.834.68 / 7.84 / 467.56
12815100.448.47 / 16.41 / 278.23
25617286.8614.81 / 25.74 / 3146.52

图 5  标准 Insert 压测图

<center>图 5  标准 Insert 压测图</center>

通过压测发现 TiDB 稳定性上与预期稍有差别,不过压测的 Load 会明显高于生产中的业务 Load,参考低 Threads 时 TiDB 的表现,基本可以满足业务对 DB 的性能要求,决定灰度一部分 MySQL 从库读流量体验一下实际效果。

六、迁移过程

整个迁移分为 2 大块:数据迁移、流量迁移。

6.1 数据迁移

数据迁移分为增量数据、存量数据两部分。

  • 对于存量数据,可以使用逻辑备份、导入的方式,除了传统的逻辑导入外,官方还提供一款物理导入的工具 TiDB Lightning。
  • 对于增量备份可以使用 TiDB 提供的 Syncer (新版已经更名为 DM - Data Migration)来保证数据同步。

Syncer 结构如图 6,主要依靠各种 Rule 来实现不同的过滤、合并效果,一个同步源对应一个 Syncer 进程,同步 Sharding 数据时则要多个 Syncer 进程。

图 6  Syncer 结构图

<center>图 6  Syncer 结构图</center>

使用 Syncer 需要注意:

  • 做好同步前检查,包含 server-id、log_bin、binlog_format 是否为 ROW、binlog_row_image 是否为 FULL、同步相关用户权限、Binlog 信息等。
  • 使用严格数据检查模式,数据不合法则会停止。数据迁移之前最好针对数据、表结构做检查。
  • 做好监控,TiDB 提供现成的监控方案。
  • 对于已经分片的表同步到同一个 TiDB 集群,要做好预先检查。确认同步场景是否可以用 route-rules 表达,检查分表的唯一键、主键在数据合并后是否冲突等。

6.2 流量迁移

流量切换到 TiDB 分为两部分:读、写流量迁移。每次切换保证灰度过程,观察周期为 1~2 周,做好回滚措施。

  • 读流量切换到 TiDB,这个过程中回滚比较简单,灰度无问题,则全量切换。
  • 再将写入切换到 TiDB,需要考虑好数据回滚方案或者采用双写的方式(需要断掉 Syncer)。

七、集群状况

7.1 配置

集群配置采用官方推荐的 7 节点配置,3 个 TiDB 节点,3 个 PD 节点,4 个 TiKV 节点,其中每个 TiDB 与 PD 为一组,共用一台物理机。后续随着业务增长或者新业务接入,再按需添加 TiKV 节点。

7.2 监控

监控采用了 TiDB 的提供的监控方案,并且也接入了公司开源的 Falcon,目前整个集群运行比较稳定,监控如图 7。      

图 7  监控图

<center>图 7  监控图</center>

八、遇到的问题、原因及解决办法

问题原因及解决办法
在一个 DDL 里不能对多个列或者多个索引做操作。ADD/DROP INDEX/COLUMN 操作目前不支持同时创建或删除多个索引或列,需要拆分单独执行,官方表示 3.0 版本有计划改进。
部分操作符查询优化器支持不够好,比如 or 操作符会使用 TableScan,改写成 union all 可避免。官方表示目前使用 or 操作符确实在执行计划上有可能不准确,已经在改进计划中,后续 3.0 版本会有优化。
重启一个 PD 节点的时候,业务能捕捉到 PD 不可用的异常,会报 PD server timeout 。因为重启的是 Leader 节点,所以重启之前需要手动切换 Leader,然后进行重启。官方建议这里可以通过重启前做 Leader 迁移来减缓,另外后续 TiDB 也会对网络通讯相关参数进行梳理和优化。
建表语句执行速度相比 MySQL 较慢多台 TiDB 的时候,Owner 和接收 create table 语句的 TiDB Server 不在一台 Server 上时,可能比 MySQL 慢一些,每次操作耗时在 0.5s 左右,官方表示会在后续的版本中不断完善。
pd-ctl 命令行参数解析严格,多一个空格会提示语法错误。官方表示低版本中可能会有这个问题,在 2.0.8 及以上版本已经改进。
tikv-ctl 命令手动 compact region 失败。在低版本中通常是因为 tikv-ctl 与集群版本不一致导致的,需要更换版本一致的 tikv-ctl,官方表示在 2.1 中已经修复。
大表建索引时对业务有影响官方建议在业务低峰期操作,在 2.1 版本中已经增加了操作优先级以及并发读的控制,情况有改善。
存储空间放大问题该问题属于 RocksDB,RocksDB 的空间放大系数最理想的值为 1.111,官方建议在某些场景下通过 TiKV 开启 RocksDB 的 dynamic-level-bytes 以减少空间放大。

九、后续和展望

目前 TiDB 在小米主要提供 OLTP 服务,小米手机负一屏快递业务为使用 TiDB 做了一个良好的开端,而后商业广告也有接入,2 个业务均已上线数月,TiDB 的稳定性经受住了考验,带来了很棒的体验,对于后续大体的规划如下:

  • MIUI 生态业务中存在大量的类似场景的业务,后续将会与业务开发积极沟通,从 MySQL 迁移到 TiDB。
  • 针对某些业务场景,以资源合理利用为目标,推出归档集群,利用 Syncer 实现数据归档的功能。
  • 数据分析,结合 TiDB 提供的工具,将支持离线、实时数据分析支持。
  • 将 TiDB 的监控融合到小米公司开源的监控系统 Falcon 中。

十、致谢

非常感谢 TiDB 官方在迁移及业务上线期间给予我们的支持,为每一个 TiDB 人专业的精神、及时负责的响应点赞。

更多 TiDB 用户实践: https://www.pingcap.com/cases-cn/

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

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

相关文章

java图片识别查看器模拟_[转载]windows照片查看器无法显示图片内存不足

问题描述最近在使用Windows照片查看器打开一个jpg文件的时候异常Windows照片查看器无法显示此图片&#xff0c;因为计算机上的可用内存可能不足。请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满)&#xff0c;然后重试问题分析这时我们按F11或者图片下方中…

智能云改-docker云迁移实战

本次安装的linux版本是centos7.4&#xff0c;docker安装不依赖任何环境&#xff0c;但是必须要连接网络&#xff0c;满足这一点就可以进行docker安装了。 一、安装&#xff1a; 1.删除就版本的docker输入命令&#xff1a;yum -y remove docker \docker-common \docker-selinux …

python词频统计代码_python统计词频

一、程序分析 &#xff08;1&#xff09;将文件读入缓冲区&#xff08;dst指文本文件存放路径&#xff0c;设置成形参&#xff0c;也可以不设&#xff0c;具体到函数里设置&#xff09; def process_file(dst): # 读文件到缓冲区try: # 打开文件 txtopen(dst,"r") ex…

Oracle的resouce、unlimited tablespace 及如何把数据导入不同的表空间

resouce是角色&#xff0c;unlimited tablespace是权限。 很多人在进行数据迁移时&#xff0c;希望把数据导入不同于原系统的表空间&#xff0c;在导入之后却往往发现&#xff0c;数据被导入了原表空间。本例举例说明解决这个问题:1.如果缺省的用户具有DBA权限那么导入时会按照…

.net开发是做什么的_软件开发是什么, 该怎么做?

软件开发是什么, 该怎么做&#xff1f;1 引子关于什么是软件开发存在很多观点&#xff0c;有的认为软件开发即服务&#xff0c;有的认为软件开发即产品&#xff0c;有的认为软件开发即平台&#xff0c;这些观点各有各的侧重点。这篇文章我们来学习和探讨一下软件开发。2 软件…

使用HTML5、CSS3和jQuery增强网站用户体验

记得几年前如果你需要添加一些互动元素到你的网站中用来改善用户体验&#xff1f;是不是立刻就想到了flash实现&#xff1f;这彷佛年代久远的事了。使用现在最流行的Web技术HTML5&#xff0c;CSS3和jQuery&#xff0c;同样也可以实现类似的用户体验。而且使用这些特性将会比使用…

python中loop函数_python + Django 的forloop功能试验讲解

一、forloop功能详解记录 遇到一个问题困扰了我好久&#xff0c;结果还是知识盲区造成的。下边记录一下。 通过return forloop可以返回前端循环中的索引值 二、forloop大概功能 forloop是Django模板中一个功能&#xff0c;主要是可以计算循环的对象的索引值&#xff08;大白话大…

[导入]源代码版本控制(二)

在VS6.0时代&#xff0c;VSS的版本是6.0&#xff0c;现在VS的版本都到2008了&#xff0c;VSS的版本目前是2005&#xff0c;这回以2005为例。安装就免了。数据库的创建&#xff1a;如果要在局域网内共享这个数据库&#xff0c;那还需要将刚才存放数据库的目录共享出去。为数据库…

苏宁的Node.js实践:不低于Java的渲染性能、安全稳定迭代快

前端 Node.js 的使用场景大多集中在前端工具上&#xff0c;当前的前端主要把它定位为辅助。苏宁易购使用 Node.js 作为前后端分离的主要手段&#xff0c;经历了从技术引进到全面开花&#xff0c;从边缘功能到核心业务&#xff0c;从纷乱到稳定的过程。同时 Node.js 作为新引入的…

MVP群聊某美国公司的应聘试题(压死九个还是一个)

某美国公司的应聘试题&#xff08;压死九个还是一个&#xff09;&#xff0c;测试你的管理方式有二条铁轨&#xff0c;一条新的&#xff0c;一条旧的。有了新铁轨后&#xff0c;旧铁轨不再有火车通过。有一天有十个小孩到铁轨上玩耍&#xff0c;九个小孩在新铁轨上玩&#xff0…

html与cgi脚本的配合使用

利用boa服务器测试arm开发板上的cgi和html联合编程的小例程。很简单&#xff0c;但是当时觉得很有意思。在这里给大家展示一下&#xff0c;高手飘过。 在ubuntu下安装boa测试环境&#xff0c;即先在本地搭建一个boa的网页服务器。apt-get install boa。稍作配置即可。我的Boa按…

zabbix3监控ESXI主机

ESXI主机VMware公司企业级虚拟化的解决方案Vsphere的重要组件&#xff0c;也是虚拟机的宿主机&#xff0c;对其监控有着重要的意义&#xff0c;下边介绍二种方发对其监控。 方法一&#xff1a;通过修改服务端的控制项来进行监控。 虚拟机监控分两个步骤完成。首先&#xff0c;Z…

mybatis jar包_springboot2整合mybatis-plus3踩到的坑

前言最近在进行项目重构&#xff0c;在架构师的建议下&#xff0c;就把项目中mybatis切换成mybatis-plus。因为mybatis-plus在mybatis的基础上只做增强不做改变&#xff0c;因此切换的成本很低&#xff0c;就只需改jar和配置内容&#xff0c;原先的代码无需改动。因为mybatis-p…

共享几套silverlight2 toolkit最新的皮肤控件样式下载

下载了最新的silverlight2 toolkit看看&#xff0c;发现里面的控件样式还是多漂亮的&#xff0c;与大家分享下。 blue dark light orange purple red 样式源码下载&#xff1a;点击下载 当然&#xff0c;我最喜欢的还是orange哦。 转载于:https://www.cnblogs.com/liaohenchen/…

开会=浪费时间?阿里技术团队这样开项目复盘会

2019独角兽企业重金招聘Python工程师标准>>> 阿里妹导读&#xff1a;复盘是项目结束后必不可少的阶段&#xff0c;好的复盘会议能够有效地促进团队成长。今天&#xff0c;阿里项目管理专家鹿迦以自身的经验&#xff0c;为大家分享如何做好一个项目的复盘。这篇文章分…

Extjs中使用FusionChart举例

一 前言&#xff1a; 在项目实施中&#xff0c;设计统计部分经常会使用图表进行显示&#xff0c;在Extjs3中内置了图表控件&#xff0c;但实际表现无法达到3D的美观效果&#xff0c;通过查找FusionChart可以实现比较美观的3D或2D图表显示。注&#xff1a;FusionChart是个商业…

drawitem设置指定行的背景颜色_Java 为 Excel 中的行设置交替背景色

点击上方 好好学java &#xff0c;选择 星标 公众号重磅资讯、干货&#xff0c;第一时间送达今日推荐&#xff1a;牛人 20000 字的 Spring Cloud 总结&#xff0c;太硬核了~作者&#xff1a;Jazzz链接&#xff1a;https://www.cnblogs.com/jazz-z/p/12665819.html在制作Excel表…

常见的关系型数据库和非关系型数据及其区别

一、关系型数据库 关系型数据库最典型的数据结构是表&#xff0c;由二维表及其之间的联系所组成的一个数据组织 优点&#xff1a;1、易于维护&#xff1a;都是使用表结构&#xff0c;格式一致&#xff1b;2、使用方便&#xff1a;SQL语言通用&#xff0c;可用于复杂查询&#x…

无法检查指定的位置是否位于cfs上_(干货分享)一文搞明白 节气门位置传感器的作用、故障类型与症状、诊断方法...

1 位置节气门位置传感器(ThrottlePositionSensor&#xff0c;TPS)&#xff0c;位于节气门体上&#xff0c;其安装形式因节气门结构的不同而有所差异&#xff1a;对于传统的机械拉索式节气门&#xff0c;节气门位置传感器通常以一个独立元件的形式安装在节气门体的侧面&#xf…

Asp.net(C#)-显示所有缓存 清除所有缓存

//清除所有缓存protectedvoidRemoveAllCache() { System.Web.Caching.Cache _cache HttpRuntime.Cache; IDictionaryEnumerator CacheEnum _cache.GetEnumerator(); ArrayList al new ArrayList(); while (CacheEnum.MoveNext()) { …