MyCat

一、概述

1.1 读写分离

一般数据库操作,写操作(DML:insert update delete)都不会成为数据库的瓶颈,一般都是单表操作,并且很短时间都可以完成。但是读操作(DQL:select)往往非常浪费服务器资源,特别数据量大的多表联合查询,消耗服务器资源不亚于死循环,甚至导致数据库宕机。所以在企业中都会使用读写分离,让读操作多台服务器进行负载均衡,来缓解读压力。

使用数据库中间件技术(mycat),让数据的查询(select)和写操作(insert update delete)在不同的主机上数据库执行,这就读写分离。

1.2 数据库中间件

中间件:一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。例子:Tomcat,web中间件。

数据库中间件:连接java应用程序和数据库

写:insert into a... -> 主机(192.168.190.128:3301)

读:select * from a -> 从机(192.168.190.128:3302)

二、Mycat

MyCAT是一款由阿里Cobar演变而来的用于支持数据库读写分离、分片的分布式中间件。MyCAT可不但支持Oracle、MSSQL、MYSQL、PG、DB2关系型数据库,同时也支持MongoDB等非关系型数据库。

2.1 为什么要用Mycat

Java与数据库紧耦合,Mycat 是数据库中间件,连接 Java 应用程序和数据库

高访问量高并发对数据库的压力。读写请求数据不一致

2.2 作用

2.2.1 读写分离

2.2.2 数据分片

垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)

2.2.3 多数据源整合

分布式项目中,实现多数据源整合

2.3 原理

Mycat 拦截了用户发送过来的 SQL 语句,首先对 SQL 语句进行特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将该 SQL 发送到真实的数据库,并处理返回的结果,再返回给用户。

这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是MySQL。

三、安装启动MyCat 

3.1 安装MyCat

将准备好的MyCat安装包上传到服务器,解压后可使用(没有可以私我),上传位置例: /opt/mycate 需要创建个mycate文件夹

解压MyCat安装包

 tar -zxvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz

 3.2 启动MyCat

  • 控制台启动 :去 mycat/bin 目录下执行 ./mycat console

  • 后台启动 :去 mycat/bin 目录下 ./mycat start

  • 关闭:./mycat stop

 

控制台启动 这样就代表成功 

./mycat console

启动MyCat 

./mycat start 

 

关闭MyCat 

./mycat stop

 

四、配置读写分离

4.1 准备工作

配置好mysql双主双从详细配置看上章配置双主双从

架构图如下:

 

4.2 MyCat配置文件

MyCat的配置文件,位于conf路径下,主要配置文件有三个:

  • server.xml:定义mycat用户以及系统相关变量,如端口等

  • schema.xml:定义逻辑库,表、分片节点等内容

  • rule.xml:定义分片规则

4.3 读写分离配置配置

4.3.1 配置server.xml

server.xml 几乎保存了所有 mycat 需要的系统配置信息(全局配置)。<user>标签,这个标签主要用于定义登录 mycat 的用户和权限。

  •  user:用户信息

  • name:用户名

  • passowrd:密码

  • schemas:逻辑库(和schema.xml中定义的一致)

 

 

 

4.3.2 修改schema.xml

schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库、表、分片规则、DataNode 以及 DataSource。弄懂这些配置,是正确使用 MyCat 的前提。  

配置说明:

  • schema标签用:于定义 MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配 置。

  • dataNode标签:定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。

  • dataHost标签:作为 schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句(show slave status)。

    • balance 属性:负载均衡类型,目前的取值有 3 种:

      • balance="0":不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。

      • balance="1":全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。

      • balance="2":所有读操作都随机的在 writeHost、readhost 上分发。

    • writeType属性:读写类型,目前的取值有 3 种

      • writeType="0":所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties

      • writeType="1":所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。

    • switchType 属性:自动切换机制

      • -1 :表示不自动切换

      • 1 :默认值,自动切换

      • 2 :基于 MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status

      • 3 :基于 MySQL galary cluster 的切换机制(适合集群),心跳语句为 show status like ‘wsrep%’

配置: 

1. 找到文件删除默认的schema配置

删除本来自带的所有内容

2. 添加配置

