数据库中间件Mycat

Mycat是基于Java编写的实现了MySQL协议的数据库中间件,可以将它看成一个数据库代理,可以直接用MySQL客户端工具访问。其核心功能是分库分表和读写分离。

MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得 Mycat 变得非常的强大。

官网 http://www.mycat.org.cn/
在这里插入图片描述

1.1 Mycat作用

1.1.1 数据分片

数据分片包括里:垂直分片和水平分片,垂直分片包括:垂直分库和垂直分表,水平分片包括: 水平分库和水平分表。

1)垂直分库
  • 数据库中不同的表对应着不同的业务,垂直切分是指按照业务的不同将表进行分类,分布到不同的数据库上面
  • 将数据库部署在不同服务器上,从而达到多个服务器共同分摊压力的效果

在这里插入图片描述

2) 垂直分表

表中字段太多且包含大字段的时候,在查询时对数据库的IO、内存会受到影响,同时更新数据时,产生的binlog文件会很大,MySQL在主从同步时也会有延迟的风险。

  • 将一个表按照热字段(访问频繁)、大字段和其他字段分开,存储热字段的表更新频繁,存储冷字段或者大字段的表反问频率低,可以分散压力。

比如下面的商品表,我们把大字段商品详情字段提取出来,单独放在一张表

在这里插入图片描述

垂直拆分带来优缺点:

  • 解决业务层面的耦合,业务清晰
  • 能对不同业务的数据进行分级管理、维护、监控、扩展等
  • 高并发场景下,垂直分库一定程度的提高访问性能
  • 垂直拆分没有彻底解决单表数据量过大的问题
3)水平分库

没有单独的水平分库,水平分库就是水平分库分表,将单张表的数据切分到多个服务器上去,每个服务器具有相同的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈.

如下图,将商城商品表分到两个数据库服务器中
在这里插入图片描述

4) 水平分表

将一个张的数据分表不同的表中,但是这些表还在同一个库,解决的单表数据过大的问题,可以加快单表数据查询,新增压力。但是没有解决单库的数据和并发瓶颈。
在这里插入图片描述

总结

  • 垂直分库: 根据不同业务的数据,分别存放在不同的数据库服务器(实例)中。
  • 垂直分表: 将一个表按照字段分成多表,每个表存储其中一部分字段。
  • 水平分库: 把一张表的数据按照一定规则,分配到不同的库,每一个库只有这张表的部分数据,这些库可以在一个服务器也可以在多个服务器。
  • 水平分表: 把一张表的数据按照一定规则,分配到同一个数据库的多张表中,每个表只有原表的部分数据.

1.2.2 读写分离

主库负责处理事务性的写(增删改)操作,从库负责处理读(查询)操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

但是读写分离也会带来一些问题,参考 读写分离

1.2.3 多数据源整合

Mycat可以整合多数据源

在这里插入图片描述

1.3 Mycat与ShardingJDBC的区别

  1. mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包
  2. 使用mycat时不需要修改代码,而使用sharding-jdbc时会和代码耦合
  3. Mycat 是基于 Proxy,它复写了 MySQL 协议,需要独立部署服务,需要运维团队维护,而 Sharding-JDBC 是基于 JDBC 的扩展,是以 jar 包的形式提供轻量级服务的。
  • Mycat(proxy中间件层)

在这里插入图片描述

  • Sharding-jdbc应用层
    在这里插入图片描述

1.4 Mycat2新特性

新特性总结

  • 多语句,指的是可以批量执行建表语句
  • 支持blob,blob二进制大对象
  • 全局二级索引,用全局二级索引后,能有效减少全表扫描,对于减少连接使用,减少计算节点与存储节点的数据传输有帮助.
  • 支持任意跨库跨表join查询
  • 支持跨库跨表的关联子查询
  • 支持分库同时分表,把分库分表合一,统一规划
  • 存储过程: 存储过程支持多结果集返回、支持接收affectRow
  • 支持逻辑视图
  • 支持批量插入: 支持rewriteInsertBatchedStatementBatch参数(设置为true),用于提高批量插入性能。
  • 支持执行计划管理:Mycat2的执行计划管理主要作用是管理执行计划,加快SQL到执行计划的转换。
  • 路由注释,Mycat2对于路由注释的支持更加快捷方便,减少繁琐的配置
  • 自动hash分片算法: 由1.6版本的手动配置算法,到2.0的自动hash分
  • 支持第三方工具
  • 单表映射物理表,可以直接将单表映射到物理表,更快速的创建数据库表
  • XA事务,首先数据库要支持XA事务
  • 支持MySQL8

1.5 Mycat2 核心概念

  • 逻辑库
    • 对数据进行分片之后,从原来的与一个库,被切分为了多个分片数据库,所有的分片数据库构成了整个完整的数据库存储。Mycat在操作时,使用逻辑库代表整个完整的数据库集群,方便对于整个集群进行操作。
  • 物理库
    • MySQL中真实存在的数据库
  • 物理表
    • MySQL中真实存在的表
  • 分片键
    • 用于分片的数据库字段,是将数据库进行水平拆分的关键字段
    • 例:将订单表的订单主键设置为分片键,根据订单主键进行取模分片。
  • 物理分表
    • 指的是已经进行数据拆分的,在数据库上面的物理表,是分片表的一个分区,多个物理分表中的数据汇总起来就是逻辑表的全部数据。
  • 物理分库
    • 一般是指包含多个分表的库,数据切分之后每一个大表被分不到不同的数据库上面,每个表分片所在的数据库就是物理分库。
  • 单表
    • 没有分片,没有数据冗余的表
  • 全局表
    • 变动不频繁
    • 数据总量变化不大
    • 经常被用来进行关联查询
    • 全局表不分表,在所有的库中都有一份复制,都有全量数据。在每个数据库中都有这样一张或几张全局表。比如说: 地址表 、字典表 这一类都是属于全局表
  • ER表
    • Mycat提出了基于E-R关系的数据分片策略,子表的记录与所有关联的父表的记录存放在同一个数据分片上,子表依赖于父表,通过表分组保证 数据的join不会跨库。
  • 原型库
    • 原型库是Mycat2后面的数据库,MySQL

1.6 Mycat核心配置

1.6.1 用户配置

1)配置用户相关信息的目录在: mycat/conf/users

2)命名方式:{用户名}.user.json

3)配置内容如下:

{
        "dialect":"mysql",
        "ip":null,
        "password":"123456",
        "transactionType":"xa",
        "username":"root"
}

字段含义
ip:客户端访问ip,建议为空,填写后会对客户端的ip进行限制
username:用户名
password:密码
isolation:设置初始化的事务隔离级别
    READ_UNCOMMITTED :1
    READ_COMMITTED :2
    REPEATED_READ:3,默认
    SERIALIZABLE:4

tractionType:事务类型,可选值, 可以通过语句实现切换
    set transaction policy ='xa'
    set transaction.policy ='proxy'

proxy 表示本地事务,在涉及大于1个数据库的事务, commit阶段失败会导致不一致,但是兼容性最好xa事务,需要确认存储节点集群类型是否支持XA.

1.6.2 数据源配置

配置Mycat连接的数据源信息1)所在目录 mycat/conf/datasources2)命名方式 {数据源名字} . datasource.json3)配置内容如下:

{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"123456",
        "type":"JDBC",
        "url":"jdbc:mysql://192.168.58.100:3310/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"mycat",
        "weight":0
}

字段含义
    dbType:数据库类型,mysql
    name:用户名
    password:密码
    type:数据源类型,默认JDBC
    url:访问数据库地址
    idleTimeout:空闲连接超时时间 
    initSqls:初始化sql
    initSqlsGetConnection:对于jdbc每次获取连接是否都执行initSqls
    nstanceType:配置实例只读还是读写, 可选值:READ_WRITE,READ,WRITE
    weight:负载均衡权重

连接相关配置
    "maxCon": 100,
    "maxConnectTimeout" : 3000,
    "RetryCount" : 5,
    "minCon": 1,

1.6.3 集群配置

1)配置集群信息,所在目录 mycat/conf/clusters

2)命名方式:{集群名字} . cluster.json

3)配置内容如下:

{
        "clusterType":"MASTER_SLAVE",   //主从集群
        "heartbeat":{                      //心跳检查
                "heartbeatTimeout":1000,
                "maxRetry":3,
                "minSwitchTimeInterval":300,
                "slaveThreshold":0
        },
        "masters":[
                "prototypeDs"    //主节点
        ],
        "maxCon":200,
        "name":"prototype",
        "readBalanceType":"BALANCE_ALL",   //负载均衡策略
        "switchType":"SWITCH"     //表示进行主从切换
}

字段含义
clusterType:集群类型,可选值:
    SINGLE_NODE:单一节点
    MASTER_SLAVE:普通主从
    JSTER:garela- cluster/PXC 集群
    MHA: MHA集群
    MGR: MGR集群

