MySQL云数据库服务的架构探索

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:
MySQL作为一种低成本、高性能、可靠性良好而且开源的 数据库产品,在 互联网企业中应用非常广泛。例如,淘宝网就有数千台MySQL服务器。虽然近两年来NoSQL的发展很快,新产品层出不穷,但在业务中应用NoSQL对开发者来说要求比较高,而MySQL拥有成熟的中间件、运维工具, 已经形成一个良性的生态圈。因此,在现阶段的应用中仍然以MySQL为主,NoSQL为辅。
  在过去一年里,我们在MySQL托管平台方向做了大量 工作,设计和实现了一套UMP(Unifield MySQL Platform)系统,提供低成本和高性能的MySQL云数据库服务。开发者从平台上申请MySQL实例资源,通过平台提供的单一入口来访问数据。UMP系统内部维护和管理资源池,以透明的形式提供主从热备、数据备份、迁移、容灾、读写分离和分库分表等一系列服务。平台通过在一台物理机上运行多个 MySQL实例的方式来降低成本,并且实现了资源隔离,按需分配和限制CPU、内存和I/O资源,同时在不影响提供数据服务的前提下,支持根据用户业务的 发展来动态扩容和缩容。
   架构的演变
  UMP系统第一版基于 MySQL Proxy 0.8版修复了若干 Bug,并对Proxy插件中管理用户连接和数据库连接的状态机流程进行了修改;编写了Lua脚本实现到中心数据库获取用户认证信息和 后台数据库地址,来对用户进行验证;建立了到后台数据库的连接和转发数据包等逻辑(如图1所示)。
  
图1 UML系统的第一版(当时称作RDS系统)采用MySQL Proxy
  在开发和部署第一版的过程中,我们逐渐认识到几个问题。
  首先,MySQL Proxy 0.8版对多线程的支持比较简单粗暴,多个工作线程共享同一个消息队列,同时监听着同一个socketpair通道。当有新事件进入消息队列 后,socketpair会被写入一个字节,所有休眠中的线程都会被唤醒,去竞争一个互斥锁从消息队列中取任务。这种实现有几个问题:一是造成“惊群”现 象,多个线程被唤醒但只有一个线程需要去完成任务;二是任务的CPU亲缘性比较差,在同一个状态机上触发的事件会在多个处理器上来回切换执行。此 外,MySQL Proxy中还使用了全局Lua锁,同时仅允许一个工作线程执行Lua脚本(计划在0.9版本中改进)。因此,在多线程模式下,MySQL Proxy的性能远不能同CPU核数保持线性增长,甚至在16核上的性能还不如4核。而使用单进程模式时,一台物理机上需要部署多个进程才能有效利用机器 的处理能力,但给部署、监控和服务的升级带来麻烦。
  其次,由于MySQL Proxy的框架在功能上不容易扩展,所以实现用户的连接数限制、QPS限制及主从切换、读写分离、分库分表等功能比较困难。
  最后,MySQL Proxy的社区近些年并不活跃,且C语言对开发者功底的要求比较高,很难要求团队所有成员协同开发出兼顾优雅和正确性的代码。
  因此,我们决定用Erlang语言重新编写Proxy服务器,替换了原有的MySQL Proxy模块。目前,整个项目拥有5万行Erlang源码,3万行C/C++源码,2万行其他语言源码。
   为什么选择Erlang语言
  Erlang 是一个结构化的、动态的、函数式的编程语言。常见的一种说法是Erlang是面向并发的(Concurrent-Oriented),这主要指 Erlang在语言中定义了Erlang进程的概念和行为(本文中提到的“Erlang进程”都是指Erlang语言中定义的进程,以区分于大家熟悉的 操作系统进程)。与操作系统的进程/线程相比,Erlang进程同样是并发执行的单位,但特别轻量级,它是在Erlang虚拟机内管理和调度的“绿进程”, 即用户态进程(如图2所示)。举个例子,在关闭了HiPE和SMP支持的Erlang虚拟机中,一个新创建的进程占用的内存仅为309个字 (Word,64位服务器上为8个字节)。其中233个字为堆空间(包含栈),创建和结束一个进程约耗时1~3微秒,而一个Erlang虚拟机中可以同时 支持几十万甚至更多个进程。
   
图2 Erlang的轻量级进程

