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