OneProxy :: 根据数据库端”Read Only”参数自动调整节点类型,简化主从切换!

OneProxy中间件中,后端的MySQL可以分为主节点(Master)和从节点(Slave)两种类型,以进行读写流量的灵活调配,以构建与应用无关的高可用和容量扩展方案。但在后端数据库进行维护或意外切换(比如采用MHA方案)时,后端数据库的类型会发生变化,如果中间件上相应的类型没有做调整,将导致流量分配的失效。在此前的版本中可以编写脚本通过管理端口来调整节点类型,然后在切换系统(比如MHA)中调用此脚本进行自动化处理,虽然可行但还是觉得有些麻烦,有没有更简单的机制?

在研究了多种现有的主备切换机制后,发现它们都充分利用了“read_only”参数来控制后端的读写策略,只要OneProxy能够感知此参数值的变化而进行类型的自动调整,就可以让OneProxy自动适应现有的多种自动切换机制,无需编写额外的脚本,从而达到中间件更彻底的无状态化。并可以和MHA这样的自动化切换程序彻底解耦,也省去了多Proxy布署时的状态不一致带来的风险,多个Proxy都根据后端MySQL的状态去调整自身节点的类型,可以达到多个OneProxy节点之间状态的一致性。

在OneProxy的启动参数文件中增加参数“proxy-auto-readonly”即可:

......
proxy-auto-readonly           = 1
......

也可以在管理端口中进行动态调整:

mysql> set AUTO_READONLY off;
Query OK, 0 rows affected (0.00 sec)

mysql> set AUTO_READONLY on;
Query OK, 0 rows affected (0.00 sec)

需要注意的是,“proxy-auto-readonly”为OneProxy实例级选项,对后端所有的MySQL实例生效,因此默认是不启用的,需要显式使用参数启用。在启用后,可以在数据库端更改“read_only”参数的值,然后观察OneProxy中节点类型的变化(通过“list backend”命令),OneProxy可以在几百毫秒内感知道到后端数据库状态的变化。

mysql> list backend \G
......
*************************** 2. row ***************************
    INDX: 2
 ADDRESS: 192.168.1.119:3306
    TYPE: RO
  STATUS: UP
  MARKUP: 1
REQUESTS: 14907203
   POWER: 1
   GROUP: server1
......
2 rows in set (0.00 sec)

在主备切换中,只要保证所有后端节点在同一时间点只有一个节点能设置“read_only”为“OFF”,就可以完成一次严格的主备考切换了,在OneProxy的配置文件中可以指定所有的节点类型都是从节点,而让OneProxy来自动检测和调整节点类型,并对应用的流量进行调节,监控系统就不再需要推送节点变更到应用层了。