将我的配置复制进去 根据下方教程进行修改为自己的

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="A2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    </schema>

    <!-- name:别名 dataHost:和dataHost选项一致 database:mysql的数据库  -->
    <dataNode name="dn1" dataHost="host1" database="a1" />

    
    <!-- mycat逻辑库连接的mysql数据库具体配置 -->
    <!-- name:标签名  maxCon:最大连接数量  balance:读写分离机制  -->
    <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
              writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- 负责写的服务器:主    host:名字    -->
        <writeHost host="M1" url="192.168.5.69:3306" user="root" password="root">
            <!-- 负责读的服务器:从 -->
            <readHost host="S1" url="192.168.5.70:3306" user="root" password="root"></readHost>
            <readHost host="S2" url="192.168.5.99:3306" user="root" password="root"></readHost>
        </writeHost>
        <writeHost host="M2" url="192.168.5.70:3306" user="root" password="root">
            <readHost host="S4" url="192.168.5.69:3306" user="root" password="root"></readHost>
            <readHost host="S3" url="192.168.5.96:3306" user="root" password="root"></readHost>
            
        </writeHost>
    </dataHost>

</mycat:schema>

⚠️ 黄色框部分不要名字重复了

⚠️将ip地址改为自己配置的主从服务

⚠️user password 改为自己设置的数据库账号密码 

 

4.3.3 连接mycat

启动mysql集群

启动mycat

./mycat start

使用navicat链接 

 

 

测试 

在数据库里创建一个表 添加两个内容在去主从服务的四个数据库中查看是否数据都添加进去了

在主从配置的四个数据库中查看,出现这个效果就说明MyCat配置已经完成了

 

### Mycat 使用指南及配置详解 Mycat 是一款开源的分布式数据库中间件,支持 MySQL 协议,可以透明地连接到任何支持 MySQL 的应用。它主要用于解决大数据场景下的读写分离、分库分表等问题[^5]。 #### 1. Mycat 的核心功能 Mycat 提供了多种核心功能以满足复杂的数据库管理需求: - **分库分表**:通过自定义规则将数据分散到多个物理数据库中,从而提升性能和扩展性[^3]。 - **读写分离**:支持主从复制架构,将读操作路由到从库,写操作路由到主库,从而减轻主库的压力[^5]。 - **动态数据路由**:根据业务需求动态调整分片策略,灵活应对不同的查询场景。 - **高可用性**:提供主备切换和故障自动恢复等功能,确保系统的稳定运行[^5]。 #### 2. Mycat 的安装与环境准备 在使用 Mycat 之前,需要完成以下环境准备工作: - 安装 Java 环境(Mycat 基于 Java 开发)。 - 准备 MySQL 数据库实例,并配置主从复制(如果需要读写分离)。 - 下载并解压 Mycat 安装包,启动服务。 #### 3. Mycat 的核心配置文件 Mycat 的配置主要通过几个关键文件完成,以下是其中最重要的部分: - **schema.xml**:该文件定义了逻辑库、表、分片规则、DataNode 和 DataSource 的映射关系。正确配置这些内容是使用 Mycat 的基础[^3]。 示例配置: ```xml <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="user" dataNode="dn1,dn2" rule="mod-long"/> </schema> <dataNode name="dn1" dataHost="host1" database="db1"/> <dataNode name="dn2" dataHost="host2" database="db2"/> <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="jdbc:mysql://192.168.1.1:3306/db1" user="root" password="123456"/> </dataHost> ``` - **server.xml**:用于配置全局参数,例如用户权限、字符集等[^3]。 - **rule.xml**:定义分片规则,例如基于哈希、范围或列表的分片方式[^3]。 #### 4. Mycat 的分库分表实现 Mycat 的分库分表功能通过 `schema.xml` 中的配置实现。以下是一个简单的分库分表示例: - 将 `user` 表的数据按照 `id` 的模数分配到两个数据库中(`db1` 和 `db2`)。 - 配置分片规则为 `mod-long`,表示根据 `id` 的值取模分配数据。 ```xml <table name="user" dataNode="dn1,dn2" rule="mod-long"/> <rule name="mod-long" column="id" algorithm="mod_long"/> ``` #### 5. Mycat 的读写分离配置 Mycat 支持主从复制架构下的读写分离。通过在 `dataHost` 中配置 `writeHost` 和 `readHost`,可以实现将读操作路由到从库,写操作路由到主库。 示例配置: ```xml <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="jdbc:mysql://192.168.1.1:3306/db1" user="root" password="123456"/> <readHost host="hostS1" url="jdbc:mysql://192.168.1.2:3306/db1" user="root" password="123456"/> </dataHost> ``` #### 6. 常见问题及解决方案 - **问题 1**:无法连接到 Mycat 服务。 - 检查 Mycat 的 `server.xml` 文件中是否正确配置了端口和用户权限。 - **问题 2**:分库分表后查询结果不完整。 - 确保 `schema.xml` 中的分片规则与实际数据分布一致[^3]。 - **问题 3**:读写分离时出现延迟。 - 检查主从复制的延迟情况,并优化 MySQL 的复制配置[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值