readBalanceType:查询负载均衡策略,可选值:
    BALANCE_ALL(默认值),获取集群中所有数据源
    BALANCE_ALL_READ,获取集群中允许读的数据源
    BALANCE_READ_WRITE,获取集群中允许读写的数据源,但允许读的数据源优先
    BALANCE_NONE,获取集群中允许写数据源,即主节点中选择

switchType:切换类型

1.6.4 逻辑库表

1)配置逻辑库表,实现分库分表,所在目录 mycat/conf/schemas2)命名方式 {库名} . schema.json3)配置内容如下:

vim mysql.schema.json

{
    "customTables":{},
    "globalTables":{},       //全局表配置
    "normalProcedures":{},
    "normalTables":{   // MySQL中真实表信息
        "users":{
      //建表语句
            "createTableSQL":"CREATE TABLE user_db.users (\n\tid INT(11) PRIMARY KEY AUTO_INCREMENT,\n\tNAME VARCHAR(20) DEFAULT NULL,\n\tage INT(11) DEFAULT NULL\n)",
            "locality":{
                "schemaName":"user_db",  //物理库
                "tableName":"users",     //物理表
                "targetName":"prototype" //指向集群或者数据源
            }
        }
    },
    "schemaName":"user_db",   
    "shardingTables":{}, //分片表配置
    "views":{}
}

//详细分库分表配置,后面的内容会有讲解

注意:配置的schema的逻辑库逻辑表必须在原型库(prototype)中有对应的物理库物理表,否则不能启动

总结

分库分表解决三个问题:

  • 单库承载并发限制(一般是2-3k)
  • 单库表数据量过大引起的查询性能问题
  • 单库存储数据的限制

但是分库分表完美的解决了这些问题吗?

  • 每个节点分一部分数据,各个节点的数据都是唯一的,如果一个节点宕机,那么这部分数据不可用,服务收到影响
  • 数据分散到多个节点上,如果数据热度不一致,访问量在不同节点无法平均怎么办?
  • 如果分库方案不合理导致数据没有平均的分散到各个节点上怎么办?
  • 随着数据增加原来的分库分表方案不能满足需求需要扩展将会很麻烦,需要重新迁移数据
  • 分库分表后可能面临分布式ID、分布式事务的处理

上面这些问题都是分库分表带来的一些问题,最主要的一个问题就是单节点故障,数据只存在一个节点上,其他节点没有备份。如果讲数据分片,每个分片在不同节点都有副本,那么是不是可以解决这个问题。那么这就成了一个分布式数据库了,我们真正需要的是分布式数据库,才能解决上面所有的问题。参考https://blog.csdn.net/qq_36037795/article/details/142329972

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/883499.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA开源】基于Vue和SpringBoot的学科竞赛管理系统

本文项目编号 T 047 ,文末自助获取源码 \color{red}{T047,文末自助获取源码} T047,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【Java 集合】List接口 —— ArrayList 与 LinkedList 详解

List接口继承自Collection接口,是单列集合的一个重要分支。 在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引(类似于数组中的元素角标)来访问集合中的指定元素。另外&…

CSS清除浮动的多种方法

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 给浮动元素的祖先元素加高度 给 div 写一个 clear:both; 属性(margin 失效) clear:both; 隔墙法 clear:both; 内墙法 父级 div 定义伪类:after 和 zoom(推荐使用) overflow:hidden;(能够让 margin 生效) 非 …

九、成功版--windows上安装artifactory配置postgressql

centos上搞不定,windows上搞定了 现阶段是想用java写程序控制制品库,等以后研究多了需要写一些脚本的时候,在研究linux上安装artifactory(公司就用的linux安装的配置mysql,有空对着配一下linux的) 源码地…

文献管理不再难:20个Zotero插件帮你搞定

以下插件排序按照星标量进行排序,常用的插件大概是前20的样子,可以根据自己的需求进行插件的安装。 顺带提一句,插件不是越多越好,装多了可能会出现软件卡顿的情况。 1、Scholaread for Zotero 插件下载:插件下载 …

【智能大数据分析 | 实验一】MapReduce实验:单词计数

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…

阿里云云效多个ssh密钥对配置

实现功能 windows本地多个ssh密钥对,分别对应不同的阿里云账号的云效 实现办法 1.生成ssh密钥对 ssh-keygen -t rsa -f C:\xxx\id_rsa_customname(我这里C:\Users\admin\.ssh\id_rsa_customname) 2.配置.ssh目录的config文件 # ruiyi Host customnameHostName codeup.al…

