写点什么

DRDS 与 TiDB 浅析

  • 2019-11-04
  • 本文字数:2842 字

    阅读完需:约 9 分钟

DRDS 与TiDB浅析

在谈论数据库架构和数据库优化的时候,会常听到“分库分表”、“分片”、“Sharding”…等关键词。值的高兴的是,这部分公司的业务量应该正在实现(或者即将面临)高速增长,或技术方面也面临着一些挑战。但让人担忧的部分是,他们的系统“分库分表”真的有选择正确吗?


随着业务规模的不断扩大,用户需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。关于数据库的扩展主要包括:业务拆分、主从复制、数据库分库与分表等,本篇文章的灵感就来源自作者与朋友关于数据库分库分表问题的讨论。


DRDS vs TiDB

起源

DRDS


  • 数据库中间件 Cobar、MyCat、Amoeba


Tidb


  • Google Spanner/F1

架构

DRDS 架构



TiDB 架构


分片机制

DRDS


  • 支持 HASH、RANGE_HASH、MMDD 等多种分片类型

  • 原理上都是基于 HASH 分片

  • 需要在建表时指点分片 Key 以及分片方式

  • 不支持全局唯一索引


TiDb


  • 通过 multi-raft 协议,将数据 Region(按范围分区)分布于不同节点,分片不需要应用干预

  • 由于按照范围对数据进行分片,在某些范围数据被集中访问时易造成热点问题,业务上可以通过对主键进行散列编码打散数据或者热点数据通过 cache 方式解决该问题

应用限制

DRDS


  • Sharding 后对应用和 SQL 的侵入都很大,需要 SQL 足够简单,这种简单的应用导致 DB 弱化为存储。

  • SQL 不能跨维度 join、聚合、子查询等。

  • 每个分片只能实现 Local index,不能实现诸如唯一键、外键等全局约束。


TiDB


  • 不支持外键

  • 自增主键保证唯一但不保证连续

支持的事务模型

DRDS


  • DRDS 本质上是 DB Proxy,事务基本上是指 Proxy 层的事务,原则上并不涉及 RDS 数据库级别的事务

  • FREE:允许多写;不保证原子性;无性能损耗;数据批量导入、表初始化等场景

  • 2PC:两阶段提交事务;保证原子性,不保证可见性;推荐 MySQL 5.6 用户使用

  • XA:XA 强一致事务;保证原子性;保证可见性;推荐 MySQL 5.7 及更高版本用户使用

  • FLEXIBLE:柔性事务;补偿型事务;适用于性能要求较高、高并发的业务场景


TiDB


  • TiDB 参考 Percolator 事务模型,事务下沉到 TiKV(存储引擎)

  • 通过 2PC(Prewrite 阶段和 Commit 阶段)提交以及乐观锁保证分布系统中的 ACID

  • TiDB 提供的事务隔离级别(Snapshot Isolation)与 MySQL 提供的事务隔离级别保持一致

高可用保障

DRDS


  • 通过下游 RDS 主备方案保证数据高可用

  • 数据冗余两副本以上,基本上从节点不参与计算只进行数据备份,资源上比较浪费

  • 跨机房多地部署实施困难,需要借助同步工具或业务上实现数据双写


TiDB


  • tidb 的元数据存储在 pd 中,通过 pd 调度数据分片

  • 分片最低三副本,通过 multi-raft 调度

  • 通过节点标签影响 pd 调度,实现两地三中心部署


从架构来讲 TiDB 的原生三副本机制要优于 DRDS 通过异步数据同步实现高可用的机制。异步同步主要的缺点是切换周期长,存在数据丢失的风险。对于 DRDS 当业务系统使用 XA 或者 GTS 这种强一致性协议时,某节点宕机会导致服务整体不可用

扩缩容再平衡机制

横向扩索容主要考虑数据再平衡的效率和对在线业务系统的影响问题。考虑到 DRDS 分库分表采用哈希切分,那么在数据再平衡时需要针对分片 key 将所有数据进行重新分片,造成网络及系统开销较大;TiDB 采用 Range 分片机制,当节点数发生变化,根据 pd 调度,只对部分 Region 进行迁移,系统开销理论上小的多.

