UMP概述
UMP系统是低成本和高性能的MySQL云数据库方案
UMP系统架构设计遵循了以下原则:
- 保持单一的系统对外入口,并且为系统内部维护单一的资源池
- 消除单点故障,保证服务的高可用性
- 保证系统具有良好的可伸缩,能够动态地增加、删减计算与存储节点
- 保证分配给用户的资源也是弹性可伸缩的,资源之间相互隔离,确保应用和数据安全
UMP系统架构
UMP系统中的角色包括:
- Controller服务器
- Proxy服务器
- Agent服务器
- Web控制台
- 日志分析服务器
- 信息统计服务器
- 愚公系统
依赖的开源组件包括:
- Mnesia
- LVS
- RabbitMQ
- ZooKeeper
Mnesia
- Mnesia是一个分布式数据库管理系统
- Mnesia支持事务,支持透明的数据分片,利用两阶段锁实现分布式事务,可以线性扩展到至少50个节点
- Mnesia的数据库模式(schema)可在运行时动态重配置,表能被迁移或复制到多个节点来改进容错性
- Mnesia的这些特性,使其在开发云数据库时被用来提供分布式数据库服务
RabbitMQ
- RabbitMQ是一个工业级的消息队列产品(功能类似于IBM公司的消息队列产品IBM Websphere MQ),作为消息传输中间件来使用,可以实现可靠的消息传送
- UMP集群中各个节点之间的通信,不需要建立专门的连接,都是通过读写队列消息来实现的
Zookeeper
Zookeeper是高效和可靠的协同工作系统,提供分布式锁之类的基本服务(比如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等),用于构建分布式应用,减轻分布式应用程序所承担的协调任务
在UMP系统中,Zookeeper主要发挥三个作用:
- 作为全局的配置服务器
- 提供分布式锁(选出一个集群的“总管”)
- 监控所有MySQL实例
LVS
- LVS(Linux Virtual Server)即Linux虚拟服务器,是一个虚拟的服务器集群系统
- UMP系统借助于LVS来实现集群内部的负载均衡
- LVS集群采用IP负载均衡技术和基于内容请求分发技术
- 调度器是LVS集群系统的唯一入口点,调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器
- 整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序
Controller服务器
- Controller服务器向UMP集群提供各种管理服务,实现集群成员管理、元数据存储、MySQL实例管理、故障恢复、备份、迁移、扩容等功能
- Controller服务器上运行了一组Mnesia分布式数据库服务,其中存储了各种系统元数据,主要包括集群成员、用户的配置和状态信息,以及用户名到后端MySQL实例地址的映射关系(或称为“路由表”)等
- 当其它服务器组件需要获取用户数据时,可以向Controller服务器发送请求获取数据
- 为了避免单点故障,保证系统的高可用性,UMP系统中部署了多台Controller服务器,然后,由Zookeeper的分布式锁功能来帮助选出一个“总管”,负责各种系统任务的调度和监控
Web控制台
Web控制台向用户提供系统管理界面
Proxy服务器
Proxy服务器向用户提供访问MySQL数据库的服务,它完全实现了MySQL协议,用户可以使用已有的MySQL客户端连接到Proxy服务器,Proxy服务器通过用户名获取到用户的认证信息、资源配额的限制(例如QPS、IOPS(I/O Per Second)、最大连接数等),以及后台MySQL实例的地址,然后,用户的SQL查询请求会被转发到相应的MySQL实例上。除了数据路由的基本功能外,Proxy服务器中还实现了很多重要的功能,主要包括屏蔽MySQL实例故障、读写分离、分库分表、资源隔离、记录用户访问日志等
Agent服务器
Agent服务器部署在运行MySQL进程的机器上,用来管理每台物理机上的MySQL实例,执行主从切换、创建、删除、备份、迁移等操作,同时,还负责收集和分析MySQL进程的统计信息、慢查询日志(Slow Query Log)和bin-log
日志分析服务器
日志分析服务器存储和分析Proxy服务器传入的用户访问日志,并支持实时查询一段时间内的慢日志和统计报表
信息统计服务器
信息统计服务器定期将采集到的用户的连接数、QPS数值以及MySQL实例的进程状态用RRDtool进行统计,可以在 Web界面上可视化展示统计结果,也可以把统计结果作为今后实现弹性的资源分配和自动化的MySQL实例迁移的依据
愚公系统
愚公系统是一个全量复制结合bin-log分析进行增量复制的工具,可以实现在不停机的情况下动态扩容、缩容和迁移
UMP系统功能
UMP系统是构建在一个大的集群之上的,通过多个组件的协同作业,整个系统实现了对用户透明的各种功能:
- 容灾
- 读写分离
- 分库分表
- 资源管理
- 资源调度
- 资源隔离
- 数据安全
容灾
•为了实现容灾,UMP系统会为每个用户创建两个MySQL实例,主库和从库
•主库和从库的状态是由Zookeeper负责维护的
•主从切换过程如下:
•Zookeeper探测到主库故障,通知Controller服务器
•Controller服务器启动主从切换时,会修改“路由表”,即用户名到后端MySQL实例地址的映射关系
•把主库标记为不可用
•借助于消息中间件RabbitMQ通知所有Proxy服务器修改用户名到后端MySQL实例地址的映射关系
•全部过程对用户透明
•宕机后的主库在进行恢复处理后需要再次上线,过程如下:
•在主库恢复时,会把从库的更新复制给自己
•当主库的数据库状态快要达到和从库一致的状态时,Controller服务器就会命令从库停止更新,进入不可写状态,禁止用户写入数据
•等到主库更新到和从库完全一致的状态时,Controller服务器就会发起主从切换操作,并在路由表中把主库标记为可用状态
•通知Proxy服务器把写操作切回主库上,用户写操作可以继续执行,之后再把从库修改为可写状态
读写分离
•充分利用主从库实现用户读写操作的分离,实现负载均衡
•UMP系统实现了对于用户透明的读写分离功能,当整个功能被开启时,负责向用户提供访问MySQL数据库服务的Proxy服务器,就会对用户发起的SQL语句进行解析,如果属于写操作,就直接发送到主库,如果是读操作,就会被均衡地发送到主库和从库上执行
分库分表
UMP支持对用户透明的分库分表
当采用分库分表时,系统处理用户查询的过程如下:
- 首先,Proxy服务器解析用户SQL语句,提取出重写和分发SQL语句所需要的信息
- 其次,对SQL语句进行重写,得到多个针对相应MySQL实例的子语句,然后把子语句分发到对应的MySQL实例上执行
- 最后,接收来自各个MySQL实例的SQL语句执行结果,合并得到最终结果
资源管理
- UMP系统采用资源池机制来管理数据库服务器上的CPU、内存、磁盘等计算资源,所有的计算资源都放在资源池内进行统一分配,资源池是为MySQL实例分配资源的基本单位
- 整个集群中的所有服务器会根据其机型、所在机房等因素被划分多个资源池,每台服务器会被加入到相应的资源池中
- 对于每个具体MySQL实例,管理员会根据应用部署在哪些机房、需要哪些计算资源等因素,为该MySQL实例具体指定主库和从库所在的资源池,然后,系统的实例管理服务会本着负载均衡的原则,从资源池中选择负载较轻的服务器来创建MySQL实例