MyCat实现 MySQL 读写分离

环境架构

|-----------|---------|---------|
| 主机 | 角色 | MySQL版本 |
| 10.0.0.30 | mysql-主 | 8.0.41 |
| 10.0.0.31 | mysql-从 | 8.0.41 |
| 10.0.0.32 | mycat | |

1. java环境准备 和文件获取

bash 复制代码
yum install java-1.8.0-openjdk
[root@rocky32 ~]  java -version
openjdk version "1.8.0_472"
OpenJDK Runtime Environment (build 1.8.0_472-b08)
OpenJDK 64-Bit Server VM (build 25.472-b08, mixed mode)

java的版本过高会报错

从官网把包获取下来

bash 复制代码
[root@rocky32 ~]  mkdir /data/softs -p
[root@rocky32 ~]  cd /data/softs/
[root@rocky32 softs]  ls
Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz

2.Mycat部署

bash 复制代码
[root@rocky32 softs]  mkdir /apps
[root@rocky32 softs]  tar xf /data/softs/Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz -C /apps/

#日志

logs/wrapper.log #mycat启动日志

logs/mycat.log #mycat详细工作日志

#常用配置文件

conf/server.xml #Mycat 软件本身相关的配置文件,设置账号、参数等

conf/schema.xml #对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、节点控制

conf/rule.xml #Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等

定制环境变量

bash 复制代码
[root@rocky9-18 ~]  vim /etc/profile.d/mycat.sh
PATH=/apps/mycat/bin:$PATH

source /etc/profile.d/mycat.sh

启动Mycat服务

bash 复制代码
[root@rocky32 ~]  mycat start
Starting Mycat-server...
[root@rocky32 ~]  mycat status
Mycat-server is running (4158).

mycat默认路径:/apps/mycat/conf/server.xml

连接mycat -- 需要提前安装mysql的客户端工具

bash 复制代码
安装mysql客户端
[root@rocky9-18 ~]  yum install mysql -y
连接mycat:
[root@rocky9-18 ~]  mysql -uroot -p123456 -h 127.0.0.1 -P8066

3. schema.xml配置

schema.xml是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的。

schema #数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应

dataNode #分片信息,也就是分库相关配置

dataHost #物理数据库,真正存储数据的数据库
schema

name #逻辑数据库名,与server.xml中的schema对应

checkSQLschema #数据库前缀相关设置,这里为false

sqlMaxLimit #select 时默认的limit,避免查询全表

table

name #表名,物理数据库中表名

dataNode #表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name

primaryKey #主键字段名,自动生成主键时需要设置

autoIncrement #是否自增

rule #分片规则名,具体规则下文rule详细介绍
dataNode

name #节点名,与table中dataNode对应

datahost #物理数据库名,与datahost中name对应

database #物理数据库中数据库名
dataHost

name #物理数据库名,与dataNode中dataHost对应

balance #均衡负载的方式

writeType #写入方式

dbType #数据库类型

heartbeat #心跳检测语句,注意语句结尾的分号要加
schema.xml 文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"

schema.xml 中的 balance 的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:

  • balance="0":

不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上,即读请求仅发送到

writeHost 上。

  • balance="1":

一般用此模式,读请求随机分发到当前 writeHost 对应的 readHost 和 standby 的 writeHost上。即全部的 readHost 与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select

语句的负载均衡。

  • balance="2":

读请求随机分发到当前 dataHost 内所有的 writeHost 和 readHost 上。即所有读操作都随机的在 writeHost, readhost 上分发。

  • balance="3":

读请求随机分发到当前 writeHost 对应的 readHost上。即所有读请求随机的分发到 wiriterHost对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

4.配置 MySQL 环境

参考前面的内容,确保存在主从环境即可

测试同步

bash 复制代码
create database db1;

use db1;

创建表
mysql> CREATE TABLE stu (
id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age tinyint UNSIGNED,
gender ENUM('M','F') default 'M'
)ENGINE=InnoDB;

写数据
insert into stu(name,age)values('tom',10);

slave节点上查看
mysql> use db1;

mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| stu           |
+---------------+
1 row in set (0.00 sec)

mysql> select * from stu;
+----+------+------+--------+
| id | name | age  | gender |
+----+------+------+--------+
|  1 | tom  |   10 | M      |
+----+------+------+--------+

5.配置 Mycat 连接账号

在master节点上创建账号并授权,该帐号会被同步到 slave 节点

bash 复制代码
mysql> create user 'mycater'@'10.0.0.%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON db1.* TO 'mycater'@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

修改 server.xml 配置 mycat 连接后端数据库的账号密码

bash 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <property name="useHandshakeV10">1</property>
        <property name="serverPort">3306</property>      #mycat 监听的端口从8066改成3306
    </system>
    <user name="root">                                   #客户端连接mycat的配置
        <property name="password">123456</property>
        <property name="schemas">db1</property>
        <property name="defaultSchema">db1</property>
    </user>
</mycat:server>

注意:该文件中,不允许出现 # 之类的注释信息

6.配置读写分离

bash 复制代码
vim /apps/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="db1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user();</heartbeat>
        <writeHost host="host1" url="10.0.0.12:3306" user="mycater" password="123456">
                <readHost host="host2" url="10.0.0.15:3306" user="mycater" password="123456" />
        </writeHost>
    </dataHost>
</mycat:schema>

重启mycat 服务

bash 复制代码
[root@rocky32 ~]  mycat restart
Stopping Mycat-server...
Mycat-server was not running.
Starting Mycat-server...
[root@rocky32 ~]  mycat status
Mycat-server is running (5797).

测试

bash 复制代码
[root@rocky32 ~] mysql -uroot -p123456 -h127.1

mysql> show databases;
+----------+
| DATABASE |
+----------+
| db1      |
+----------+

mysql> show tables from db1;
+---------------+
| Tables_in_db1 |
+---------------+
| stu |
+---------------+
1 row in set (0.14 sec)

7.验证读写分离

验证读写分离, 分别在master 和 slave节点上开启通用日志

bash 复制代码
vim /etc/my.cnf.d/mysql-server.cnf
......
general_log

重启mysql服务
systemctl restart mysqld.service

通用日志, master, slave节点都有,文件名与机名同名

8. slave异常

当 slave 节点离线,mycat 会将查操作移换到 master 节点

9.问题

存在单点故障,可以用两个mycat之后用keepalived解决IP问题

相关推荐
齐 飞2 小时前
SQL server使用MybatisPlus查询SQL加上WITH (NOLOCK)
数据库·mysql·sqlserver
_F_y2 小时前
MySQL表的增删查改
android·数据库·mysql
yangSnowy2 小时前
Redis数据类型
数据库·redis·wpf
@我不是大鹏2 小时前
3、Spring AI Alibaba(SAA)零基础速通实战之Ollama私有化部署和对接本地大模型
数据库·人工智能·spring
Linging_242 小时前
PGSQL与Mysql对比学习
数据库·学习·mysql·postgresql
Anarkh_Lee2 小时前
【免费开源】MCP 数据库万能连接器:用自然语言查询和分析数据
数据库·开源·ai编程·claude·自然语言·mcp·cherry studio
Getgit2 小时前
mysql批量更新语句
java·数据库·mysql·udp·eclipse
alex18012 小时前
nginx配置图片静态路由
数据库·nginx·postgresql
明天…ling2 小时前
sql注入(1-10关)
java·数据库·sql