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跨库分片的限制相关推荐

  1. 微服务架构下,解决数据库跨库查询的一些思路

    开局先总结一下:现在很多厂都进行了微服务的开发模式,但是呢,业务的拆分的时候如果存在交叉是一件非常头大的事情,所以大家写微服务尽量不要交叉的写,比如新增用户如果已经存在在userservice里面了那 ...

  2. 微服务跨数据库联合查询_微服务架构下,解决数据库跨库查询的一些思路

    加关注,不迷路! 前言 在服务做微服务改造后,原先单库join查询已经不能满足要求,每个拆分的微服务对应一个数据库实例,而且部署在不同的服务器上,那么解决"跨库查询"就势在必行了. ...

  3. lumen mysql 事务_简单几部搞定laravel/lumen跨库操作

    1.跨库数据库配置 在网站跟目录下的config文件中增加database.php作为数据库配置文件.配置如下: //当前默认数据库'mysql' => [ 'driver' => 'my ...

  4. MySQL 跨库分页/ 分表分页/ 跨库分页,为什么这么难?

    来源:https://www.cnblogs.com/yjmyzz/p/12149737.html 当业务数据达到一定量级(比如:mysql单表记录量>1千万)后,通常会考虑"分库分表 ...

  5. EF跨库查询,DataBaseFirst下的解决方案

    EF跨库查询,DataBaseFirst下的解决方案 参考文章: (1)EF跨库查询,DataBaseFirst下的解决方案 (2)https://www.cnblogs.com/zyug/p/586 ...

  6. Oracle 跨库 查询 复制表数据

    在目前绝大部分数据库有分布式查询的需要.下面简单的介绍如何在oracle中配置实现跨库访问. 比如现在有2个数据库服务器,安装了2个数据库.数据库server A和B.现在来实现在A库中访问B的数据库 ...

  7. 如何玩转跨库Join?跨数据库实例查询应用实践

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

  8. oracle 将查询出的数据加1-10_PostgreSQL数据库跨库访问

    跨库访问常用的三种方式:schema,dblink,postgres_fdw 第一种:schema(架构方式) 其实还是在一个数据库中,只不过把不同数据保存在不同的架构中,创建与public并行的架构 ...

  9. 炸!业界难题,跨库分页的几种常见方案

    为什么需要研究跨库分页? 互联网很多业务都有分页拉取数据的需求,例如: (1)微信消息过多时,拉取第N页消息: (2)京东下单过多时,拉取第N页订单: (3)浏览58同城,查看第N页帖子: 这些业务场 ...

  10. mysql ef 分布式事务_分布式事务系列--分布式跨库查询解决方案 mysql federated引擎的使用...

    背景 在服务高度拆分,数据库不断细化切分的情况下,我们经常有连接多台数据库查询的需求,如果不断的把数据库连接的逻辑添加在代码中,那么这种耦合会越来越严重,这会给程序的拓展和维护带来很大的麻烦. mys ...

最新文章

  1. 简单介绍实体类或对象序列化时,忽略为空属性的操作
  2. 格雷码编码+解码+实现(Python)
  3. Python的库和资源
  4. 百度地图API公交检索示例 - 标绘结果路线、返回结果集
  5. centos vim 安装插件本质研究
  6. Object Detection(目标检测神文)
  7. 部署负载均衡 Keepalived DR群集优化版(减少部署完成后的BUG)
  8. phpstorm 调试_PhpStorm中的多用户调试
  9. 命令不识别_互助问答138期:GMM命令代码中如何识别年份国家及异方差检验问题...
  10. 初学数模-MATLAB Quick Start! Part I
  11. VMware下ubuntu全屏显示
  12. 人件札记:软件开发的管理思想
  13. DM数据库归档备份还原
  14. Lisp编制的坡度标注_形位公差自动标注的ATUOLISP程序设计(Ⅰ)
  15. 【菜单式爬虫】八爪鱼爬虫笔记
  16. 使用iTunes下载旧版本的IPA文件
  17. redis 附近的人_Redis怎么实现查找附近的人,请看特殊数据类型Geospatial
  18. 电脑上的日期从1980年到2099年
  19. 如何消除文法二义性、如何判断二义文法—编译原理
  20. c语言程序设计五子棋棋盘怎么画,五子棋的棋盘画不出来,求助!!

热门文章

  1. PLSQL下载与安装
  2. 免费好用的DiffMerge工具大总结
  3. 评分卡模型构建(含泪总结精华!!)
  4. 安卓问题-第三方相关
  5. 聚合支付备案最全机构名单及分析(截至22年1月7日)
  6. 使用ydui框架报错[Vue warn]: Invalid prop: custom validator check failed for prop color.
  7. 迪普科技负载均衡助力金关工程(二期)核心业务交付
  8. 0基础,如何快速学习自媒体,详细教程
  9. 动态矩阵控制(DMC)的简单理解及其示例
  10. java 泛型编程_java 泛型编程简介