• 作者:老汪软件技巧
  • 发表时间:2024-09-05 04:01
  • 浏览量:

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

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

官网

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的区别mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包使用mycat时不需要修改代码,而使用sharding-jdbc时会和代码耦合Mycat 是基于 Proxy,它复写了 MySQL 协议,需要独立部署服务,需要运维团队维护,而 Sharding-JDBC 是基于 JDBC 的扩展,是以 jar 包的形式提供轻量级服务的。

1.4 Mycat2新特性

新特性总结

1.5 Mycat2 核心概念物理库物理表分片键物理分表物理分库单表全局表ER表原型库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)中有对应的物理库物理表,否则不能启动