OneProxy :: 为PXC / Group Replication集群增加按用户名哈希的路由策略

在当前的MySQL对等集群机制(例如Percona XtraDB Cluster或MySQL Group Replication)下,解决事务冲突的效率都是不够的,不能随便将流量任意转发到每一个节点,而需要最大化地按业务来进行划分。OneProxy已经为PXC/MGR定制了按分片路由的策略,即使用OneProxy做分表的情况下,同一个分片的所有操作都会路由到相对固定的一个结点位置,在这里不同分片之间是不会有事务冲突(OneProxy还没有启用分布式事务支持)的,就可以更好地支持无冲突的多节点写入策略,并且这个路由策略对应用程序是透明的。当集群的一个节点的状态发生变化时,才会重新为每个分片寻找新的结点位置,可以充分利用对等集群做到无缝的故障切换,实现真正的MySQL高可用。每一个分片有一个相对固定的MySQL节点,也可以保证机器的内存和CPU资源不受其他分片的影响,如下图所示:

oneproxy_shard_load_balance

除了按分片外,一个数据库上往往会有多个用户来代表不同业务的数据,因此按用户名进行路由,对PXC/MGR集群来说也是非常实用的路由策略,不同的用户享有不同集群节点的所有资源,可以做到充分的资源隔离,一旦集群结点的状态发生变化,也可以快速切换到其他的可用节点上。设计这一路由策略来源于Oracle RAC的最佳使用经验,在大量小事务的OLTP环境下,最好能将Oracle RAC的每个实例都用成单机(与其他结点无数据交换)模式,而Oracle RAC仅仅发挥快速切换的作用。OneProxy根据用户的配置顺序,给每个不同一用户一个唯一的内部用户编号,进行路由时的哈希值则等于用户编号,可以保证不同的用户会路由到不同的集群结点上。如下图所示:

oneproxy_groupreplication_user_route

在上图中,如果集群中有5个用户可以登录,则每个用户将依配置顺序,分别使用5个MGR的结点;当一个结点不可用时,第1和第5个用户将会路由到第1个集群节点,OneProxy会在秒级完成切换,让应用无感知。平民软件的OneProxy for Oracle/SQL Server也可以实现按用户名路由的策略,以实现Oracle/SQL Server上的不同用户使用不同集群结点的路由策略,此路由模式会适合很大一部份企业用户的业务场景。