OneProxy :: 定义后端数据库的服务能力指数,实现按权重分配SQL流量。

读写分离方案中,多个后端数据库之间采用了Round Lobbin的随机算法来进行流量平均分配,如果每个后端数据库的软硬件、网络环境基本一致,则会因平均分配而表现良好。但如果后端数据库的软硬件、网络环境不一致,绝对公平的流量分配将会影响整个系统的处理能力,需要进行适当地流量比重调整。比如后端数据库布署在同城不同的IDC之间,那网络环境就不是公平的,又比如在公有云上申请的RDS服务,可能因为机器所在的软硬件不同而表现了较大的差异性。

在OneProxy(需要从下载页面更新软件)中可以为每一个后端数据库定义一个能力指数(范围为1到5),越大的值表示能力越强,应当得到越多比例的流量分配。以CPU资源为例,假设所采购的机器使用不同的CPU内核个数(4、8、12个),则可以分别定议为1、2、3级能力;假设机器的CPU属于不同时间的产品,以Intel E5系列的第二代到第四代产品,可以分别定义成2、3、4级能力,从而以相对公平的比重来分配流量。

可以在OneProxy的“proxy-master-addresses”和“proxy-slave-addresses”选项中指定能力指数(参照OneProxy布署指南里对这两个选项的解释),现在对其做了一些扩展,在参数值后面添加“:能力指数”。

......
proxy-master-addresses.1    = host:port@group:power
proxy-slave-addresses.1     = host:port@group:power
......

假设是一主一备的环境,希望分担75%的读流量到备库,主库仍旧承担25%的流量,则可以通过指定能力指数来实现流量调节,指定主库的能力指数为1,指定备库的能力指数为3,即可实现要求。

......
proxy-master-addresses.1    = host:port@group:1
proxy-slave-addresses.1     = host:port@group:3
......

进一步考虑多个备库的情况,比如有一台备库的能力是另外两台的一倍,参数定义如下:

......
proxy-slave-addresses.1     = host:port@group:1
proxy-slave-addresses.2     = host:port@group:2
proxy-slave-addresses.3     = host:port@group:1
......

在三台备库全部活越的情况下,第一台和第三台会承担25的流量,第二台会承担50%的流量;当第二台备库不可用时,则第一台和第三台会各承担50%的流量;当第一台备库不可用时,第二台会承担66%的流量,而第三台会承担33%的流量,从而实现相对合理的比重调节。在管理端口中也有相应的命令可以动态调节能力指数,可以结合监控系统来进行实时的动态调节。

目前在MySQL中并无系统视图来反映主机的负载情况,因而在完全独立的中间件中,指定能力指数并留下动态调整的接口,将会是比较现实的方式。也许平民软件可以考虑编写一个专门为OneProxy服务的MySQL插件,以让中间件和后端数据库更好地协同工作。