淘淘商城第115讲——使用Mycat实现分库分表

2024-03-04 01:50

本文主要是介绍淘淘商城第115讲——使用Mycat实现分库分表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面

上一讲中,咱们新建了一台虚拟机,而且也为其设置了一个固定IP地址,例如192.168.81.137,如下图所示。
在这里插入图片描述
而且在这台虚拟机中我安装好了如下一些东东。
在这里插入图片描述
如果这时我们想远程访问以上这台虚拟机中安装好的MySQL数据库,那么该怎么办呢?可以在本地使用MySQL的图形化开发工具(例如Navicat for MySQL)来访问服务器上的MySQL数据库。如果你不知道怎么做,那也没有关系,具体步骤可以参考我写的《Linux入门第十五讲——远程访问Linux CentOS 7.6系统上安装的MySQL5.6》这篇文章。

使用Navicat for MySQL来访问服务器上的MySQL数据库时,访问成功之后的效果如下图所示。
在这里插入图片描述

什么是分库分表呢?

当数据库表中的数据非常大的时候,例如有上千万条数据,查询性能就非常低了,这个时候我们就可以把一张表中的数据拆分保存到不同数据库中的不同的表里面。
在这里插入图片描述
根据经验,对于MySQL来说,表中的数据达到2000W及以上时就需要分库分表了,对于Oracle 11g来说,表中的数据达到1亿及以上时也需要分库分表。

那么如何进行分库分表呢?可以使用一个数据库中间件,例如Mycat,它是一个国产开源项目,前身是cobar项目(原属阿里巴巴)。

使用Mycat实现分库分表

在使用Mycat实现分库分表之前,咱们得做一些准备工作。首先使用MySQL的图形化开发工具(例如Navicat for MySQL)在服务器上新建一个MySQL数据库,例如taotao,详细步骤如下所示。

第一步,右键数据库连接,例如taotao-mycat-server,在弹出的下拉列表中选中新建数据库
在这里插入图片描述
第二步,在弹出的窗口中输入数据库的名称,而且还要选择字符集为utf8。
在这里插入图片描述
点击确定按钮之后,名称为taotao的数据库就新建好了。

然后,将一个名称为taotao.sql的sql脚本文件导入到以上taotao数据库中。你可能要问了,我该怎么获取到这个sql脚本文件呢?从我下面给出的百度网盘链接地址中下载就行了。

链接:https://pan.baidu.com/s/1simeTbyekLJc3z_73GCKWw,提取码:217m

下载下来taotao.sql脚本文件之后,记得导入到以上taotao数据库当中。导入成功之后,你就能看到taotao数据库中有如下一些表了。
在这里插入图片描述
其中tb_item表就是我们要进行分片的表,其表结构设计如下图所示。
在这里插入图片描述
最后,我们还得在服务器上再新建三个MySQL数据库,它们的名称分别是taotao1、taotao2以及taotao3。之所以还要新建这三个MySQL数据库,是因为我们得把taotao数据库里面的tb_item表中的数据分到它们里面去。
在这里插入图片描述

配置server.xml文件

Mycat中的配置文件有很多,我们经常使用到的是server.xml、schema.xml以及rule.xml这三个配置文件。

这一小节,我们先来详细介绍一下server.xml这个配置文件,介绍完之后,你就知道该怎么配置它了。

该文件中定义了Mycat系统的配置和Mycat的登录用户信息,它里面主要有两个标签,分别是:
在这里插入图片描述
接下来,我们就要配置server.xml文件了。为了更加方便操作server.xml文件,我们可以用Nodepad++来编辑该文件,具体怎么做可以参考笔者写的《使用Nodepad++来编辑我们服务器的配置文件》这篇文章!

我们在server.xml文件配置的内容如下图所示。
在这里插入图片描述
从以上配置文件中的内容可知,现在咱们配置了两个用户,一个用户的用户名是test,密码是test,另外一个用户的用户名是user,密码是user。注意,这儿配置的用户并不是真正的MySQL数据库中的登录用户,而是连接到Mycat服务的时候要使用到的用户,因为在连接Mycat服务的时候需要输入对应的用户名和密码。

配置schema.xml文件

schema.xml作为Mycat中重要的配置文件之一,管理着Mycat的逻辑库、表、分片规则、DataNode以及DataSource,弄懂这些配置是正确使用Mycat的前提。这里笔者就一层层对该文件进行解析。
在这里插入图片描述
了解了schema.xml文件中的一些配置之后,接下来,咱们就要配置该文件了,配置好后的schema.xml文件的内容如下图所示。
在这里插入图片描述

配置role.xml文件

rule.xml文件定义了分库分表的规则。水平分表的时候便会用到该配置文件,因为这涉及到把一个表中的数据如何水平拆分到各个数据库实例中。

由于我们在schema.xml文件中使用到了一个名称为auto-id的分片规则,所以还得在rule.xml文件中定义好该分片规则。
在这里插入图片描述
哎,这个分片规则是啥呢?你肯定会有这样的疑惑。我上面也已经讲过了,这里的分片规则是对商品id进行取模(模数暂定为512)

