iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mycat分库分表的简单实践
  • 914
分享到

Mycat分库分表的简单实践

2024-04-02 19:04:59 914人浏览 泡泡鱼
摘要

   Mysql的使用场景中,读写分离只是方案中的一部分,想要扩展,势必会用到分库分表,可喜的是Mycat里已经做到了,今天花时间测试了一下,感觉还不错。 关于分库分

   Mysql的使用场景中,读写分离只是方案中的一部分,想要扩展,势必会用到分库分表,可喜的是Mycat里已经做到了,今天花时间测试了一下,感觉还不错。


关于分库分表

    当然自己也理了一下,分库分表的这些内容,如果分成几个策略或者阶段,大概有下面的几种。Mycat分库分表的简单实践

最上面的第一种是直接拆表,比如数据库db1下面有test1,test2,test3三个表,通过中间件看到的还是表test,里面的数据做了这样的拆分,能够咋一定程度上分解压力,如果细细品来,和分区表的套路有些像。

  接下来的几类也是不断完善,把表test拆解到多个库中,多个服务器中,如果做了读写分离,全套的方案这样的拆解改进还是很大的。如此来看,数据库中间件做了很多应用和数据库之间的很多事情,能够流行起来除了技术原因还是有很多其他的因素。 

分库分表的测试环境模拟

  如果要在一台服务器上测试分库分表,而且要求架构方案要全面,作为技术可行性的一个判定参考,是否可以实现呢。

   如果模拟一主两从的架构,模拟服务分布在3台服务器上,这样的方案需要创建9个实例,每个实例上有3个db需要分别拆分。

   大体的配置如下:

  master1:   端口33091  

(m1)slave1: 端口33092

(m1)slave2: 端口33093

   master2:  端口33071

(m2)slave1: 端口33072

(m2)slave2: 端口33073

master3:  端口33061

(m3)slave1: 端口33062

(m3)slave2: 端口33063

画个图来说明一下,其中db1,db2,db3下面有若个表,需要做sharding

Mycat分库分表的简单实践

所以我们需要模拟的就是这个事情。

使用Mycat碰到的几个小问题解惑

使用Mycat的时候碰到了几个小问题,感觉比较有代表性,记录了一下。

问题1:

手下是使用Mycat连接到数据库之后,如果不切换到具体的数据库下,使用[数据库名].[表名]的方式会抛出下面的错误,可见整个过程中,Mycat拦截了sql信息做了过滤,在转换的时候找不到目标路由。当然实际使用中,规范使用肯定不会有这个问题。

mysql> select * from db1.shard_auto;
ERROR 1064 (HY000):  find no Route:select * from db1.shard_auto
问题2:
在配置了sharding策略之后,insert语句抛出了下面的错误,这个是对语法的一个基本的要求。
mysql> insert into shard_mod_long values(1,'aa',date);
ERROR 1064 (HY000): partition table, insert must provide ColumnList
问题3:

如果sharding策略配置有误,很可能出现表访问正常,但是DML会有问题,提示数据冲突了。至于如何配置sharding,下面会讲。
mysql> select *from shard_mod_long;
Empty set (0.00 sec)

mysql> insert into shard_mod_long(ID,name,shard_date) values(1,'aa',current_date);
ERROR 1105 (HY000): Duplicate entry '1' for key 'PRIMARY'
问题4:
如果sharding的配置有误,很可能出现多份冗余数据。

查看执行计划就一目了然,通过data_node可以看到数据指向了多个目标库。

mysql> explain insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL                                                                    |
+-----------+------------------------------------------------+
| pxcNode11 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
| pxcNode21 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
| pxcNode31 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
+-----------+------------------------------------------------+

这种情况如果有一定的需求还是蛮不错的,做sharding可惜了。问题就在于下面的这个table配置。

<table name="shard_auto" primaryKey="ID" type="global"   dataNode="pxcNode11,pxcNode21,pxcNode31" rule="auto-sharding-long" />

需要去掉 type="global"的属性,让它sharding。


Mycat里面的sharding策略

 Mycat的分片策略很丰富,这个是超出自己的预期的,也是Mycat的一大亮点。

大体分片规则如下,另外还有一些其他分片方式这里不全部列举:
(1)分片枚举:sharding-by-intfile
(2)主键范围:auto-sharding-long
(3)一致性hash:sharding-by-murmur
(4)字符串hash解析:sharding-by-stringhash
(5)按日期(天)分片:sharding-by-date
(6)按单月小时拆分:sharding-by-hour
(7)自然月分片:sharding-by-month

在开始之前,我们要创建下面的表来模拟几个sharding的场景,表名根据需求可以改变。
create table shard_test(ID int primary key, name varchar(20),shard_date date); 

主键范围分片

主键范围分片是参考了主键值,按照主键值的分布来分布数据库在不同的库中,我们现在对应的sharding节点上创建同样的表结构。

关于sharding的策略,需要修改rule.xml文件。