运维成本

DRDS


  • 由于 DRDS 多由云厂商开发,本质上是一种服务,不存在运维成本,只有沟通成本

  • 由于 Proxy 层技术不透明,数据又基于 RDS,系统性能优化需要与厂商沟通解决


TiDB


  • 社区提供了 ansible 为基础的安装运维包,可以说单纯运维门槛不高,基于 prometheus 和 grafana 提供比较完善的监控系统

  • 性能优化一部分靠生态提供的工具,pd-ctl、tidb-ctl 等。另一方面靠社区的相应

  • 源码透明,可以深入了解其实现

应用场景

DRDS


  • 顺时高峰且易形成数据热点的场景

  • DRDS 的分片机制为 hash 分片,天然将数据打散到各个节点,借助 RDS 本身的缓存机制可以很好的缓解数据热点。比如企业的考勤系统或银行的柜员系统,在早上上班高峰并发量多,几分钟到一个小时的时间内员工会集中打卡或者登录单例数据库会瞬间达到性能瓶颈。


TiDB


  • 多租户 SaaS 应用:


该场景多为多租户场景,SAAS 供应商为每一个用户提供单独的库,每个数据库的数据量不均衡。如果使用 MySQL 单实例挂载多库的方式只能纵向扩展;多实例多库方式要么在应用层为每个应用程序配置不同的数据库 URL,要么实现业务数据 Router;采用 TiDB 可以统一管理数据资源,将多个实例转化为一个集群维护,同时借助 TiDB 的数据分片机制避免单一用户形成实例热点。


  • 微服务架构统一管理数据资源:


微服务架构的一个原则是数据可拆分,但如果每个微服务使用 MySQL 主备方式维护一组 MySQL 实例不仅不便于管理,而且由于每个服务对数据库资源使用的不均衡及易造成资源浪费。应用 TiDB 集群不仅可以很好的解决上述问题,而且便于维护,同时就业务来讲比较容易形成数据服务中间层。

备份机制

DRDS


依赖于 RDS 本身的备份机制


TiDB


  • Tidb 遵循 MySQL 协议,全量情况下可以通过 MyDumper 等逻辑备份工具备份数据

  • 增量数据可以通过社区提供的 TiDB-Binlog 实时生成增量备份文件

应用改造成本

DRDS


  • 分片键的选择,实际开发中通常会存在说干业务依赖于同一张表的情况,通过某一个列作为分片条件提高某项业务性能时可能隐性降低某些业务的性能。

  • 分片算法的选,DRDS 的拆分算法很多,择简单取模、数值向右移、双拆分列哈希等等,需要开发者先弄清楚这些概念再根据业务情况进行选择

  • 拆分后的表不支持全局唯一约束,如果由于业务需求必须维护全局唯一只能通过建立中间表的方式维护唯一性,增加开发成本和数据库调用次数

  • 拆分后的表部分 SQL 要根据 DRDS 的扩展语法重写


TiDB


  • TiDB 的 SQL 实质上是 MySQL 语法的一个完全子集,如果业务没有用到 MySQL 的内建函数和外键约束的话基本可以平滑迁移,只需要对部分 SQL 根据 TiDB 架构特性进行优化

  • 如果重度应用 MySQL 的系统存在某些 TiDB 不支持的函数,那么这部分功能需要应用端实现


总体上来讲,DRDS 的应用改造成本主要集中在业务数据拆分上,以及由于数据拆分带来的业务应用重构;Tidb 由于自身架构原生支持分片所以不存在数据拆分问题,应用重用主要由于对 MySQL 的私有内建函数依赖重。

个人观点总结

DRDS 起源于 DB 中间件,通过 hash 算法做数据分片用于扩展单机数据库的不足,属于过度产品,扩展时数据再平衡的时间会随着数据及节点数量的增加而增加。从应用改造后续维护的角度来讲,性价比不高。从场景上来讲 DRDS 的 hash 分片机制可以更好的散列数据,更加不易形成数据热点;TiDB 在频发访问的数据量小于 64M 时易形成热点,当数据的范围大于 64M 的时候几乎可以数据会被分配到其他节点热点也随之消除。


