PolarDB MySQL版多主集群(库表)实现从一写多读架构到多写多读架构的升级;支持不同数据库在不同计算节点并发写入;支持数据库跨节点动态调度,秒级完成切换,极大提升实例整体并发读写能力。本文介绍多主集群(库表)的使用说明。
前提条件
使用限制
每个数据库的数据只能通过一个节点写入。没有分配数据库的节点,不能进行读写操作。
不支持跨RW节点的数据查询。如果一个查询SQL中包含多个RW节点上的数据库,系统则会报错。建议您先把所有数据库的访问点调整到其中一个RW节点上,再进行查询操作。
仅提供集群地址,不支持主地址。
创建数据库时指定RW节点
在指定的RW节点上创建数据库。语法结构如下:
CREATE DATABASE name [POLARDB_WRITE_NODE master_id];
每个数据库的数据只能通过一个节点写入。没有分配数据库的节点,不能进行读写操作。
如果上述语法中省略了
[POLARDB_WRITE_NODE master_id]
,那么创建数据库时就会参考loose_innodb_mm_default_master_id参数的值来指定创建数据库的RW节点。如果loose_innodb_mm_default_master_id参数的值为0,系统则随机指定一个RW节点来创建数据库。
示例:在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_lock
、mysql
为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_lock
、mysql
为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的源端和目的端,来进行数据的单向或双向同步。
- 本页导读 (0)