当前位置: 首页 > news >正文

MyCat实现分库分表

文章目录

  • 前言
  • 什么是MyCat
  • 为什么需要分库分表
  • 场景说明
  • MySQL准备
    • 创建数据库
    • 创建分表
  • MyCat安装配置
    • 下载安装
    • 配置server.xml
    • 配置schema.xml
    • 配置rule.xml
  • 启动MyCat
  • 测试验证
    • 连接MyCat
    • 插入数据
    • 查看数据分布
    • 查询数据
  • 常见分片算法
  • 注意事项
    • 1. 跨分片查询
    • 2. 主键生成
  • 总结

前言

随着业务量的增长,单库单表往往会遇到性能瓶颈。当一张表的数据量达到千万级别时,查询效率会明显下降。这时候就需要考虑分库分表了。本文将介绍如何使用MyCat中间件来实现MySQL的分库分表。

什么是MyCat

MyCat是一个开源的数据库中间件,可以看作是一个数据库代理。应用程序连接MyCat就像连接MySQL一样,而MyCat会将SQL请求路由到后端的真实数据库。通过MyCat,我们可以轻松实现读写分离、分库分表等功能。

为什么需要分库分表

单表数据量过大的问题:

查询变慢:索引树层级变深,检索效率降低
写入变慢:页分裂频繁,锁竞争加剧
备份恢复慢:数据量大,备份和恢复时间长

分库分表的好处:

提高查询性能:数据分散,单次查询数据量减少
提高并发能力:请求分散到多个数据库
便于扩展:可以通过增加节点来提升性能

场景说明

假设我们有一个订单表order,数据量巨大。我们的分库分表策略是:

  • 分库:按用户ID哈希分成2个库(db1、db2)
  • 分表:每个库中按订单ID模3分成3张表(order_0、order_1、order_2)

最终会有6张物理表分布在2个数据库中。

MySQL准备

创建数据库

在两台MySQL服务器上分别创建数据库:

-- MySQL 1 (192.168.1.101)
CREATE DATABASE db1;-- MySQL 2 (192.168.1.102)
CREATE DATABASE db2;

创建分表

在每个数据库中创建3张订单表:

-- 在db1和db2中都执行
CREATE TABLE order_0 (id BIGINT PRIMARY KEY,user_id BIGINT NOT NULL,product_name VARCHAR(100),amount DECIMAL(10,2),create_time DATETIME,INDEX idx_user_id(user_id)
) ENGINE=InnoDB;CREATE TABLE order_1 LIKE order_0;
CREATE TABLE order_2 LIKE order_0;

MyCat安装配置

下载安装

wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
tar -zxvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /usr/local/

配置server.xml

编辑conf/server.xml,配置MyCat的用户和逻辑库:

<?xml version="1.0" encoding="UTF-8"?>
<mycat:server xmlns:mycat="http://io.mycat/"><!-- 配置用户 --><user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">orderdb</property></user><user name="user"><property name="password">user123</property><property name="schemas">orderdb</property><property name="readOnly">true</property></user>
</mycat:server>

配置schema.xml

这是MyCat的核心配置文件,定义了逻辑库、逻辑表和分片规则:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!-- 定义逻辑库 --><schema name="orderdb" checkSQLschema="false" sqlMaxLimit="100"><!-- 定义逻辑表,rule指定分片规则 --><table name="order" dataNode="dn1,dn2" rule="order-hash-rule" /></schema><!-- 定义数据节点 --><dataNode name="dn1" dataHost="host1" database="db1" /><dataNode name="dn2" dataHost="host2" database="db2" /><!-- 定义数据主机 --><dataHost name="host1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.1.101:3306" user="root" password="123456"></writeHost></dataHost><dataHost name="host2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native"><heartbeat>select user()</heartbeat><writeHost host="hostM2" url="192.168.1.102:3306" user="root" password="123456"></writeHost></dataHost></mycat:schema>

配置rule.xml

定义分片规则:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/"><!-- 定义分片规则 --><tableRule name="order-hash-rule"><rule><columns>user_id</columns><algorithm>mod-long</algorithm></rule></tableRule><!-- 定义分片算法 --><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- 数据节点数量 --><property name="count">2</property></function></mycat:rule>

启动MyCat

# 启动
/usr/local/mycat/bin/mycat start# 查看状态
/usr/local/mycat/bin/mycat status# 查看日志
tail -f /usr/local/mycat/logs/wrapper.log

MyCat默认监听:

  • 8066端口:数据服务端口,应用连接这个端口
  • 9066端口:管理端口,用于管理MyCat

测试验证

