QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

淘宝曹伟分析低成本、高性能 MySQL 云数据架构

  • 2012-10-25
  • 本文字数:2411 字

    阅读完需:约 8 分钟

曹伟淘宝数据库研发组的成员,前不久他在内部分享了低成本、高性能 MySQL 云数据的架构分析和探索,包括架构的演变过程、系统中的角色和组件等。该文章被褚霸转发在“Erlang 非业余研究”上。

在一开始,曹伟指出:

虽然近两年来 NoSQL 的发展很快,新产品层出不穷,但在业务中应用 NoSQL 对开发者来说要求比较高,而 MySQL 拥有成熟的中间件、运维工具,已经形成一个良性的生态圈等,因此从现阶段来看,MySQL 占主导性,NoSQL 为辅。

接下来,曹伟介绍了他们的工作成果:

我们(阿里集团核心系统数据库团队)……设计和实现了一套 UMP(Unified MySQL Platform) 系统,提供低成本和高性能的 MySQL 云数据服务。开发者从平台上申请 MySQL 实例资源,通过平台提供的单一入口来访问数据,UMP 系统内部维护和管理资源池,以对用户透明的形式提供主从热备、数据备份、迁移、容灾、读写分离、分库分表等一系列服务。平台通过在一台物理机上运行多个 MySQL 实例的方式来降低成本,并且实现了资源隔离,按需分配和限制 CPU、内存和 IO 资源,同时支持不影响提供数据服务的前提下根据用户业务的发展动态的扩容和缩容。

曹伟分析了该系统的架构演变过程:

第一版基于 mysql-proxy 0.8 版修复若干 bug,并对 proxy 插件中管理用户连接和数据库连接的状态机流程进行一些修改,同时编写 Lua 脚本实现去中心数据库获取用户认证信息和后台数据库地址,对用户进行验证,建立到后台数据库的连接和转发数据包等逻辑。

图:UMP 系统第一版架构

他提到第一版的几个问题:

  1. mysql-proxy 0.8 版对多线程的支持比较简单粗暴,导致几个恶劣后果:
  • 造成“惊群”现象,多个线程被唤醒但只有一个线程需要去任务;
  • 任务的 CPU 亲缘性比较差,在同一个状态机上触发的事件会在多个处理器上来回切换执行;
  • mysql-proxy 中还使用了全局 Lua 锁,同时仅允许一个工作线程执行 Lua 脚本,因此 mysql-proxy 多线程模式下的性能远不能同 CPU 核数保持线性增长,甚至在 16 核上的性能还不如 4 核。
  • 以上原因导致单进程模式时,一台物理机上需要部署多个进程才能有效利用机器的处理能力,但给部署、监控和服务的升级带来麻烦。
  1. 其次,限于 mysql-proxy 的框架,功能上不容易扩展,实现用户的连接数限制、QPS 限制、以及主从切换、读写分离、分库分表等一系列功能比较困难。
  2. 最后,mysql-proxy 的社区近些年来并不活跃,而且 C 语言对开发者功底的要求比较高,很难要求团队所有成员协同开发出兼顾优雅和正确性的代码。

因此,他们决定用 Erlang 重写,原因在于:

  • 和操作系统的进程 / 线程相比,Erlang 进程同样是并发执行的单位,但特别的轻量级,它是在 Erlang 虚拟机内管理和调度的“绿进程”,即用户态进程。
  • Erlang/OTP 很好的抽象了开发一个分布式的、高容错性的应用程序所需的要素,包括:网络编程框架、序列化和反序列化、容错、热部署。

在设计当前的 UMP 系统架构时,团队遵循了以下原则:

  • 系统对外保持单一入口,对内维护单一的资源池。
  • 保证服务的高可用性,消除单点故障。
  • 保证系统是弹性可伸缩的,可以动态的增加、删减计算与存储节点。
  • 保证分配给用户的资源也是弹性可伸缩的,资源之间相互隔离。

图:UMP 系统现有架构

UMP 系统中有如下角色:

  • controller 服务器:向 UMP 集群提供各种管理服务,实现元数据存储、集群成员管理、MySQL 实例管理、故障恢复、备份、迁移、扩容等功能。
  • proxy 服务器:向用户提供访问 MySQL 数据库的服务,它完全实现了 MySQL 协议;除数据路由的基本功能外,Proxy 服务器中还实现了资源限制、屏蔽 MySQL 实例故障、读写分离、分库分表、记录用户访问日志的功能。
  • agent 服务器:部署在运行 MySQL 进程的机器上,用来管理每台物理机上 MySQL 实例,执行创建、删除、备份、迁移、主从切换等操作,收集和分析 MySQL 进程的统计信息、bin log、slow query log。
  • API/Web 服务器:向用户提供了系统管理界面。它们是基于开源项目 Mochiweb 与 Chicago Boss 开发的 Mochiweb 提供 http/https 服务。
  • 日志分析服务器:存储和分析 Proxy 服务器传入的用户访问日志,并实现了实时索引供用户查询一段时间内的慢日志和统计报表。
  • 信息统计服务器:定期将采集到的用户的连接数、QPS 数值,以及 MySQL 实例的进程状态用 RRDtool 进行统计,可以画图展示到 Web 界面上,也可以为今后实现弹性的资源分配和自动化的 MySQL 实例迁移提供依据。

