淘淘商城第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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain