PolarDB MySQL引擎多主架构集群版实现从一写多读架构到多写多读架构的升级;支持不同数据库在不同计算节点并发写入;支持数据库跨节点动态调度,秒级完成切换,极大提升实例整体并发读写能力。本文介绍多主架构集群版的使用说明。

前提条件

使用限制

  • 每个数据库的数据只能通过一个节点写入。没有分配数据库的节点,不能进行读写操作。
  • 不支持跨RW节点的数据查询。如果一个查询SQL中包含多个RW节点上的数据库,系统则会报错。建议您先把所有数据库的访问点调整到其中一个RW节点上,再进行查询操作。
  • 仅提供集群地址,不支持主地址。

创建数据库时指定RW节点

在指定的RW节点上创建数据库。语法结构如下:
CREATE DATABASE name [POLARDB_WRITE_NODE master_id];
说明 每个数据库的数据只能通过一个节点写入。没有分配数据库的节点,不能进行读写操作。
示例:在RW1上创建一个数据库db1
CREATE DATABASE db1 POLARDB_WRITE_NODE 1;
如果需要在RW2上创建数据库db1,把上述示例中的1换成2即可。

删除在指定RW节点上创建的数据库

删除在指定RW节点上创建的数据库。语法结构如下:
DROP DATABASE name;
示例:删除在RW1节点上创建的数据库db1
DROP DATABASE db1;
删除数据库时,无需指定POLARDB_WRITE_NODE。

RW节点切换

把数据库的访问点切换到其他RW节点上。语法结构如下:
ALTER DATABASE name POLARDB_WRITE_NODE master_id;
示例:把数据库db1切换到RW2上
ALTER DATABASE db1 POLARDB_WRITE_NODE 2;

指定SQL语句执行的RW节点

注意 该功能仅适用于非数据查询的语句,例如查询information_schema、查询status变量等。如果需要查询数据,例如查询语句SELECT * FROM table1,不需要指定RW节点,数据库代理会自动选择正确的RW节点执行查询。
如果需要把某条SQL语句发送到指定的RW节点,则需要执行以下SQL语句锁定某个RW节点:
ALTER SESSION POLARDB_WRITE_NODE master_id;
示例:查询RW1节点上innodb_buffer_pool_size这个变量的值
ALTER SESSION POLARDB_WRITE_NODE 1;   #把SQL语句发送到RW1节点。
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';  #查询RW1节点上innodb_buffer_pool_size的值。
说明 如果在执行某条SQL语句时不指定RW节点,那么数据库代理会随机选择一个RW节点执行该SQL语句。
执行以下命令可以解锁指定执行SQL语句的RW节点:
RESET SESSION POLARDB_WRITE_NODE;

查询节点信息

  • 执行以下命令可以查询某个RW节点上的数据库分布情况:
    ALTER SESSION POLARDB_WRITE_NODE master_id;
    SELECT * FROM INFORMATION_SCHEMA.INNODB_MASTER_GLOBAL_LOCK_INFO;
    示例:查询RW1节点上的数据库分布情况
    ALTER SESSION POLARDB_WRITE_NODE 1;
    SELECT * FROM INFORMATION_SCHEMA.INNODB_MASTER_GLOBAL_LOCK_INFO;
    查询结果如下:
    +-----------------------+---------------------+----------+--------------+-----------+-------------+
    | table_name            | table_id            | space_id | s_lock_count | lock_mode | current_lsn |
    +-----------------------+---------------------+----------+--------------+-----------+-------------+
    | mysql/global_ddl_lock | 1043956280258737140 |        0 |            0 | SLS_X     |    24311657 |
    | db2                   |   27980076883382651 |        0 |            0 | SLS_X     |    36087702 |
    | db1                   |   27980076883383418 |        0 |            0 | SLS_X     |    34339564 |
    | mysql                 | 3381631115268247737 |        0 |            0 | SLS_IX    |           0 |
    +-----------------------+---------------------+----------+--------------+-----------+-------------+
    4 rows in set (0.00 sec)
    上述查询结果中的每一行就是一个数据库的信息(虽然列名是table_name)。其中,mysql/global_ddl_lockmysql为MySQL内部使用的数据库,并非用户创建的数据库。
  • 执行以下命令可以查询整个集群上所有数据库的分布情况:
    说明 仅支持通过高权限账号查询,不能通过用户新建的账号进行查询。
    SELECT * FROM INFORMATION_SCHEMA.INNODB_CC_GLOBAL_LOCK_INFO;
    查询结果如下:
    +-----------+-----------------------+---------------------+-----------+-------------+
    | master_id | table_name            | table_id            | lock_mode | current_lsn |
    +-----------+-----------------------+---------------------+-----------+-------------+
    |         2 | db5                   |   27980076883382398 | SLS_X     |    18866566 |
    |         1 | mysql/global_ddl_lock | 1043956280258737140 | SLS_X     |    24311657 |
    |         1 | db1                   |   27980076883383418 | SLS_X     |    34339564 |
    |         1 | db2                   |   27980076883382651 | SLS_X     |    36087702 |
    |         2 | db4                   |   27980076883383165 | SLS_X     |    18855954 |
    |         1 | mysql                 | 3381631115268247737 | SLS_IX    |           0 |
    +-----------+-----------------------+---------------------+-----------+-------------+
    6 rows in set (0.00 sec)
    上述查询结果中的每一行就是一个数据库的信息(虽然列名是table_name),表示这个数据库是在对应的RW节点(master_id)下操作的。其中,mysql/global_ddl_lockmysql为MySQL内部使用的数据库,并非用户创建的数据库。

查询数据库的元信息

执行以下命令可以查询所有RW节点上的表信息:
SELECT * FROM INFORMATION_SCHEMA.TABLES;
执行以下命令可以查询当前执行SQL查询的RW节点信息:
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES;

如何设置Binlog

多主架构集群版100%兼容MySQL的Binlog,它整合集群中所有RW节点上的操作日志,产生出全局统一、逻辑有序的Binlog日志。

您可以通过loose_polar_log_bin来开启多主架构集群版的Binlog功能,通过binlog_expire_logs_seconds来设置多主架构集群版Binlog的保存时长。详细信息请参见开启Binlog

说明 多主架构集群版暂不支持GTID(Global Transaction Identifier)。多主架构集群版可以作为数据传输服务DTS的源端和目的端,来进行数据的单向或双向同步。