欢迎光临
我们一直在努力

MySQL 主从复制、MyCat 读写分离与分库分表实战

一、学习目标

  • 掌握 MySQL 主从复制的配置与验证
  • 理解 MyCat 中间件核心概念
  • 实现 MyCat 读写分离与分库分表配置

二、MySQL 主从复制

2.1 安装 MySQL(CentOS7 环境)

2.1.1 下载并安装 YUM 库

shell

# 下载YUM库
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
# 安装YUM库
rpm -ivh mysql57-community-release-el7-10.noarch.rpm

2.1.2 安装数据库

shell

yum -y install mysql-community-server –nogpgcheck

2.1.3 服务管理

shell

# 启动/停止/重启/查看状态/设置开机自启
systemctl start mysqld
systemctl stop mysqld
systemctl restart mysqld
systemctl status mysqld
systemctl enable mysqld

2.1.4 初始化配置

shell

# 查找初始密码
grep "password" /var/log/mysqld.log
# 登录数据库(粘贴上述密码)
mysql -u root -p

mysql

# 修改密码策略(降低复杂度要求)
SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_length=4;
# 修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '1111';
# 开启远程连接
use mysql;
select User,Host from user;
update user set host ="%" where user = "root";
flush privileges;

2.2 MySQL 主从复制配置