连接MyCat

mysql -uroot -p123456 -h127.0.0.1 -P8066 -Dorderdb

插入数据

-- 插入测试数据
INSERT INTO `order`(id, user_id, product_name, amount, create_time) 
VALUES (1, 1001, 'iPhone 14', 5999.00, NOW());INSERT INTO `order`(id, user_id, product_name, amount, create_time) 
VALUES (2, 1002, 'MacBook Pro', 12999.00, NOW());INSERT INTO `order`(id, user_id, product_name, amount, create_time) 
VALUES (3, 1003, 'iPad Air', 4799.00, NOW());

查看数据分布

分别登录到两个MySQL实例查看数据:

-- 在MySQL 1上
USE db1;
SELECT * FROM order_0;
SELECT * FROM order_1;
SELECT * FROM order_2;-- 在MySQL 2上
USE db2;
SELECT * FROM order_0;
SELECT * FROM order_1;
SELECT * FROM order_2;

你会发现数据已经按照user_id的哈希值分散到不同的库和表中了。

查询数据

通过MyCat查询时,就像操作单表一样:

-- 查询指定用户的订单(会路由到特定分片)
SELECT * FROM `order` WHERE user_id = 1001;-- 查询所有订单(会聚合所有分片的结果)
SELECT * FROM `order` ORDER BY create_time DESC LIMIT 10;-- 统计订单总数
SELECT COUNT(*) FROM `order`;

常见分片算法

MyCat支持多种分片算法:

  1. 取模分片:根据字段值取模
  2. 范围分片:根据字段值的范围
  3. 枚举分片:根据枚举值映射
  4. 时间分片:按日期分片
  5. 字符串哈希分片:字符串哈希

注意事项

1. 跨分片查询

-- 不带分片键的查询会扫描所有分片,性能差
SELECT * FROM `order` WHERE product_name = 'iPhone';-- 带分片键的查询只会路由到对应分片
SELECT * FROM `order` WHERE user_id = 1001 AND product_name = 'iPhone';

2. 主键生成

分库分表后不能使用MySQL的自增ID,需要使用分布式ID生成方案:

  • 雪花算法(Snowflake)
  • 数据库序列表
  • Redis生成
  • MyCat自带的序列号

总结

MyCat是一个功能强大的数据库中间件,可以帮助我们快速实现分库分表。使用MyCat的优势在于:

  • 对应用透明:应用程序无需修改代码,只需改一下连接地址
  • 配置灵活:支持多种分片策略和路由规则
  • 功能丰富:支持读写分离、分库分表、SQL拦截等

在实际使用中,建议先做好容量规划和性能测试,确保分片方案能满足业务需求。

http://www.dtcms.com/a/439235.html

相关文章:

  • 宿迁网站建设公司宣传海报制作
  • 中铁中基建设集团网站品牌形象网站源码
  • 中医院网站源码传智黑马培训机构
  • python全栈(基础篇)——day01:环境准备(python解释器安装+pycharm专业版的下载+vscode编辑器+汉化设置)
  • CodeForces Round 1054(div.3)C题
  • 南宁网站建设制作定制seo搜索引擎优化招聘
  • 3.java常用类知识点
  • 费马小定理证明
  • 建设中网站源码微信小程序怎么注册申请
  • iis7.5 没有默认网站彩票网站代理
  • 汇编语言Debug工具与常用指令完全指南
  • wordpress 托管建站有了公网ip如何做网站
  • 网站的费用多少合肥网站开发建设
  • 零基础学习做网站蚌埠做网站建设费用
  • 麒麟系统安装后添加自启动
  • 网站底部备案号悬挂佛山木工机械厂骏域网站建设专家
  • 顺序表专题
  • 网站 备案 中国 名字微网站模板代码
  • ASP.NET Core Web API 中控制器操作的返回类型及Swagger
  • AI模型测评平台工程化实战十二讲(第六讲:大模型测评系统:智能模型管理模块的设计与实现)
  • 手写MyBatis第90弹:动态SQL测试策略与验证方法
  • 比较有名的公司网站网站建设犀牛云
  • 网站备案 企业备案响应式博客wordpress
  • AI 重塑实体经济:2025 传统产业转型的南通实践启示
  • 番禺建设网站平台网站建设所需要的内容
  • 网站每年续费费用南通制作网站
  • 特优项目网站建设方案辽宁建设工程信息网开评标系统
  • 哪个网站可以做验证码兼职强 的软件免费的软件下载
  • IPV4/Ipv6公网检测网站, DDNS配置
  • 贵州省城乡和住房建设厅网站线上app怎么做