保姆级教程!手把手带你用数据库中间件Mycat,linux知识点总结

本文详细介绍了数据库水平切分的概念和分片规则,重点讲解了开源分布式数据库系统Mycat,以及如何利用SpringBoot+Mycat+MySQL实现分库分表的案例。文中提到Mycat作为数据库代理,支持读写分离和分表分库,适用于高并发场景和大数据处理。同时,文章提供了Mycat环境配置和切分规则设置的步骤。
摘要由CSDN通过智能技术生成

四、水平切分

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图

image.png

拆分数据就需要定义分片规则。关系型数据库是行列的二维模型,拆分的第一原则是找到拆分维度。比如:
从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就需要按照会员结合日期来拆分,不同的数据按照会员 ID 做分组,这样所有的数据查询 join 都会在单库内解决;如果从商户的角度来讲,要查询某个商家某天所有的订单数,就需要按照商户 ID 做拆分;但是如果系统既想按会员拆分,又想按商家数据,则会有一定的困难。如何找到合适的分片规则需要综合考虑衡。
几种典型的分片规则包括:

按照用户 ID 求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中;

按照日期,将不同月甚至日的数据分散到不同的库中;

按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中。

如图,切分原则都是根据业务找到适合的切分规则分散到不同的库,下面用用户 ID 求模举

image.png

既然数据做了拆分有优点也就优缺点。
优点

拆分规则抽象好,join 操作基本可以数据库做;

不存在单库大数据,高并发的性能瓶颈;

应用端改造较少;

提高了系统的稳定性跟负载能力。

缺点

拆分规则难以抽象;

分片事务一致性难以解决;

数据多次扩展难度跟维护量极大;

跨库 join 性能较差

五、什么是 Mycat

它是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的
Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。

常见应用场景:

单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;

分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片;

多租户应用,每个应用一个库,但应用程序只连接 Mycat,从而不改造程序本身,实现多租户化;

报表系统,借助于 Mycat 的分表能力,处理大规模报表的统计; 替代 Hbase,分析大数据;

作为海量数据实时查询的一种简单有效方案,比如 100 亿条频繁查询的记录需要在 3 秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时 Mycat 可能是最简单有效的选

六、SpringBoot+Mycat+MySQL 实现分表分库案例

关于分库分表,Mycat 已经帮我们在内部实现了路由的功能,我们只需要在 Mycat 中配置以下切分规则即可,对于开发者来说,我们就可以把 Mycat 看做是一个数据库,接下来我们开始搭建环境:

步骤一:

Mycat 是使用 java 写的数据库中间件,所以要运行 Mycat 前要准备要 jdk 的环境,要求是 jdk1.7 以上的环境。所以需要在系统中配置 JAVA_HOME 的环境变量.

步骤二:

从官网下载 Mycat,http://dl.mycat.io/1.6-RELEASE / 我们是基于 CentOS7 来搭建 Mycat 环境的,所以下载版本:
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

步骤三:

将下载好的安装包上传到服务器上并解压. 解压之后目录结构如下:

image.png

步骤四:

配置切分规则:
将如下配置复制粘贴覆盖 mycat/conf/schema.xml 的内容。

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

   <schema >
           <table  />  
   </schema>

   <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->  
   <dataNode  />  
   <dataNode  />  

   <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->  
   <dataHost >  
           <heartbeat>select user()</heartbeat>  
           <writeHost host="server1" url="127.0.0.1:3306" user="root" password="WolfCode_2017"/>  
   </dataHost>
</mycat:schema>

: 表示的是在 mycat 中的逻辑库配置,逻辑库名称为:TESTDB

: 表示在 mycat 中的逻辑表配置,逻辑表名称为:user, 映射到两个数据库节点dataNode中, 切分规则为:rule1(在 rule.xml 配置)

: 表示数据库节点, 这个节点不一定是单节点,可以配置成读写分离.

: 真实的数据库的地址配置

: 用户心跳检测

: 写库的配置

将如下配置复制粘贴覆盖mycat/conf/rule.xml的内容。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
   <tableRule >
       <rule>
           <columns>id</columns>
           <algorithm>mod-long</algorithm>
       </rule>
   </tableRule>
   <function >
       <!-- how many data nodes -->
       <property >2</property>
   </function>
</mycat:rule>

这里定义的是切分规则,是按照id列进行切分,切分规则是采取取模的方式,
2: 这里配置了我们有拆分了多个库 (表),需要和前面配置

中的 dataNode 个数一致,否则会出错.

步骤五:

在数据库中创建两个数据库 db01,db02.
每个库中执行如下建表语句:

CREATE TABLE `user` (
 `id` bigint(20) NOT NULL,
 `name` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

步骤六:

技术学习总结

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

039350)]

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

[外链图片转存中…(img-qXBAz23m-1631107039351)]

[外链图片转存中…(img-SHcqswQ0-1631107039351)]

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值