说到Erlang语言,就必须提及OTP(Open Telecom Platform,开放电信平台)。OTP是用于开发分布式的、高容错性的Erlang应用程序的框架与平台。例如,一个Erlang节点连接并注册到 Erlang集群上,发现集群中的其他节点,并与它们进行RPC通信,这些都在OTP里的Kernel服务中实现。OTP和Erlang语言关系如此紧 密,以至于两者通常合称为Erlang/OTP,因此从严格的意义上来讲,应该说我们选择了Erlang/OTP来构造UMP系统。Erlang/OTP 很好地抽象了开发一个分布式的、高容错性的应用程序所需的要素,包括网络编程框架、序列化和反序列化、容错、热部署。
  为了支持并发,服务器 端多采用多进程/多线程模型,即每个进程/线程处理一个客户端连接。但受限于操作系统资源,每台服务器可以处理的并发连接数并不高,且由于进程/线程上下文切换开销,系统性能会受到影响。而开发高并发、高性能服务器一般采用事件驱动的状态机模型,底层采用非阻塞I/O(Linux中的epoll,BSD系 统中的kqueue,Java中的nio)或者异步I/O,或者采用异步的事件通知的I/O框架,例如C/C++下的ACE、boost::asio、 libevent,Java下的MINA等。在业务层则使用状态机来表示每个客户端连接,通过I/O事件、超时事件驱动状态机进行跳转,每个进程/线程可 处理成千上万个客户端连接。与多进程/多线程模型相比,虽然事件驱动的状态机模型并发量更大、性能更好,但把业务逻辑表达成状态机是一件困难的事情。相比 之下,多进程/多线程模型中的业务逻辑可以实现为顺序执行的代码,开发起来要简单得多。
  Erlang/OTP中的网络编程模型则结合了两者 的优点,每个Erlang进程处理一个客户端连接,业务逻辑是顺序执行的。Erlang进程是极轻量级的,可以认为每个Erlang进程是一个状态机,堆 和栈上的数据是这个状态机的状态。Erlang进程收到数据包或者其他进程发来的消息后执行处理例程,相当于状态机的跳转,因此也具有高并发和高性能的优 势。
  Erlang/OTP定义了“External Term Format”协议将Erlang数据结构与二进制字符串相互转化,并用C实现在Erlang虚拟机中,在进行跨节点通信时遵从这个协议。因此,开发者无须额外考虑序列化和反序列化问题。
  在容错方面,Erlang进程的数据空间是相互隔离的,没有共享内存,因此一个Erlang进程崩溃不会影响其他Erlang进程运行,更不会造成 Erlang虚拟机崩溃。OTP提供了监督树机制和heart模块,前者在监控到Erlang进程崩溃时进行故障恢复,后者在发现Erlang虚拟机失去 响应时重启程序。
  Erlang/OTP提供热部署方式,可以避免服务升级时造成不可用时间。此外,OTP还提供了一些在系统运行时观察系统状态的工具。例如lcnt工具,可以统计虚拟机内部的锁使用次数和冲突次数,指导系统的优化。
   当前系统架构
  在设计UMP系统时,我们遵循了以下几条原则。
  系统对外保持单一入口,对内维护单一资源池。
  保证服务的高可用性,消除单点故障。
  保证系统是弹性可伸缩的,可以动态地增加、删减计算与存储节点。
  保证分配给用户的资源也是弹性可伸缩的,资源之间相互隔离。
  UMP系统中的角色包括:Controller服务器、Proxy服务器、Agent服务器、API/Web服务器、日志分析服务器和信息统计服务器。图3是当前UMP系统的架构图。UMP系统依赖Mnesia、LVS、RabbitMQ、ZooKeeper等开源组件。
  
