maxscale跨库分片的限制

Posted 境悟初

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maxscale跨库分片的限制相关的知识,希望对你有一定的参考价值。

maxscale

MariaDB出品的数据库代理,附带防火墙和查询路由功能。不过今天就是为了说他那简陋的查询路由和分片功能。

文档:https://github.com/mariadb-corporation/MaxScale/wiki

安装与使用

参考官方文档: https://mariadb.com/kb/en/mariadb-maxscale-6-mariadb-maxscale-installation-guide/

yum install maxscale-6.1.4-1.rhel.7.x86_64.rpm

初步配置

https://mariadb.com/kb/en/mariadb-maxscale-6-setting-up-mariadb-maxscale/

修改 /etc/maxscale.cnf配置文件,主要改里面的mysql信息和用户名密码。

然后起服务:systemctl start maxscale

查看下当前服务

[root@YZ-10-222-53-190 etc]# maxctrl list services
┌────────────────────┬────────────────┬─────────────┬───────────────────┬─────────┐
│ Service            │ Router         │ Connections │ Total Connections │ Servers │
├────────────────────┼────────────────┼─────────────┼───────────────────┼─────────┤
│ Read-Write-Service │ readwritesplit │ 00                 │ server1 │
├────────────────────┼────────────────┼─────────────┼───────────────────┼─────────┤
│ Read-Only-Service  │ readconnroute  │ 00                 │ server1 │
└────────────────────┴────────────────┴─────────────┴───────────────────┴─────────┘
[root@YZ-10-222-53-190 etc]# maxctrl list servers
┌─────────┬─────────┬──────┬─────────────┬─────────────────┬──────┐
│ Server  │ Address │ Port │ Connections │ State           │ GTID │
├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────┤
│ server1 │ node01  │ 33060           │ Master, Running │      │
└─────────┴─────────┴──────┴─────────────┴─────────────────┴──────┘
[root@YZ-10-222-53-190 etc]# maxctrl list listeners 
┌─────────────────────┬──────┬──────┬─────────┬────────────────────┐
│ Name                │ Port │ Host │ State   │ Service            │
├─────────────────────┼──────┼──────┼─────────┼────────────────────┤
│ Read-Write-Listener │ 4006 │ ::   │ Running │ Read-Write-Service │
├─────────────────────┼──────┼──────┼─────────┼────────────────────┤
│ Read-Only-Listener  │ 4008 │ ::   │ Running │ Read-Only-Service  │
└─────────────────────┴──────┴──────┴─────────┴────────────────────┘

如果有错误,查看日志:/var/log/maxscale

简单使用

maxscale是个代理,使用和mysql一样,那端口是多少呢,见配置文件里:

[Read-Only-Listener]
type=listener
service=Read-Only-Service
protocol=MariaDBClient
port=4008

