MySQL平台化

出自淘宝数据库研发组

跳转到: 导航, 搜索

目录

项目背景

MySQL平台化(RDS)项目是为大量中小型应用提供托管式的数据库服务而开发的,目的是减轻应用开发和数据库运维两方面的成本。


应用开发者无须去申请独立的MySQL服务器,配置主从复制等数据安全策略,设计负载均衡、读写分离的机制,只要在RDS平台上为应用申请一个帐号,即可分配到一个虚拟的MySQL实例。应用可以使用这个帐号访问一组代理服务器,代理的接口与MySQL服务器协议完全兼容,用户可以使用已有的任何MySQL客户端去访问代理。代理连接到后端的MySQL服务器集群去访问真正的用户数据,并根据对SQL 语句的解析实现负载均衡和读写分离。MySQL服务器集群内部对用户数据实行主从复制,保证用户数据的安全。


对于数据库运维而言,RDS通过监控MySQL服务器集群的心跳,对服务器的异常情况进行处理,达到系统的高可靠,整个过程可以自动完成,无须人工干预。同时RDS系统还提供便捷的web管理界面,对用户的SQL语句进行统计分析的模块,在各方面简化人工的操作,将系统运维的经验和知识集成到自动化的系统中。


RDS v2.0中增加了分库分表和扩容工具,即将应用的数据shard到后端集群的多台MySQL服务器上,在proxy端嵌入数据路由的逻辑,满足数据量较大的应用。


MySQL平台架构图

MySQL平台架构图.jpg

系统中的组件包括web控制台、rds_ctl(API、元数据存储、集群成员管理、实例管理、消息队列管理、MySQL故障恢复、MySQL备份和扩容、邮件报警)、rds_proxy、rds_la、rds_agent、MySQL集群、LVS、ZooKeeper、RabbitMQ等。


和RDS v1.0相比:

  • 引入ZooKeeper组件,消除单点,实现高可用和成员管理
  • 引入RabbitMQ,实现节点之间的可靠通讯
  • 新功能的开发,支持数据库备份,支持故障恢复(主备切换)、分库分表和扩容,拥有web控制台,增加系统的监控和邮件报警功能
  • rds_la支持更智能的数据切分和存储,无需额外配置


系统的主要部件包括rds_ctl、rds_proxy、rds_la、rds_agent都使用以高性能、健壮以及可伸缩性出名的Erlang语言开发。

系统组件介绍

Web控制台

web前端,提供创建、删除、修改配置等用户管理操作,修改集群配置,查看集群状态,查看用户的QPS、连接数,提供慢日志查询、日志统计等功能。

rds_proxy

rds_proxy(下文简称proxy)是用户的应用程序和后台MySQL集群之间的一组服务器,它兼容MySQL的客户端/服务器协议,用户可以使用已有的任何MySQL客户端连接到proxy,proxy通过用户名查询路由表,得知该用户的数据分布在哪些MySQL服务器上,再将用户的SQL查询请求转发到正确的MySQL服务器。

proxy屏蔽了MySQL服务器出现故障时进行主备切换的细节,在主备切换期间,可以保证用户与proxy之间的连接不断开。proxy层还实现了分库分表,使用分库分表功能时,会对SQL进行解析,并根据用户指定的字段和规则将SQL语句发送到涉及的MySQL服务器上,对返回的结果进行归并后返回用户。

proxy层还实现了对用户连接数、QPS、结果条数的统计和限制,对用户的SQL语句和执行结果进行记录。

proxy服务器在实现上是无状态的,服务器宕机不会对集群和其他proxy造成影响,只会造成连接到该proxy的用户连接断开,用户应用重连后会被LVS定向到其他的proxy上。

rds_ctl

rds_ctl对RDS集群提供各种管理服务,实现了API、元数据存储、集群成员管理、实例管理、消息队列管理、MySQL故障恢复、MySQL备份和扩容、邮件报警等功能。

API服务通过Http(s) POST方法,采用JSON格式,提供了一组创建/销毁/查询用户实例的API,将rds_ctl提供的功能暴露给外部(例如Web控制台)。API服务接收到命令后会将命令转发给rds_ctl内部对应的服务。

元数据存储服务采用Erlang的mnesia事务型分布式数据库实现,运行在所有rds_ctl节点上,提供元数据存储与访问服务,mnesia保证节点间数据的强一致性。

集群成员管理基于ZooKeeper实现,rds_ctl会监听集群成员上线、下线事件,并根据事件类型采取不同的动作,例如报警、广播、修改路由表、执行主备切换等等。

实例管理服务负责创建/销毁用户实例。以创建实例为例,收到请求后,实例控制服务器会根据集群的负载状况,选择合适MySQL主从节点,发送命令给运行这些节点上的rds_agent,为用户建库。

rds_ctl会对集成的RabbitMQ服务进行管理,例如为新加入的节点创建队列(信箱),配置用于事件广播的Exchange等。

在MySQL故障恢复、备份和扩容过程中,rds_ctl主要扮演协调者(coordinator)的角色,发送命令给rds_agent和愚公系统,在适当的时机下(例如主从数据一致)修改路由,进行主从切换,并广播通知所有的proxy。

rds_ctl还负责搜集集群内的错误信息和异常状态,发信的方式报警。

由于rds_ctl对集群的重要程度,会采用多机热备的方式实现HA。

rds_la

rds_la从proxy上收集日志,进行数据分析,建立索引便于查询。RDS v1.0版本中需要编写规则指定哪些用户的日志数据被存储在哪些la上,RDS v2.0中会采用更自动化的方式支持。

rds_agent

每台MySQL服务器上会部署一个rds_agent节点,用于创建/删除实例、故障恢复、备份、扩容过程中操作MySQL进程。

演讲资料下载

个人工具