java通过org.eclipse.milo实现OPCUA客户端进行连接和订阅

前言 之前写过一篇关于MQTT的方式进行物理访问的文章:SpringBoot集成MQTT,WebSocket返回前端信息_springboot mqtt websocket-CSDN博客 最近又接触到OPCUA协议,想通过java试试看能不能实现。 软件 在使用java实现之前,想着有没…

JVM 基础知识(基础组成 )

使用场景 线上系统突然宕机,系统无法访问,甚至直接 O0M;线上系统响应速度太慢,优化系统性能过程中发现 CPU 占用过高,原因也许是因为 JVM的 GC 次数过于频繁;新项目上线,需要设置 JVM的各种参数;等 JDK / JRE / JVM JDK JDK 全称 ( Java Development Kit ) ,是 Ja…

react + antDesign封装图片预览组件(支持多张图片)

需求场景:最近在开发后台系统时经常遇到图片预览问题,如果一个一个的引用antDesign的图片预览组件就有点繁琐了,于是在antDesign图片预览组件的基础上二次封装了一下,避免重复无用代码的出现 效果 公共预览组件代码 import React…

Llama 3.2来了,多模态且开源!AR眼镜黄仁勋首批体验,Quest 3S头显价格低到离谱

如果说 OpenAI 的 ChatGPT 拉开了「百模大战」的序幕,那 Meta 的 Ray-Ban Meta 智能眼镜无疑是触发「百镜大战」的导火索。自去年 9 月在 Meta Connect 2023 开发者大会上首次亮相,短短数月,Ray-Ban Meta 就突破百万销量,不仅让马…

xpath在爬虫中的应用、xpath插件的安装及使用

安装 1、打开谷歌浏览器进入扩展程序安装页面(右上角会有"开发者模式按钮")默认是关闭的,当安装此插件时需要把开发者模式打开。 2、下载下来的xpath_helper是zip格式的,需要解压缩即可安装。 3、重启浏览器,再次点击扩展程序即…

解密 Python 的 staticmethod 函数:静态方法的全面解析!

更多Python学习内容:ipengtao.com 在 Python 中,staticmethod 函数是一种装饰器,用于将函数转换为静态方法。静态方法与实例方法和类方法不同,它们不需要类实例作为第一个参数,也不需要类作为第一个参数,因…

微型丝杆的行业应用!

微型丝杆作为一种高精度、小尺寸的机械传动元件,在现代工业中扮演着重要角色,在多个行业中都有广泛的应用‌,主要包括以下几个方面: 1、医疗设备:在手术机器人中,微型丝杆能够实现精准定位和操作&#xff0…

二叉树进阶

目录 1. 二叉搜索树实现 1.1 二叉搜索树概念 2.2 二叉搜索树操作 ​编辑 ​编辑 2.3 二叉搜索树的实现 2.3.0 Destroy() 析构 2.3.1 Insert()插入 2.3.2 InOrder() 打印搜索二叉树 ​编辑​编辑 2.3.3 Find() 查找 …

GaussDB关键技术原理:高弹性(五)

书接上文GaussDB关键技术原理:高弹性(四)从扩容流程框架方面对hashbucket扩容技术进行了解读,本篇将从日志多流和事务相关方面继续介绍GaussDB高弹性技术。 目录 4.2 日志多流 4.2.1 日志多流总体流程 4.2.2 基线数据传输 4.…

fiddler抓包07_抓IOS手机请求

课程大纲 前提:电脑和手机连接同一个局域网 (土小帽电脑和手机都连了自己的无线网“tuxiaomao”。) 原理如下: 电脑浏览器抓包时,直接就是本机网络。手机想被电脑Fiddler抓包,就要把Fiddler变成手机和网络…

PMP与CMMI:两种管理方法的对比

PMP与CMMI:两种管理方法的对比 PMP:专注于项目管理CMMI:组织过程改进的框架总结:互补而非替代 在现代企业管理中,项目管理和组织能力成熟度模型集成(CMMI)是两个经常被提及的概念。虽然它们都是…

vue3中echarts柱状图横轴文字太多放不下怎么解决

问题:在做数据展示的时候,使用的是echarts,遇到了个问题,就是数据过多,但是设置的x轴的文字名称又太长,往往左边第一个或右边最后一个的名称展示不全,只有半个。 从网上找到了几种办法&#xff…

项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142454993 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op…