[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006

可以看到只读端口为4008,读写端口为4006.

mysql -h ip -P4006 -uroot -p

基本分片使用

文档:shemaRouter, example
.
maxscale里主要配置3种东西:路由器,监听器,监控器。

创建2个库:

create database db01;
create database db02;

每个库下都建user表

CREATE TABLE IF NOT EXISTS t_user
(
    user_id            INT NOT NULL AUTO_INCREMENT,
    user_name          VARCHAR(200),
    pwd                VARCHAR(200),
    PRIMARY KEY (user_id)
);

maxscale的配置:

[Shard-Router-Service]
type=service
router=schemarouter
servers=server1
user=xxx
password=xxxx

[Sharded-Service-Listener]
type=listener
service=Shard-Router-Service
protocol=MariaDBClient
port=4000

监听4000端口来支持分片查询。

我们可以用mysql客户端连接:

$ mysql -h IP -P4000 -uxxx -p

然后使用 show shards 语句可以查看分片情况:

mysql> show shards;
+-----------------------------------------------------------------------+---------+
| Database                                                              | Server  |
+-----------------------------------------------------------------------+---------+
| performance_schema.file_summary_by_event_name                         | server1 |
| performance_schema.file_summary_by_instance                           | server1 |
...
| db02.t_user                                                           | server1 |
| db01.t_user                                                           | server1 |

分片进一步使用

使用2个节点来配置,验证其跨库路由的局限。

分片的限制

  • 跨库查询支持得不好
  • 仅支持到库表级别过滤,不能更细粒度分片

分片配置

[server1]
type=server
address=node01
port=3306
protocol=MariaDBBackend

[server2]
type=server
address=node02
port=3306
protocol=MariaDBBackend

[Shard-Router-Service]
type=service
router=schemarouter
servers=server1,server2
user=root
password=xxxxxxx
enable_root_user=1
ignore_tables_regex=.*

[Sharded-Service-Listener]
type=listener
service=Shard-Router-Service
protocol=MariaDBClient
port=4000

server

# maxctrl list servers
┌─────────┬─────────┬──────┬─────────────┬─────────────────┬──────┐
│ Server  │ Address │ Port │ Connections │ State           │ GTID │
├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────┤
│ server1 │ node01  │ 33061           │ Master, Running │      │
├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────┤
│ server2 │ node02  │ 33061           │ Running         │      │
└─────────┴─────────┴──────┴─────────────┴─────────────────┴──────┘

一些错误处理

Access denied for user ‘root’@’::ffff:127.0.0.1’ (using password: YES)

使用root登录时报错,虽然再三确认过密码。

# mysql -h 127.0.0.1  -P4000 -uroot -pxxxxxxx
ERROR 1045 (28000): Access denied for user 'root'@'::ffff:127.0.0.1' (using password: YES)

原因是root用户默认是禁用的,需要手动开启。

enable_root_user=1

duplicate tables found on two different shards

复现

MySQL [(none)]> show shards;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: *** NONE ***

ERROR 5000 (DUPDB): Error: duplicate tables found on two different shards.

日志里也有相应的重复表:

2021-11-16 18:12:36   error  : (3) [schemarouter] (Shard-Router-Service); Duplicate tables found, closing session.
2021-11-16 18:13:00   error  : (4) [schemarouter] (Shard-Router-Service); 'oltp_test_db.sbtest1' found on servers 'server1' and 'server2' for user 'root'@'::ffff:127.0.0.1'.
2021-11-16 18:13:00   error  : (4) [schemarouter] (Shard-Router-Service); 'oltp_test_db.sbtest2' found on servers 'server1' and 'server2' for user 'root'@'::ffff:127.0.0.1'.
2021-11-16 18:13:00   error  : (4) [schemarouter] (Shard-Router-Service); 'sys.host_summary' found on servers 'server1' and 'server2' for user 'root'@'::ffff:127.0.0.1'.
2021-11-16 18:13:00   error  : (4) [schemarouter] (Shard-Router-Service); 'sys.host_summary_by_file_io' found on servers 'server1' and 'server2' for user 'root'@'::ffff:127.0.0.1'.
2021-11-16 18:13:00   error  : (4) [schemarouter] (Shard-Router-Service); 'sys.host_summary_by_file_io_type' found on servers 'server1' and 'server2' for user 'root'@'::ffff:127.0.0.1'.
2021-11-16 18:13:00   error  : (4) [schemarouter] (Shard-Router-Service); 'sys.host_summary_by_stages' found on servers 'server1' and 'server2' for user 'root'@'::ffff:127.0.0.1'.
2021-11-16 18:13:00   error  : (4) [schemarouter] (Shard-Router-Service); 'sys.host_summary_by_statement_latency' found on servers 'server1' and 'server2' for user 'root'@'::ffff:127.0.0.1

这是由于多个节点上有同样的库表,导致分片出错。

可以通过配置忽略:https://github.com/mariadb-corporation/MaxScale/blob/6.1/Documentation/Routers/SchemaRouter.md

ignore_tables_regex=.*

测试跨库的问题

在2个server都建一个sbtestdb库,一个server建a表,一个建b表。

当我们use sbtestdb后,只会连接一个server,除非使用db.table的查询方式。

MySQL [sbtestdb]> select * from sbtestdb.b;
Empty set (0.00 sec)

MySQL [sbtestdb]> select * from sbtestdb.a;
Empty set (0.00 sec)

MySQL [sbtestdb]> select * from a;
Empty set (0.00 sec)

MySQL [sbtestdb]> select * from b;
ERROR 1046 (3D000): No database selected

解决方案

  • 业务应用需要使用select * from db.table的库点表形式查询,但对代码有侵入性,对于简单的场景可以使用。

以上是关于maxscale跨库分片的限制的主要内容,如果未能解决你的问题,请参考以下文章

读书笔记-Mycat权威指南-10-分片规则

Mycat 分片规则

Maxscale 功能简单介绍

connection Killed by maxscale

connection Killed by maxscale

分库分表如何解决跨库查询等难点