常 用的sharding策略已经在Mycat里面实现了,如果要自行实现也可以定制。比如下面的规则,是基于主键字段ID来做sharding,分布的算法 是rang-long,引用了function rang-long,这个function是在对应的一个Java类中实现的。

        <tableRule name="auto-sharding-long">
                <rule>
                        <columns>ID</columns>
                        <alGorithm>rang-long</algorithm>
                </rule>

        <function name="rang-long"
                class="io.mycat.route.function.AutoPartitionByLong">
                <property name="mapFile">autopartition-long.txt</property>
当 然主键的范围是不固定的,可以根据需求来定制,比如按照一百万为单位,或者1000位单位,文件是 autopartition-long.txt  文件的内容默认如下,模板里是分为了3个分片,如果要定制更多的就需要继续配置了,目前来看这个配置只能够承载15亿的数据量,可以根据需求继续扩展定 制。           
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2

插入一些数据来验证一下,我们可以查看执行计划来做基本的验证,配置无误,数据就根据规则流向了指定的数据库下的表里。

mysql> explain insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL                                                                    |
+-----------+------------------------------------------------+
| pxcNode11 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
+-----------+------------------------------------------------+

还有一个查看sharding效果的小方法,比如我插入一个极大的值,保证和其他数据不在一个分片上,我们运行查询语句两次,结果会有点变化。

sharing的效果
mysql> select *from shard_auto;
+---------+------+------------+
| ID      | name | shard_date |
+---------+------+------------+
|       1 | aa   | 2017-09-06 |
|       2 | bb   | 2017-09-06 |
| 5000001 | aa   | 2017-09-06 |
+---------+------+------------+
3 rows in set (0.00 sec)
稍作停顿,继续运行。
mysql> select *from shard_auto;
+---------+------+------------+
| ID      | name | shard_date |
+---------+------+------------+
| 5000001 | aa   | 2017-09-06 |
|       1 | aa   | 2017-09-06 |
|       2 | bb   | 2017-09-06 |
+---------+------+------------+
3 rows in set (0.01 sec)


Hash分片

   Hash分片其实企业级应用尤其广泛,我觉得很的一个原因是通过这种数据路由的方式,得到的数据情况是基本可控的,和业务的关联起来比较直接。很多拆分方法都是根据mod方法来平均分布数据。

  sharding的策略在rule.xml里面配置,还是默认的mod-long规则,引用了算法mod-long,这里是根据sharding的节点数来做的,默认是3个。

   <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">3</property>
        </function>
比如查看两次insert的结果情况。

