OneProxy :: 改进多集群架构支持,增强Navicat/SQLlog等图形工具兼容性。

一个OneProxy在分库分表(Sharding)的情况下,后端可以挂多个主备集群,每一套主备会被虚拟成OneProxy的一个数据库,以便于OneProxy适配MySQL多数据库的架构。下面是一个多集群的配置,每个Master数据库都分配一个不同的集群名字。

# format host:port@groupname
proxy-master-addresses.1 = 192.168.1.119:3306@server1
proxy-master-addresses.2 = 192.168.1.120:3306@server2

登录OneProxy执行“show databases”命令,将不会显示后端真实的数据库列表,而是显示所有的集群名字,如下所示(MySQL结点上并不存在名为“server1”和“server2”的数据库):

mysql> show databases;
+----------+
| Database |
+----------+
| server1  |
| server2  |
+----------+
2 rows in set (0.01 sec)

当用户使用命令行工具,特别是使用图形工具时,按照MySQL的习惯会在表名前面加上数据库的名字。当连接OneProxy时,集群的名字就会被写在自动生成的SQL语句中,当集群的名字与数据库的名字不同时,就会报权限错误。在OneProxy 6.0.0版本之前,并不支持SQL中集群名字的处理,从而使Navicat/SQLlog等图形工具无法顺利操作OneProxy。在OneProxy 6.0.0中,已经可以支持SQL中引用集群名字,将集群名字当成表所在的数据库的名字,并且建议集群名字最好不同于任何一个真实数据库的名字。例如:

mysql> desc t_binlog;
ERROR 1146 (42S02): Table 'test.t_binlog' doesn't exist
mysql> desc server2.t_binlog;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
| col2  | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

这样Navicat/SQLlog等图形工具发送的SQL,就可以准确地被OneProxy处理(少数命令仍未支持),就如同真实连接到一个MySQL实例一样。例如使用SQLlog来进行操作:

oneproxy_sqllog_support

也可以使用Navicat来进行操作,当OneProxy后端只接一套主备集群时,则完全显示后端数据库的真实名字,完全兼容所有图形工具。OneProxy 6.0.0版本中还有一些其他的重大改进,大大提升了应用SQL编写的透明性。