`
uule
  • 浏览: 6337768 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Mycat - 数据库读写分离+分库分表

 
阅读更多

Mycat的下载安装

 

本文来源:https://www.cnblogs.com/fyy-hhzzj/p/9044775.html

 

系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。希望通过这篇文章的介绍,能学会Mycat的使用。

安装

Mycat官网:http://www.mycat.io/
可以了解下Mycat的背景和应用情况,这样使用起来比较有信心。

Mycat下载地址:http://dl.mycat.io/
官网有个文档,属于详细的介绍,初次入门,看起来比较花时间。

下载:
建议大家选择 1.6-RELEASE 版本,毕竟是比较稳定的版本。

安装:
根据不同的系统选择不同的版本。包括linux、windows、mac,作者考虑还是非常周全的,当然,也有源码版的。(ps:源码版的下载后,只要配置正确,就可以正常运行调试,这个赞一下。)

Mycat的安装其实只要解压下载的目录就可以了,非常简单。
安装完成后,目录如下:

目录 说明
bin mycat命令,启动、重启、停止等
catlet catlet为Mycat的一个扩展功能
conf Mycat 配置信息,重点关注
lib Mycat引用的jar包,Mycat是java开发的
logs 日志文件,包括Mycat启动的日志和运行的日志。

配置

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

文件 说明
server.xml Mycat的配置文件,设置账号、参数等
schema.xml Mycat对应的物理数据库和数据库表的配置
rule.xml Mycat分片(分库分表)规则

Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。
我们现在做一个主从、读写分离,简单分表的示例。结构如下图:

服务器 IP 说明
Mycat 192.168.0.2 mycat服务器,连接数据库时,连接此服务器
database1 192.168.0.3 物理数据库1,真正存储数据的数据库
database2 192.168.0.4 物理数据库2,真正存储数据的数据库

Mycat作为主数据库中间件,肯定是与代码弱关联的,所以代码是不用修改的,使用Mycat后,连接数据库是不变的,默认端口是8066。连接方式和普通数据库一样,如:jdbc:mysql://192.168.0.2:8066/

server.xml

示例

<user name="test">
        <property name="password">test</property>  
        <property name="schemas">lunch</property>  
        <property name="readOnly">false</property>  
        
        <!-- 表级 DML 权限设置 -->
        <!--        
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>       
         -->
    </user>

重点关注下面这段,其他默认即可。

参数 说明
user 用户配置节点
--name 登录的用户名,也就是连接Mycat的用户名
--password 登录的密码,也就是连接Mycat的密码
--schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs
--privileges 配置用户针对表的增删改查的权限,具体见文档吧

我这里配置了一个账号test 密码也是test,针对数据库lunch,读写权限都有,没有针对表做任何特殊的权限。

schema.xml
schema.xml是最主要的配置项,首先看我的配置文件。

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

<!-- 数据库配置,与server.xml中的数据库对应 -->
    <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
        <table name="lunchmenu" dataNode="dn1"  />
        <table name="restaurant" dataNode="dn1"  />
        <table name="userlunch" dataNode="dn1"  />
        <table name="users" dataNode="dn1"  />
        <table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2"  rule="mod-long" />

        
    </schema>

<!-- 分片配置 -->
    <dataNode name="dn1" dataHost="test1" database="lunch" />
    <dataNode name="dn2" dataHost="test2" database="lunch" />

<!-- 物理数据库配置 -->
    <dataHost name="test1" maxCon="1000" minCon="10" balance="0"  writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">  
        </writeHost>
    </dataHost>

    <dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostS1" url="192.168.0.3:3306" user="root" password="123456">  
        </writeHost>
    </dataHost>

</mycat:schema>
参数 说明
schema 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode 分片信息,也就是分库相关配置
dataHost 物理数据库,真正存储数据的数据库

每个节点的属性逐一说明:

schema:

属性 说明
name 逻辑数据库名,与server.xml中的schema对应
checkSQLschema 数据库前缀相关设置,建议看文档,这里暂时设为folse
sqlMaxLimit select 时默认的limit,避免查询全表

table:

属性 说明
name 表名,物理数据库中表名
dataNode 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey 主键字段名,自动生成主键时需要设置
autoIncrement 是否自增
rule 分片规则名,具体规则下文rule详细介绍

dataNode

属性 说明
name 节点名,与table中dataNode对应
datahost 物理数据库名,与datahost中name对应
database 物理数据库中数据库名

dataHost

属性 说明
name 物理数据库名,与dataNode中dataHost对应
balance 均衡负载的方式
writeType 写入方式
dbType 数据库类型
heartbeat 心跳检测语句,注意语句结尾的分号要加。

应用场景

数据库分表分库

配置如下:

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

<!-- 数据库配置,与server.xml中的数据库对应 -->
    <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
        <table name="lunchmenu" dataNode="dn1"  />
        <table name="restaurant" dataNode="dn1"  />
        <table name="userlunch" dataNode="dn1"  />
        <table name="users" dataNode="dn1"  />
        <table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2"  rule="mod-long" />

        
    </schema>

<!-- 分片配置 -->
    <dataNode name="dn1" dataHost="test1" database="lunch" />
    <dataNode name="dn2" dataHost="test2" database="lunch" />

<!-- 物理数据库配置 -->
    <dataHost name="test1" maxCon="1000" minCon="10" balance="0"  writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">  
        </writeHost>
    </dataHost>

    <dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostS1" url="192.168.0.3:3306" user="root" password="123456">  
        </writeHost>
    </dataHost>

</mycat:schema>

我在192.168.0.2、192.168.0.3均有数据库lunch。
lunchmenu、restaurant、userlunch、users这些表都只写入节点dn1,也就是192.168.0.2这个服务,而dictionary写入了dn1、dn2两个节点,也就是192.168.0.2、192.168.0.3这两台服务器。分片的规则为:mod-long。
主要关注rule属性,rule属性的内容来源于rule.xml这个文件,Mycat支持10种分表分库的规则,基本能满足你所需要的要求,这个必须赞一个,其他数据库中间件好像都没有这么多。
table中的rule属性对应的就是rule.xml文件中tableRule的name,具体有哪些分表和分库的实现,建议还是看下文档。我这里选择的mod-long就是将数据平均拆分。因为我后端是两台物理库,所以rule.xml中mod-long对应的function count为2,见下面部分代码:

<tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">2</property>
    </function>

数据库读写分离

配置如下:

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

<!-- 数据库配置,与server.xml中的数据库对应 -->
    <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
        <table name="lunchmenu" dataNode="dn1"  />
        <table name="restaurant" dataNode="dn1"  />
        <table name="userlunch" dataNode="dn1"  />
        <table name="users" dataNode="dn1"  />
        <table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1"  />

        
    </schema>

<!-- 分片配置 -->
    <dataNode name="dn1" dataHost="test1" database="lunch" />


<!-- 物理数据库配置 -->
    <dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">  
        <readHost host="hostM1" url="192.168.0.3:3306" user="root" password="123456">   
        </readHost>
        </writeHost>
    </dataHost>


</mycat:schema>

这样的配置与前一个示例配置改动如下:
删除了table分配的规则,以及datanode只有一个
datahost也只有一台,但是writehost总添加了readhost,balance改为1,表示读写分离。
以上配置达到的效果就是102.168.0.2为主库,192.168.0.3为从库。

注意:Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost,这个问题当时候我纠结了好久,数据写入writehost后,readhost一直没有数据,以为是自己配置的问题,后面才发现Mycat就没有实现主从复制的功能,毕竟数据库本身自带的这个功能才是最高效稳定的。

至于其他的场景,如同时主从和分表分库也是支持的了,只要了解这个实现以后再去修改配置,都是可以实现的。而热备及故障专业官方推荐使用haproxy配合一起使用,大家可以试试。

使用

Mycat的启动也很简单,启动命令在Bin目录:

##启动
mycat start

##停止
mycat stop

##重启
mycat restart

如果在启动时发现异常,在logs目录中查看日志。

  • wrapper.log 为程序启动的日志,启动时的问题看这个
  • mycat.log 为脚本执行时的日志,SQL脚本执行报错后的具体错误内容,查看这个文件。mycat.log是最新的错误日志,历史日志会根据时间生成目录保存。

mycat启动后,执行命令不成功,可能实际上配置有错误,导致后面的命令没有很好的执行。

Mycat带来的最大好处就是使用是完全不用修改原有代码的,在mycat通过命令启动后,你只需要将数据库连接切换到Mycat的地址就可以了。如下面就可以进行连接了:

 mysql -h192.168.0.1 -P8806 -uroot -p123456

连接成功后可以执行sql脚本了。
所以,可以直接通过sql管理工具(如:navicat、datagrip)连接,执行脚本。我一直用datagrip来进行日常简单的管理,这个很方便。

Mycat还有一个管理的连接,端口号是9906.

 mysql -h192.168.0.1 -P9906 -uroot -p123456

连接后可以根据管理命令查看Mycat的运行情况,当然,喜欢UI管理方式的人,可以安装一个Mycat-Web来进行管理,有兴趣自行搜索。

简而言之,开发中使用Mycat和直接使用Mysql机会没有差别。

常见问题

使用Mycat后总会遇到一些坑,我将自己遇到的一些问题在这里列一下,希望能与大家有共鸣:

  • Mycat是不是配置以后,就能完全解决分表分库和读写分离问题?
    Mycat配合数据库本身的复制功能,可以解决读写分离的问题,但是针对分表分库的问题,不是完美的解决。或者说,至今为止,业界没有完美的解决方案。
    分表分库写入能完美解决,但是,不能完美解决主要是联表查询的问题,Mycat支持两个表联表的查询,多余两个表的查询不支持。 其实,很多数据库中间件关于分表分库后查询的问题,都是需要自己实现的,而且节本都不支持联表查询,Mycat已经算做地非常先进了。
    分表分库的后联表查询问题,大家通过合理数据库设计来避免。

  • Mycat支持哪些数据库,其他平台如 .net、PHP能用吗?
    官方说了,支持的数据库包括MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,很赞。
    尽量用Mysql,我试过SQL Server,会有些小问题,因为部分语法有点差异。

  • Mycat 非JAVA平台如 .net、PHP能用吗?
    可以用。这一点MyCat做的也很棒。

参考

《Mycat权威指南》: http://www.mycat.io/document/Mycat_V1.6.0.pdf
官网 :http://www.mycat.io/

如果想熟练使用Mycat,建议要仔细看看官方推荐的文档,可能需要花点时间。本文只是简单的介绍下Mycat的配置,希望能快速让大家对Mycat有个认识,官方的文档理解起来也很容易,只是需要的时间更多,本文为说明的参数,请参考官方文档。

  • 大小: 59.9 KB
分享到:
评论

相关推荐

    mysql主从同步+MyCat读写分离+分库分表+Haproxy高可用+Keepalived心跳机制+虚拟IP.rar

    MyCat是一款开源的分布式数据库系统,常用于实现数据库的读写分离和分库分表。读写分离通过将读操作分配到从服务器,写操作保留在主服务器,来提高系统的并发处理能力。分库分表是将大数据量的单一表分成多个小表,...

    基于Mycat实现Mysql读写分离以及分库分表.doc

    基于Mycat实现Mysql读写分离以及分库分表可以提高数据库的性能和可扩展性。但是,需要正确地配置Mycat的配置文件,并且手动建好拆分后的库,以及手动建好逻辑库里的表。 通过本文档,你可以了解到Mycat读写分离和分...

    mycat对mysql数据库进行分库分表demo-mycat-demo-parent.zip

    描述"mycat对mysql数据库进行分库分表demo-mycat-demo-parent"进一步确认了这是一个关于MyCat与MySQL数据库结合使用的演示项目,旨在展示如何利用MyCat实现数据库的分库分表操作。分库分表是解决大数据量时性能瓶颈...

    mycat.zip+分库分表文档

    《Mycat分库分表解决方案详解》 在当今大数据时代,随着业务的快速发展和数据量的急剧增加,单机数据库往往无法满足高并发、大数据量的处理需求,因此,分库分表技术应运而生。Mycat作为一款开源的分布式数据库...

    Mycat-server-1.6.6.1 linux版本

    首先,Mycat的核心功能在于分库分表,它可以将一个大的表水平分割为多个小表,分散到不同的数据库服务器上,以此实现数据的横向扩展,提高系统的并发处理能力。同时,Mycat还具备自动路由、读写分离、数据同步等功能...

    Mycat-server-1.6.7.6-release-windows-linux.rar

    它基于MySQL协议,实现了数据库的分库分表功能,有效地提升了数据库的处理能力和扩展性。Mycat的核心设计理念是将单一的大数据库分解为多个小数据库,通过数据路由、读写分离、分片策略等手段,实现高并发、高可用的...

    Mycat-server-1.6.5-release-20180122220033-linux

    Mycat-server-1.6.5-release-20180122220033-linux是专为Linux环境设计的版本,它提供了读写分离、数据库分库分表、主从备份等一系列关键功能,旨在优化数据库性能,提高系统的可扩展性和可用性。 首先,让我们深入...

    Mycat-Server1.5

    Mycat是基于MySQL协议的数据库中间件,它的核心功能是分库分表,通过路由策略将数据分布到多个数据库上,实现数据库的水平扩展。此外,Mycat还具有读写分离、负载均衡、故障切换等特性,旨在提高系统的可伸缩性和...

    Mycat-server-1.6.7.1-release-20200209222254-win.tar.gz

    在数据库读写分离方面,Mycat支持配置主从模式,将读操作引导至从库,写操作则直接发送到主库,以此提升系统的响应速度。这对于高读低写的业务场景尤其有利,可以显著减少主库的压力。 分库分表是Mycat的另一个重要...

    最新版linux Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz

    Mycat 是一款基于 MySQL 协议的开源分布式数据库中间件,它实现了数据库的分库分表功能,有效地解决了大数据量下的高性能读写问题。在这个最新版的 Linux Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz...

    mysql进阶学习三之mycat读写分离和分库分表(csdn)————程序.pdf

    Mycat是一个基于Java开发的开源数据库中间件,它提供了数据库的读写分离和分库分表的功能。使用Mycat,开发者无需关心数据的存储位置,只需要像连接单个数据库一样连接Mycat,Mycat会根据配置自动处理数据的路由和分...

    oracle读写分离(中间键Mycat)

    Mycat是一个开源的数据库中间件,它具有分库分表、读写分离、数据切片等功能,能够帮助我们构建大规模分布式数据库系统。在Oracle 11g的读写分离场景下,Mycat作为中间层,会根据预设规则将用户的查询请求路由到相应...

    Mycat读写分离、主从切换、分库分表的操作记录- 线上操作手册

    Mycat是一个功能强大且灵活的数据库中间件,通过实现读写分离、主从切换、分库分表等功能,有效解决了大型系统中的数据库瓶颈问题。其不仅简化了数据库管理和维护流程,还提升了整个系统的性能和可靠性。对于那些...

    MYCAT读写分离+主从复制

    MYCAT是一种开源的分布式数据库系统,它主要用于解决大数据量、高并发访问的问题,通过分库分表、读写分离等技术提升系统的可用性和性能。在本配置中,我们看到MYCAT是如何实现主从复制和读写分离的。 主从复制是...

    mycat-server 1.6 源码包 可直接运行

    Mycat-Server 1.6 是一个开源的分布式数据库中间件,它主要用于解决大数据环境下高并发、高性能的问题,尤其在分库分表场景下表现卓越。这款源码包的特点是可直接运行,这意味着用户可以更直观地理解其工作原理并...

    Mycat-server-win

    【Mycat-server-win】是专为Windows操作系统设计的一款中间件,它主要的功能是对MySQL数据库进行分库分表以及实现读写分离,从而提升数据库系统的性能和可扩展性。Mycat作为开源的数据库中间件解决方案,已经在许多...

    mycat 分库分表

    **mycat 分库分表详解** mycat 是一个开源的分布式...总之,mycat 作为一个强大的分布式数据库中间件,为应对大数据时代的挑战提供了有效解决方案,通过合理的分库分表策略,帮助企业构建高可用、高性能的数据库架构。

    Mycat压缩包Mycat-server-1.6.7.4-release-20200105164103-win

    ### **数据量大的几种解决方案** - mysql集群, 主从,读写分离 - 冷热分离,部分冷数据(不经常使用的数据)移...- 分库分表 mycat/ shadingjdbc - NewSQL数据库,hbase 没有1个积分的私聊我哈,我给你免费。。。。。

    读写分离和分库分表详解

    为了应对这些挑战,多种技术手段被提出并广泛应用于实践中,其中“读写分离”与“分库分表”是两种非常重要的数据库优化策略。本文将详细介绍这两种技术的概念、实现方式、优缺点以及它们的应用场景,帮助读者更好地...

Global site tag (gtag.js) - Google Analytics