mysql> explain insert into shard_mod_long(ID,name,shard_date) values(4,'dd',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL                                                                        |
+-----------+------------------------------------------------+
| pxcNode22 | insert into shard_mod_long(ID,name,shard_date) values(4,'dd',current_date) |
+-----------+------------------------------------------------+

mysql> explain insert into shard_mod_long(ID,name,shard_date) values(5,'ee',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL                                                                        |
+-----------+------------------------------------------------+
| pxcNode23 | insert into shard_mod_long(ID,name,shard_date) values(5,'ee',current_date) |
+-----------+------------------------------------------------+
可以看到数据还是遵循了节点的规律,平均分布。

  至于schema.xml的配置,是整个分库的核心,我索性也给出一个配置来,供参考。

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

        <!-- 定义MyCat的逻辑库 -->
        <schema name="db1" checkSQLschema="false" sqlMaxLimit="100" >
        <table name="shard_mod_long" primaryKey="ID" type="global" dataNode="pxcNode11,pxcNode21,pxcNode31" rule="mod-long" />
        <table name="shard_auto" primaryKey="ID" type="global" dataNode="pxcNode11,pxcNode21,pxcNode31" rule="auto-sharding-long" />
        </schema>


        <!-- 定义MyCat的数据节点 -->
        <dataNode name="pxcNode11" dataHost="dtHost" database="db1" />
        <dataNode name="pxcNode21" dataHost="dtHost2" database="db1" />
        <dataNode name="pxcNode31" dataHost="dtHost3" database="db1" />

        <!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->
        <!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->
        <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
        <!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->
        <dataHost name="dtHost" maxCon="500" minCon="20" balance="1"
            writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
            <!--心跳检测 -->
            <heartbeat>show slave status</heartbeat>
            <!--配置后台数据库的IP地址和端口号,还有账号密码 -->
            <writeHost host="hostMaster" url="192.168.163.128:33091" user="mycat_user" passWord="mycat" />
        </dataHost>
         <dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"
            writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
            <!--心跳检测 -->
            <heartbeat>show slave status</heartbeat>
            <!--配置后台数据库的IP地址和端口号,还有账号密码 -->
            <writeHost host="hostMaster" url="192.168.163.128:33071" user="mycat_user" password="mycat" />
        </dataHost>
        <dataHost name="dtHost3" maxCon="500" minCon="20" balance="1"
            writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
            <!--心跳检测 -->
            <heartbeat>show slave status</heartbeat>
            <!--配置后台数据库的IP地址和端口号,还有账号密码 -->
            <writeHost host="hostMaster" url="192.168.163.128:33061" user="mycat_user" password="mycat" />
        </dataHost>
</mycat:schema

 


您可能感兴趣的文档:

--结束END--

本文标题: Mycat分库分表的简单实践

本文链接: https://www.lsjlt.com/news/48302.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mycat分库分表的简单实践
       MySQL的使用场景中,读写分离只是方案中的一部分,想要扩展,势必会用到分库分表,可喜的是Mycat里已经做到了,今天花时间测试了一下,感觉还不错。 关于分库分...
    99+
    2024-04-02
  • MyCat分库分表--实战09--按单月小时
    项目环境:   192.168.8.30  mycat 192.168.8.31  node1 192.168.8.32  node2 192...
    99+
    2024-04-02
  • Mycat中怎么实现MySQL单库分表
    Mycat中怎么实现MySQL单库分表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、Mycat安装部署安装环境Linux   目前只有1.6.5版本支持单库...
    99+
    2023-06-19
  • MyCat分库分表实例教程
    这篇文章主要介绍“MyCat分库分表实例教程”,在日常操作中,相信很多人在MyCat分库分表实例教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyCat分库分表实例教程”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-01
  • MyCat怎么实现分库分表
    本篇内容介绍了“MyCat怎么实现分库分表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!项目环境: 192.168.8.30 &n...
    99+
    2023-06-01
  • MyCat分库分表--实战01--垂直分库
    项目环境: 192.168.8.30  mycat 192.168.8.31  node1 192.168.8.32  node2 192.16...
    99+
    2024-04-02
  • MyCat怎么分库分表
    本篇内容介绍了“MyCat怎么分库分表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!项目环境: ...
    99+
    2024-04-02
  • MyCat分库分表的示例分析
    这篇文章主要为大家展示了“MyCat分库分表的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MyCat分库分表的示例分析”这篇文章吧。一、当前分片信息配...
    99+
    2024-04-02
  • MyCat分库分表--实战02--分片枚举
    项目环境:  192.168.8.30  mycat 192.168.8.31  node1 192.168.8.32  node2 1...
    99+
    2024-04-02
  • MyCat分库分表--实战07--按日期天
    项目环境:   192.168.8.30  mycat 192.168.8.31  node1 192.168.8.32  node2 192....
    99+
    2024-04-02
  • MyCat分库分表中怎么实现ER分片
    这篇文章主要介绍“MyCat分库分表中怎么实现ER分片”,在日常操作中,相信很多人在MyCat分库分表中怎么实现ER分片问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyCat分库分表中怎么实现ER分片”的疑...
    99+
    2023-06-01
  • MySQL 分库分表的项目实践
    目录一、为什么要分库分表二、库表太大产生的问题三、垂直拆分1. 垂直分库2. 垂直分表四、水平分库分表一、为什么要分库分表 数据库架构演变 刚开始多数项目用单机数据库就够了,随着服务...
    99+
    2024-04-02
  • 借助MyCat如何实现MySQL分库分表的方法
    这篇文章给大家分享的是有关借助MyCat如何实现MySQL分库分表的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。❝借助MyCat来实现MySQL的分库分表落地,没有实现过的...
    99+
    2024-04-02
  • Mycat读写分离配置实践
       工作这些年来,也去了一些地方,有了一些见闻,隐隐感觉很多文化和猫有着千丝万缕的联系。就拿IT行业来说吧,猫有着很高的曝光率,比如大名鼎鼎的 tomcat,是由SUN的软件构架...
    99+
    2024-04-02
  • 如何使用MyCat分表分库原理分析
    这篇文章给大家分享的是有关如何使用MyCat分表分库原理分析的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务...
    99+
    2024-04-02
  • springboot整合shardingjdbc实现分库分表最简单demo
    目录一、概览1.1 简介1.2 对比1.3 分库分表场景1.4 非分片表处理方法1.5 技术栈二、 项目整合2.1 pom.xml2.2 jpa/mybatis项目其他调整 spri...
    99+
    2024-04-02
  • MariaDBSpider数据库分库分表实践记录
    目录分库分表部署 MariaDB 实例Docker 部署虚拟机部署MariaDB 配置检查每个实例配置 Spider远程表基准性能测试加入后端数据库哈希分片根据值范围分片根据列表分片...
    99+
    2024-04-02
  • 怎么用数据库中间件Mycat+SpringBoot完成分库分表
    这篇文章主要讲解了“怎么用数据库中间件Mycat+SpringBoot完成分库分表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用数据库中间件Mycat+SpringBoot完成分库分表...
    99+
    2023-06-16
  • SpringBoot整合sharding-jdbc实现自定义分库分表的实践
    目录一、前言二、简介1、分片键2、分片算法三、程序实现一、前言 SpringBoot整合sharding-jdbc实现分库分表与读写分离 本文将通过自定义算法来实现定制化的分库分表来...
    99+
    2024-04-02
  • MyBatis实现简单的数据表分月存储
    目录前言一、简单的思路分析和代码1.1 判断是否存在对应的月度表1.2 根据月份区分创建表1.3 根据月份插入数据表1.4 完整的使用流程前言 今天介绍的一个业务场景主要是数据表过大...
    99+
    2023-03-19
    MyBatis 数据表分月存储 MyBatis 数据表存储
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作