从应用架构来考虑,这个量级的热数据完全可以通过缓存解决。TiDB 从架构来讲是一个很优雅的数据库系统,社区及公司历史不长但发展很快,在实际使用过程中会遇到一些坑,这些坑一部分是由于产品成长过程中的 bug 或者待优化 feature 造成,另一部分是由于单机环境和分布式环境的差异造成的。勇于尝试新事物,也许未来收益会更大。


2019-11-04 18:232141

评论

发布
暂无评论
发现更多内容

企业级数据库DevOps最佳实践,NineData实现高效安全的数据库开发

NineData

数据库 DevOps 最佳实践 NineData DTCC2024

HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容

HarmonyOS SDK

HarmonyOS

openGauss-子事务并发回滚流程优化

Gauss松鼠会

opengauss

突破传统监测模式:业务状态监控HM的新思路

京东科技开发者

GRETT格莱特合约系统开发方案|项目逻辑讲解

V\TG【ch3nguang】

基于LangChain手工测试用例转Web自动化测试生成工具

测吧(北京)科技有限公司

测试

k8s-使用Network Policies实现网络隔离

不在线第一只蜗牛

Kubernetes 容器 网络

拍卖软件开发新趋势:直播技术让买家“零距离”体验珍品?

软件开发-梦幻运营部

QUIC在京东直播的应用与实践

京东科技开发者

哈希游戏系统开发技术丨竞猜哈希开发游戏技术方案

V\TG【ch3nguang】

哈希竞猜游戏开发

Veeam Backup & Replication v12.2 发布,新增功能概述

sysin

云计算 数据中心 备份 恢复 veeam

漆包线行业生产管理革新:万界星空科技MES系统解决方案

万界星空科技

mes 万界星空科技 漆包线mes 漆包线 漆包线工厂

利用通义灵码实现我的第一次开源贡献

阿里云云效

阿里云 云原生 通义灵码

2024 年的 Web3 游戏:演变、趋势和市场动态

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

SRE 必备知识 - Kafka 探秘之零拷贝技术

快乐非自愿限量之名

php kafka 分布式

线下陪玩游戏系统开发功能需求/步骤设计

V\TG【ch3nguang】

线下陪玩游戏系统

解析云上实时数仓的挑战与实践 | Databend @DTCC 2024 演讲回顾

Databend

Gartner首次发布AI代码助手魔力象限,阿里云进入挑战者象限,通义灵码产品能力全面领先

阿里巴巴云原生

阿里云 云原生 通义灵码

Veeam Data Platform 12.2 发布下载,新增功能概览

sysin

数据保护 备份 恢复 veeam

推荐6种超赞的 MyBatis 写法!

高端章鱼哥

异步编程:真的让程序更快了吗?

伤感汤姆布利柏

如何优雅的处理异常

京东科技开发者

提升店铺好评秘籍:淘宝商品评论接口与电商API接口的深度解析

tbapi

淘宝商品评论接口 淘宝评论API

天猫商品详情API:商品收藏与加购信息的获取

技术冰糖葫芦

API Explorer API 测试 API 策略

利用通义灵码实现我的第一次开源贡献

阿里巴巴云原生

阿里云 云原生

Prometheus 告警恢复时,怎么获取恢复时的值?

巴辉特

Prometheus Nightingale Alertmanager FlashDuty

不改一行代码轻松玩转 Go 应用微服务治理

阿里巴巴云原生

阿里云 微服务 云原生

Gartner首次发布AI代码助手魔力象限,阿里云进入挑战者象限,通义灵码产品能力全面领先

阿里云云效

阿里云 云原生 通义灵码

携程技术分享:亿级流量的办公IM及开放平台技术实践

JackJiang

即时通讯;IM;网络编程

异常检测算法在可观测性平台的落地和实践|得物技术

得物技术

Python 异常检测 时序预测 企业号2024年8月PK榜

企业级环境部署:在 Linux 服务器上如何搭建和部署 Python 环境?

EquatorCoco

Python Linux 服务器

DRDS 与TiDB浅析_服务革新_京东云_InfoQ精选文章