依赖的开源组件有:

  • Mnesia:Mnesia 是 OTP 提供的分布式数据库,支持事务,支持透明的数据分片,利用两阶段锁实现分布式事务,可以线性扩展到至少 50 个节点。Mnesia 更倾向于牺牲可用性来换取强一致性,但它也提供了脏读、脏写操作,可以绕过事务管理去操作数据。
  • LVS:实现负载均衡,用户应用重连后会被 LVS 定向到其他的 proxy 上。
  • RabbitMQ:提供 UMP 系统中各节点间的通信(不包括 SQL 查询、日志等大数据流的传输,这些还是直接走 TCP 的)
  • ZooKeeper:主要发挥配置服务器、分布式锁,以及监控所有 MySQL 实例的作用

对于该系统的作用,曹伟总结到:

在多个组件的协同作业下,整个系统实现了对用户透明的容灾、读写分离、分库分表功能。系统内部还通过多个小规模用户共享同一个 MySQL 实例,中等规模用户独占一个 MySQL 实例,多个 MySQL 实例共享同一个物理机的方式实现资源的虚拟化,降低整体成本。在资源隔离方面,通过 Cgroup 限制 MySQL 进程资源,以及在 proxy 服务器端限制 QPS 相结合的方法,UMP 系统实现了资源虚拟化的同时保障用户的服务质量。此外,UMP 系统综合运用 SSL 数据库连接、数据访问 IP 白名单、记录用户操作日志、SQL 拦截等技术保护用户的数据安全。

对于该系统的应用,曹伟指出:

UMP 系统的一些组件,例如 proxy 服务器和日志分析服务器,目前已经运用在天猫的聚石塔平台中,为电商和 ISV 提供安全的数据云服务。此外,UMP 系统还运用在淘宝的店铺装修平台中,为开发者提供数据服务。下一阶段,我们希望 UMP 系统可以为进一步降低集团内部数据存储的成本做出贡献。

2012-10-25 20:0315892
用户头像

发布了 479 篇内容, 共 165.2 次阅读, 收获喜欢 52 次。

关注

评论

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

第四模块总结

张靖

架构训练营

调优达到上限?这份尊享版性能实战套餐,让你领先别人好几个级别

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

Pulsar VS. Kafka(1): 统一的消息消费模型(Queue + Stream)

Apache Pulsar

kafka 架构 云原生 Apache Pulsar 消息中间件

堪称数据库的天花板,极致经典的字节内部MySQL宝典意外流出!

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

明道云对接企查查,一键矫正客户信息

明道云

区块链技术革命才刚刚开始

CECBC

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」让我们一起实践RocketMQ的服务搭建及配置操作

码界西柚

RocketMQ 11月日更 Apache RocketMQ 集群搭建

【高并发】深度解析ScheduledThreadPoolExecutor类的源代码

冰河

Java 并发编程 多线程 高并发 异步编程

字节跳动面试官:SpringBoot统一接口返回和全局异常处理怎么玩?

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

极客时间算法训练营Week01

jjn0703

算法训练营

元宇宙:区块链时代的新名字

CECBC

模块四作业

Asha

「架构实战营」

考试试卷存储方案

天天向上

架构实战营

flutter中的列表的性能优化前奏

坚果

flutter 11月日更

真香!Github一夜爆火,阿里性能优化不传之秘终于开源

热爱java的分享家

Java 程序人生 性能优化 编程语言 经验分享

区块链和人工智能是否可以保护森林不再被砍伐?

CECBC

你敢相信?我用了3个月成功破茧成蝶,从简历被拒到收割8个大厂offer

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

模块四作业-redis 存储方案设计 - 学生考试试卷

Geek_cb2b43

Pulsar VS. Kafka(2): 以Segment为中心的架构

Apache Pulsar

kafka 架构 分布式 Apache Pulsar 消息中间件

不可思议,阿里巴巴首发:Java核心框架指导手册,竟1小时点击量破千万

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

架构实战营模块四作业

孙志强

架构实战营

css布局之全屏布局

Augus

CSS 11月日更

Hive基本理论和常用函数

犟马骝

【LeetCode】N 叉树的最大深度Java题解

Albert

算法 LeetCode 11月日更

主客体建模法

少个分号

终于有人将Github星标百万的Spring技术精髓收录成册

热爱java的分享家

Java 面试 程序人生 springboot 经验分享

微服务架构中,二次浅封装实践

架构 分布式 微服务 技术栈 二次封装

遇到了几道关于作用域的前端小题

空城机

JavaScript 大前端 11月日更

Go语言学习查缺补漏ing Day3

Regan Yue

Go 语言 11月日更

nginx配置详解

小鲍侃java

11月日更

Apache Pulsar 与 Apache Kafka 在金融场景下的性能对比分析

Apache Pulsar

大数据 kafka 架构 云原生 Apache Pulsar

淘宝曹伟分析低成本、高性能MySQL云数据架构_Erlang_郑柯_InfoQ精选文章