2.2.1 主从复制核心原理

  • MySQL 默认支持主(master)从(slave)架构
  • 核心效果:主库操作实时同步到从库
  • 实现本质:主库操作写入日志,从库读取日志重放操作
  • 核心要素:
    • 主库开启日志功能
    • 主 / 从库配置唯一 server_id(主 < 从)
    • 每个 MySQL 实例配置唯一 uuid(克隆虚拟机需修改)
  • 2.2.2 配置步骤
    1. 克隆 MySQL 虚拟机

    基于已安装的 MySQL 节点克隆出从库节点,后续分别配置主 / 从库。

    2. 配置主数据库
    • 修改主库my.cnf文件,开启日志并配置 server_id

    • 重启 MySQL:service mysqld restart
    • 查看主库状态:验证日志功能与 server_id 配置生效

    3. 配置从数据库
    • 修改从库my.cnf中的 server_id(需与主库不同)

    • 修改data/auto.cnf中的 uuid(保证唯一)

    • 重启 MySQL:systemctl restart mysqld
    • 配置主从关联:

    进入mysql

    ​mysql> stop slave;
    # 关联主库信息(替换为实际IP/日志文件)
    mysql> change master to master_host='192.168.204.136',master_user='root',master_password='1111',master_log_file='master_log.000001';
    mysql> start slave;

    • 验证从库状态:

    mysql

    show slave status \\G;

    需确保 IO 线程和 SQL 线程均为开启状态,无报错则配置成功。

    4. 验证主从关系

    在主库新建数据库 / 表 / 插入数据,观察从库是否同步更新。

    三、MyCat 中间件

    3.1 MyCat 简介

    MyCAT 是国产开源数据库中间件(前身是 Cobar),兼容 MySQL 协议,可实现读写分离、分库分表等能力,应用层可将其视为普通 MySQL 服务。

    3.2 MyCat 核心能力

    • 多数据库兼容

    • 垂直拆分(分库):按业务将库分布到不同MySQL节点

    • 水平拆分(分表):将单表数据拆分到多个MySQL节点

    • 读写分离:分离读 / 写请求到不同数据库节点

    3.3 MyCat 安装(CentOS7 环境)

    3.3.1 下载与解压

    官方网站:| MYCAT官方网站—中国开源分布式数据库中间件

    github地址:MyCATApache · GitHub

    下载完成后上传到linux服务器

    shell

    # 上传MyCat压缩包后解压到指定目录
    tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local

    3.3.2 服务管理

    shell

    # 进入MyCat/bin目录
    cd /usr/local/mycat/bin
    # 启动/停止/重启/查看状态
    ./mycat start
    ./mycat stop
    ./mycat restart
    ./mycat status

    默认端口 8066,可通过 MySQL 客户端直接连接。

    四、MyCat 分库分表与读写分离实战

    4.1 环境准备

    节点类型操作系统软件版本数据库名IP 地址
    MySQL1 CentOS7 MySQL5.7 db1 192.168.25.134
    MySQL2 CentOS7 MySQL5.7 db2 192.168.25.135
    MySQL3 CentOS7 MySQL5.7 db3 192.168.25.136
    MyCat CentOS7 1.6release – 192.168.25.137

    4.2 MyCat 核心概念

  • 逻辑库(schema):逻辑上完整的数据库
  • 逻辑表(table):逻辑上完整的表
  • 数据主机(dataHost):数据库所在服务器
  • 数据节点(dataNode):服务器上的具体 MySQL 实例
  • 分片规则(rule):数据拆分的规则
  • 4.3 核心配置文件

    4.3.1 schema.xml(核心配置)

    管理逻辑库、表、分片规则、数据节点 / 主机,示例配置:

    xml

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="power_shop" checkSQLschema="false" sqlMaxLimit="100">
    <table name="tb_content" dataNode="dn1,dn2,dn3" rule="crc32slot" />
    <table name="tb_content_category" dataNode="dn1,dn2,dn3" rule="crc32slot1"/>
    <table name="tb_item" dataNode="dn1,dn2,dn3" rule="crc32slot2" />
    <table name="tb_item_cat" dataNode="dn1,dn2,dn3" rule="crc32slot3" />
    <table name="tb_item_desc" dataNode="dn1,dn2,dn3" rule="crc32slot4" />
    <table name="tb_item_param" dataNode="dn1,dn2,dn3" rule="crc32slot5" />
    <table name="tb_item_param_item" dataNode="dn1,dn2,dn3" rule="crc32slot6" />
    <table name="tb_order" dataNode="dn1,dn2,dn3" rule="crc32slot7" />
    <table name="tb_order_item" dataNode="dn1,dn2,dn3" rule="crc32slot8" />
    <table name="tb_order_shipping" dataNode="dn1,dn2,dn3" rule="crc32slot9" />
    <table name="tb_user" dataNode="dn1,dn2,dn3" rule="crc32slot10" />
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
    writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.233.137:3306" user="root" password="1111">
    <readHost host="hostS2" url="192.168.233.138:3306" user="root" password="1111" />
    </writeHost>
    </dataHost>
    </mycat:schema>

    4.3.2 server.xml(用户权限配置)

    配置连接 MyCat 的用户名、密码、逻辑库权限:

    xml

    <user name="root">
    <property name="password">1111</property>
    <property name="schemas">power_shop</property>
    </user>

    <user name="user">
    <property name="password">1111</property>
    <property name="schemas">power_shop</property>
    <property name="readOnly">true</property>
    </user>

    4.3.3 rule.xml(分片规则配置)

    常用分片规则:

    • auto-sharding-long:按数值范围分片(如 1-500 万存 db1)
    • crc32slot:按 crc32 算法哈希分片

    示例配置:

    xml

    <tableRule name="crc32slot1">
    <rule>
    <columns>id</columns>
    <algorithm>crc32slot</algorithm>
    </rule>
    </tableRule>
    <tableRule name="crc32slot2">
    <rule>
    <columns>id</columns>
    <algorithm>crc32slot</algorithm>
    </rule>
    </tableRule>
    <!– 其余表规则配置省略 –>
    <function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
    <property name="count">3</property><!– 分片节点数量 –>
    </function>

    4.4 测试验证

    4.4.1 前置准备

    在主 MySQL 节点创建 db1、db2、db3 数据库。

    4.4.2 功能验证
  • 重启 MyCat:./mycat restart
  • 通过 MySQL 客户端连接 MyCat(端口 8066),创建表并插入数据
  • 分表验证:查看各 MySQL 节点的 db1/db2/db3,确认数据按规则分片存储
  • 项目集成验证:修改项目数据源连接 MyCat,测试 CRUD 功能
  • yaml

    spring:
    application:
    name: power-shop-item
    datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.233.139:8066/power_shop?characterEncoding=UTF-8
    username: root
    password: 1111
    type: com.alibaba.druid.pool.DruidDataSource

    五、总结

    本文完整梳理了 MySQL 主从复制的搭建流程,以及基于 MyCat 中间件实现分库分表、读写分离的核心配置与验证步骤。通过主从复制可实现数据备份与读写分离的基础,而 MyCat 则进一步解决了单库单表的性能瓶颈问题,适用于高并发、大数据量的业务场景。实际应用中需根据业务特点选择合适的分片规则,并做好节点监控与故障转移配置。

    赞(0)
    未经允许不得转载:171主机测评 » MySQL 主从复制、MyCat 读写分离与分库分表实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址