(1)容灾
容灾分为两个过程:将宕机主库切换为备用从库&将恢复的主库重新上线。
UMP系统一般会为每个用户至少创建两个MySQL实例(主库、从库),ZooKeeper会负责维护它们。
当主库出现故障,便需要进行主从切换,过程如下:
ZoKeeper探测到主库故障,通知Controller服务器;
Controller首先修改“路由表”(用户名到后端SQL实例地址的映射关系)、然后将主库标记不可用;
然后通过消息中间件RabbitMQ通知所有Proxy服务器来修改“路由表”。
这时从库已成功切换为现主库,原宕机的主库需要进行恢复处理。
当主库已恢复好,便需要重新上线,过程如下:
首先将从库的更新复制给自己;
当主库的状态即将达到与从库一致时,Controller服务器会禁止从库继续更新,使其进入不可写状态;
等主库更新到与从库完全一致时,Controller发起主从切换操作(与上一次切换一样),且在路由表中将主库标记为可用;
通知Proxy服务器把用户写操作切回主库,使其继续执行,然后将从库修改为可写状态。
(2)读写分离
为了实现负载均衡,可以充分利用主从库实现用户读写操作的分离:
负责向用户提供访问MySQL数据库服务的Proxy服务器可以对用户发起的SQL语句进行解析,如果属于写操作,就发送到主库,如果是读操作,就均衡地发送到主库和从库。
(3)分库分表
采用分库分表时,系统处理用户查询的过程如下:
首先,Proxy服务器解析用户发起的SQL语句,提取出必要的信息选择重写或分发;
其次,对SQL语句进行重写,得到多个针对相应MySQL实例的子语句,将子语句分发到对应的MySQL实例上执行;
最后,接收来自各个MySQL实例的SQL语句执行结果,合并并返回结果。
(4)资源管理
UMP系统采用资源池机制来管理数据库服务器上的CPU、内存、磁盘等计算资源,所有的计算资源都放在资源池内进行统一分配。
整个集群中的所有服务器会根据其机型、所在机房等因素被划分多个资源池,每台服务器会被加入到相应的资源池中;
对于每个具体MySQL实例,管理员会根据应用部署在哪些机房、需要哪些计算资源等因素,为该MySQL实例具体指定主库和从库所在的资源池,然后,系统的实例管理服务会本着负载均衡的原则,从资源池中选择负载较轻的服务器来创建MySQL实例。
(5)资源调度
UMP系统中有三种规格的用户,分别是数据量和流量比较小的用户、中等规模用户以及需要分库分表的用户。
•多个小规模用户可以共享同一个MySQL实例
•对于中等规模的用户,每个用户独占一个MySQL实例
•对于分库分表的用户,会占有多个独立的MySQL实例
(6)资源隔离
UMP有两种资源隔离方式:
一种是用Cgroup限制MySQL进程资源,它适用于多个MySQL实例共享一台物理机的情况;
一种是在Proxy服务器端限制QPS,它适用于多个用户共享同一个MySQL实例的情况。