图3 当前UMP系统架构图
  Mnesia是OTP提供的分布式数据库,与MySQL NDB出自同门,都是20世纪90年代中期Ericsson为电信业务研发的数据产品。Mnesia支持事务、支持透明的数据分片,利用两阶段锁实现分布式事务,可以线性扩展到至少50个节点。
  从CAP理论的角度来说,Mnesia更倾向于牺牲可用性来换取强一致性,属于CP阵营。但它也提供了脏读、脏写操作,可以绕过事务管理去操作数据,这时不 保证一致性,有点类似于AP的系统。在工程实践中,我们用事务去修改关键数据(例如路由表),而用脏写接口去写非关键数据(例如用户的状态信息),读取数 据用脏读接口。
  Controller服务器向UMP集群提供各种管理服务,实现元数据存储、集群成员管理、MySQL实例管理、故障恢复、 备份、迁移和扩容等功能。Controller服务器上运行了一组Mnesia分布式数据库服务,系统的元数据如集群成员、用户的配置和状态信息,以及用 户名到后端MySQL实例地址的映射关系(路由表)等都存储在Mnesia里,其他服务器组件通过发送请求到Controller服务器获取用户数据。
  为了达到高可用性,系统中会部署多台Controller服务器,它们通过ZooKeeper提供的分布式锁算法选举出一个leader,这个leader 负责调度和监控各种系统任务,例如创建和删除数据库实例、备份和迁移等。这些系统任务可以分成多个步骤,而且会涉及系统中的多个组件,例如主库、从库和 Proxy服务器等,还需要提供失败时回滚的方法。因此,我们采用类似工作流的方式来实现。每个系统任务都分成多个阶段的Erlang进程,每执行完一个 步骤跳进下个步骤之前会把中间状态持久化到Mnesia中。如果任务因为节点故障停止的话,leader能检测到并重新发起该任务,任务重启后会从上一次 失败的“断点”继续向下执行。
  API/Web服务器向用户提供了系统管理界面。它们是基于开源项目Mochiweb和Chicago Boss开发的,Mochiweb提供HTTP/HTTPS服务,而Chicago Boss是由Nginx的作者之一Evan Miller开发的,提供类似Rails的MVC框架。与Rails比,Erlang开发的框架天生就对并发有很好的支持,每个请求占用一个轻量级的 Erlang进程,而Rails虽然在最近引入了多线程安全,但处理每条请求时仍然是独占整个进程的,因此需要使用多进程模型处理并发请求,通过 Phusion Passenger等应用服务器进行派发。
  Proxy服务器向用户提供访问MySQL数据库的服务,它完全实现了 MySQL协议,用户可以使用已有的MySQL客户端连接到Proxy服务器,Proxy服务器通过用户名获取到用户的认证信息、资源配额的限制(例如最 大连接数、QPS和IOPS等),以及后台MySQL实例的地址(列表),再将用户的SQL查询请求转发到正确的MySQL实例上。
  除了数据路由的基本功能外,Proxy服务器中还实现了资源限制、屏蔽MySQL实例故障、读写分离、分库分表、记录用户访问日志等功能。Proxy服务器是无 状态的,服务器宕机不会对系统中其他服务器造成影响,只会造成连接到该Proxy的用户连接断开。多台Proxy服务器采用LVS HA方案实现负载均衡,用户应用重连后会被LVS定向到其他的Proxy上。
  Agent服务器部署在运行MySQL进程的机器上,用来管理每台物理机上的MySQL实例,执行创建、删除、备份、迁移和主从切换等操作,收集和分析MySQL进程的统计信息、bin log和slow query log。
  日志分析服务器会存储和分析Proxy服务器传入的用户访问日志,并实现了实时索引供用户查询一段时间内的慢日志和统计报表。信息统计服务器定期将采集到的 用户连接数、QPS数值,以及MySQL实例的进程状态用RRDtool进行统计,可画图展示到Web界面上,也可为今后实现弹性的资源分配和自动化的 MySQL实例迁移提供依据。
  UMP系统中各节点间的通信(不包括SQL查询、日志等大数据流的传输,这些还是直接走TCP的)都通过RabbitMQ,作为消息通信的中间件来使用,以保证消息发送的可靠性。ZooKeeper则主要发挥配置服务器、分布式锁,以及监控所有MySQL实例的作用。
  在多个组件的协同作业下,整个系统实现了对用户透明的容灾、读写分离、分库分表功能。系统内部还通过多个小规模用户共享同一个MySQL实例,中等规模用户独占一个MySQL实例,多个MySQL实例共享同一个物理机的方式实现资源的虚拟化,降低整体成本。在资源隔离方面,通过Cgroup限制MySQL进 程资源,以及在Proxy服务器端限制QPS相结合的方法,UMP系统能在实现资源虚拟化的同时保障用户的服务质量。此外,UMP系统综合运用SSL数据 库连接、数据访问IP白名单、记录用户操作日志、SQL拦截等技术保护用户的数据安全。
   结束语
  UMP系统的一些组件,例如Proxy服务器和日志分析服务器,目前已经运用在天猫的聚石塔平台中,为电商和ISV提供安全的数据云服务。此外,UMP系统还运 用在淘宝的店铺装修平台中,为开发者提供数据服务。下一阶段,我们希望UMP系统能进一步为企业降低数据存储的成本。
最新内容请见作者的GitHub页:http://qaseven.github.io/


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
20天前
|
存储 关系型数据库 MySQL
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
本文详细介绍了在 MySQL 中创建数据库和表的方法。包括安装 MySQL、用命令行和图形化工具创建数据库、选择数据库、创建表(含数据类型介绍与选择建议、案例分析、最佳实践与注意事项)以及查看数据库和表的内容。文章专业、严谨且具可操作性,对数据管理有实际帮助。
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
|
9天前
|
SQL 关系型数据库 MySQL
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
这是一份详细的MySQL安装与配置教程,适合初学者快速上手。内容涵盖从下载到安装的每一步操作,包括选择版本、设置路径、配置端口及密码等。同时提供基础操作指南,如数据库管理、数据表增删改查、用户权限设置等。还介绍了备份恢复、图形化工具使用和性能优化技巧,帮助用户全面掌握MySQL的使用方法。附带常见问题解决方法,保姆级教学让你无忧入门!
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
|
28天前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
1月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
1月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
2月前
|
存储 SQL 并行计算
【赵渝强老师】达梦数据库MPP集群的架构
达梦数据库提供大规模并行处理(MPP)架构,以低成本实现高性能并行计算,满足海量数据存储和复杂查询需求。DM MPP采用完全对等无共享体系,消除主节点瓶颈,通过多节点并行执行提升性能。其执行流程包括主EP生成计划、分发任务、各EP并行处理及结果汇总返回。为确保高可用性,建议结合数据守护部署。
|
2月前
|
存储 SQL 关系型数据库
从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?
TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务,轻松应对海量功率、电能及输入输出数据的实时统计与分析,并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外,taosX 强大的 transform 功能帮助用户完成原始数据的清洗和结构优化,而其零代码迁移能力更实现了历史数据从 TDengine OSS 与 MySQL 到 TDengine 企业版的平滑迁移,全面提升了企业的数据管理效率。本文将详细解读这一实践案例。
78 0
|
11月前
|
存储 SQL BI
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案

热门文章

最新文章