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 │ 0 │ 0 │ server1 │
├────────────────────┼────────────────┼─────────────┼───────────────────┼─────────┤
│ Read-Only-Service │ readconnroute │ 0 │ 0 │ server1 │
└────────────────────┴────────────────┴─────────────┴───────────────────┴─────────┘
[root@YZ-10-222-53-190 etc]# maxctrl list servers
┌─────────┬─────────┬──────┬─────────────┬─────────────────┬──────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │
├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────┤
│ server1 │ node01 │ 3306 │ 0 │ 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 │ 3306 │ 1 │ Master, Running │ │
├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────┤
│ server2 │ node02 │ 3306 │ 1 │ 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跨库分片的限制的主要内容,如果未能解决你的问题,请参考以下文章