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的库点表形式查询,但对代码有侵入性,对于简单的场景可以使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要安装MaxScale,您可以按照以下步骤进行操作: 1. 首先,确保您的系统满足最低要求。MaxScale支持Linux和Windows操作系统。您还需要安装MySQLMariaDB数据库,并具备root或管理员权限。 2. 下载MaxScale软件包。您可以从MaxScale官方网站(https://mariadb.com/downloads/#mariadb_platform-mariadb-maxscale)上下载适用于您操作系统的软件包。选择与您的操作系统和MySQL/MariaDB版本兼容的版本。 3. 安装MaxScale软件包。根据您的操作系统,执行相应的安装命令。例如,在Ubuntu上,您可以使用以下命令安装: ``` sudo dpkg -i maxscale-package.deb ``` 对于Windows,您可以运行MaxScale安装程序并按照提示进行安装。 4. 配置MaxScaleMaxScale的配置文件位于/etc/maxscale.cnf(Linux)或C:\ProgramData\MaxScale\maxscale.cnf(Windows)。使用文本编辑器打开该文件,并根据您的需求进行配置。配置文件中有详细的注释,可以帮助您了解每个配置选项的作用。 5. 启动MaxScale。根据您的操作系统,执行适当的命令来启动MaxScale。例如,在Ubuntu上,您可以使用以下命令启动: ``` sudo systemctl start maxscale ``` 在Windows上,您可以在服务管理器中找到并启动MaxScale服务。 6. 验证MaxScale是否正常运行。您可以使用以下命令检查MaxScale的状态: ``` sudo systemctl status maxscale ``` 如果MaxScale正在运行,并且没有错误或警告消息,那么它已成功安装和配置。 这是一个基本的安装过程概述,具体步骤可能因操作系统和版本而有所不同。请参考MaxScale的官方文档和相关资源,以获取更详细的安装和配置说明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值