知道了分片规则之后,那么我们就要在rule.xml文件中定义该分片规则了。如何定义这样一个分片规则呢?首先在rule.xml文件中添加一段如下配置:

<tableRule name="auto-id"><rule><!-- tb_item表中的主键字段 --><columns>id</columns><algorithm>func-id</algorithm></rule>
</tableRule>

截图如下:
在这里插入图片描述
然后再在rule.xml文件中添加一段如下配置:

<!-- io.mycat.route.function.PartitionByPattern类中定义好了取模的算法 -->
<function name="func-id" class="io.mycat.route.function.PartitionByPattern"><property name="mapFile">auto-id.txt</property><!-- patternValue属性:取模的模数 --><property name="patternValue">512</property>
</function>

截图如下:
在这里插入图片描述
接着我们还要在/usr/local/mycat/conf目录下新建一个名称为auto-id.txt的文件,其内容如下图所示。
在这里插入图片描述
温馨提示:以上文件中的内容可以参考auto-sharding-long.txt文件来配置哟!

测试

配置好以上三个非常重要的文件之后,接下来我们就要测试一下,看看效果了。

在开始测试之前,我得提醒大家一点,若是Linux版本的MySQL,则需要设置为MySQL大小写不敏感,否则可能会出现表找不到的情况。另外,据我测试,使用Mycat来建表的话会乱码,要解决乱码问题就需要设置一下数据库的编码格式。想要做到这两点,大家只须在MySQL的配置文件(即/etc/my.cnf)中的[mysqld]下方添加如下两行配置即可。

lower_case_table_names = 1
character_set_server=utf8

注意,一定要给所有参与分片的Linux系统中的MySQL都添加如上两行配置,配置好之后,重启MySQL,使用的命令是service mysql status

然后我们来启动Mycat,启动后查看是否正常启动,如下图所示。
在这里插入图片描述
接着我们便要来连接Mycat了。如何来连接Mycat呢?遵循如下步骤即可。

第一步,打开MySQL的图形化开发工具(例如Navicat for MySQL),因为这儿我们使用该工具来连接Mycat的。然后点击左上角的连接,并在弹出的下拉列表中选中MySQL...,如下图所示。
在这里插入图片描述
第二步,在弹出的如下窗口中依次连接Mycat的相关信息,比如Mycat的默认端口8066、用户名和密码(这俩我们就用server.xml文件中配置的那个可读可写数据库的用户的用户名和密码)。
在这里插入图片描述
第三步,点击测试连接按钮,若弹出连接成功的对话框,则表明连接Mycat没有任何问题,之后我们再点击确定按钮关闭新建连接窗口。
在这里插入图片描述
成功连接上Mycat之后,打开新建的mycat连接,发现里面有一个名称为taotao的数据库,而且库中无任何表,如下图所示。
在这里插入图片描述
既然库中没表,那我们便在taotao这个数据库中新建一张tb_item表,建表语句如下:

DROP TABLE IF EXISTS tb_item;
CREATE TABLE `tb_item` (`id` bigint(20) NOT NULL COMMENT '商品id,同时也是商品编号',`title` varchar(100) NOT NULL COMMENT '商品标题',`sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',`price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分',`num` int(10) NOT NULL COMMENT '库存数量',`barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',`image` varchar(500) DEFAULT NULL COMMENT '商品图片',`cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架,3-删除',`created` datetime NOT NULL COMMENT '创建时间',`updated` datetime NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),KEY `cid` (`cid`),KEY `status` (`status`),KEY `updated` (`updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

在taotao这个数据库中建完表之后,我们立即到192.168.81.137这台服务器的taotao1、taotao2以及taotao3这三个数据库中去查看是否也生成了同样的表,如下图所示,可以看到Mycat所在服务器(192.168.81.137)上的taotao1、taotao2以及taotao3这三个数据库中都有了tb_item这张表。
在这里插入图片描述
接着我们就向taotao数据库中的tb_item这张表中添加200条商品记录了,如下图所示。
在这里插入图片描述
温馨提示:向taotao数据库中的tb_item这张表中添加200条商品记录的sql脚本文件可以从我下面给出的百度网盘连接地址中进行下载。

链接:https://pan.baidu.com/s/113LS6bjbSWaO_3WHEj-BxA,提取码:nmi3

插入完之后,我们到taotao1、taotao2以及taotao3这三个数据库中进行查看,发现taotao1这个数据库中的tb_item表有了53条记录,之前是空的,如下图所示。
在这里插入图片描述
taotao2这个数据库中的tb_item表有了48条记录,之前是空的,如下图所示。
在这里插入图片描述
taotao3这个数据库中的tb_item表有了99条记录,之前是空的,如下图所示。
在这里插入图片描述
以上三张表中的记录数加起来总共有200条,刚刚好是我们往taotao数据库中的tb_item这张表中插入的总记录数。这已然说明了我们的分片是没任何问题的。

这篇关于淘淘商城第115讲——使用Mycat实现分库分表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/771644

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB