news 2026/10/16 17:14:36

MySQL读写分离设计(基于MyCat实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL读写分离设计(基于MyCat实现)

一、MySQL读写分离

1、业务背景描述

时间:2014.4-2019.9
发布产品类型:互联网动态站点 商城
用户数量: 4000-8000(用户量猛增)
PV : 10000-60000(24小时访问次数总和)
DAU: 2000(每日活跃用户数)
之前是单台MySQL提供服务,使用多台MySQL数据库服务器,降低单台压力,实现集群架构的稳定性和高可用性 数据的一致性 完整性 replication
通过业务比对和分析发现,随着用户活跃增多,读取数据的请求变多,故着重解决读取数据的压力

2、模拟运维设计方案

根据以上业务需求,在之前业务架构的基础上实现数据的读写分离

说明:
实现MySQL主从架构 => 解决单点故障问题
引入MyCAT不仅可以实现高可用,MyCAT软件还能实现读写分离技术(master既可以承担写操作也可以承担一部分读操作,slave从服务器可以承担部分读操作)

二、MySQL读写分离介绍

1、什么是读写分离

SQL:增、删、改、查,进一步拆分成两大类:读(查询)、写(DML=>增加、修改、删除)
读写分离:读写操作,分发不同的服务器,读分发到对应的服务器(slave),写分发到对应的服务器(master)
master(主节点)、slave(从节点)
写操作 => 只能在master节点执行(主从架构中,只有主节点能实现写入)
读操作 => 既可以在master主节点,也可以在slave从节点(由调度算法决定的,默认肯定是slave从节点)
在生产环境中,一般可以配置一主多从架构。主节点只负责承担写入操作,从节点专门负责读操作

2、读写分离的目的

读写分离 将读写业务分配到不同的服务器上,让服务器做特定的操作,不需要不断的切换工作模式,使工作效率提高
写主服务器,读从服务器
同时降低主服务器的压力,在正常业务下,也是读比较多的情况,写相对读少一些
大约比例在写3/7读
读写分离:
① M-S下,读写必须分离,如果不分离,业务不可用出问题
② M-M 在此架构中,虽然可以随意读写操作,特定的操作交由特定的服务器操作,工作效率更高

3、读写分离的实现基础和原理

实现基础:通过主从复制机制实现数据的一致性、完整性
mysql的读写分离的基本原理是:
核心就是对sql语句进行分类 => 把用户执行的sql语句分为读操作 以及 写操作
让master(主数据库)来响应事务性操作(insert,update,delete,create,drop)
让slave(从数据库)来响应select非事务性操作
然后再采用主从复制来把master上的事务性操作同步到slave数据库中
没有主从复制,就无法实现业务上的读写分离

4、读写分离常见的实现方式

① 业务代码的读写分离(了解)
需要在业务代码中,判断数据操作是读还是写,读连接从数据服务器操作,写连接主数据库服务器操作mysql01/mysql02
以当前LNMP为例,就需要使用PHP代码实现读写分离
在ThinkPHP6.0代码端对数据库的操作进行判断:
增加:

mysql> insert into 数据表 values (字段值,字段值,...);

删除:

mysql> delete from 数据表 where 字段=字段值; mysql> delete from 数据表 where 字段 in (字段值1,字段值2...); mysql> delete from 数据表;

修改:

mysql> update 数据表 set 字段=字段的值 where 字段=字段值; mysql> update 数据表 set 字段=字段的值;

查询:

mysql> select */字段列表 from 数据表; 如果insert/update/delete操作,自动连接master主数据库。 如果select操作,自动连接slave从数据库。

② 中间件代理方式的读写分离
在业务代码中,数据库的操作,不直接连接数据库,而是先请求到中间件服务器(代理)
由代理服务器,判断是读操作去从数据服务器,写操作去主数据服务器
名称 描述
MySQL Proxy MySQL官方 测试版 不再维护
Atlas 奇虎360 基于MySQL Proxyhttps://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
DBProxy 美团点评
Amoeba 早期阿里巴巴
cobar 阿里巴巴
MyCat 基于阿里开源的Cobar
kingshard go语言开发https://github.com/flike/kingshard
也就是如下图所示架构

问:如何选择?
① 业务上实现更加方便,成本低一下,如果使用的开发框架不支持分布式数据库的部署模式,业务的SQL需要修改,改代码(程序猿)
② 中间件代理服务器 更加适合管理更多的数据库服务器集群,查看到服务器是否可用,不只可以实现读写分离,使用中间件实现分库、分表的操作(运维)

三、MySQL读写分离的具体实现

前提:
MyCAT2本身不能低于6GB
MySQL5配合MyCAT比较消耗资源,两台MySQL服务器内存不得低于4GB,否则配置完成后会报错!!!
MySQL8配合MyCAT比较消耗资源,两台MySQL服务器内存不得低于6GB,否则配置完成后会报错!!!

1、配置主从

主从复制的原理 :主服务器开启bin-log(记录了写操作) 从服务器获取到主服务器的bin-log 记录到relay-log中。从服务器在通过异步的线程方式,对于relay-log进行重放操作
IO线程去主服务器binlog日志拷贝 => 写入到从服务器的relay log中
SQL线程根据relay log变化,自动去执行拷贝过来DML语句,重演

主服务器: bin-log
从服务器: relay-log
DML => MASTER SQL => binlog日志中
SLAVE SQL => 监听MASTER binlog日志变化,一旦监测到主服务器发生变化 => 通过网络IO线程复制到SLAVE从服务器中,放入relaylog中继日志 => SLAVE使用SQL线程重演MASTER SQL操作
准备mysql02服务器(192.168.88.109)

hostnamectl set-hostname mysql02 bash

更改mac地址、绑定IP与主机、关闭防火墙与SELINUX、配置时间同步、安装必备软件,如wget、vim、rsync、net-tools等等,准备完成后,拍摄快照
配置MySQL5.7主从
master.sh:

代码块 #vim master.sh #!/bin/bash echo "正在安装依赖软件..." yum install libaio -y echo "执行解压缩操作..." tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql useradd -r -s /sbin/nologin mysql rm -rf /etc/my.cnf echo "进入mysql目录,对其进行初始化操作..." cd /usr/local/mysql mkdir mysql-files chown mysql:mysql mysql-files chmod 750 mysql-files bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql 2>&1 | tee /tmp/mysqld.log | grep password | awk '{print $NF}' > /root/mysql_temp_password.txt echo "设置my.cnf与mysqld.service文件" cat > /etc/my.cnf <<EOF [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/tmp/mysql.sock port=3306 log-error=/usr/local/mysql/data/mysql.err log-bin=/usr/local/mysql/data/binlog server-id=10 character_set_server=utf8mb4 gtid-mode=on log-slave-updates=1 enforce-gtid-consistency sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES EOF bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data cat <<EOF | sudo tee /etc/systemd/system/mysqld.service [Unit] Description=MySQL Server After=network.target After=syslog.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE = 5000 PrivateTmp=false [Install] WantedBy=multi-user.target EOF echo "正在刷新后台服务,然后启动mysqld..." sudo systemctl daemon-reload systemctl start mysqld systemctl enable mysqld sleep 5 echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile source /etc/profile ln -s /lib64/libncurses.so.6 /lib64/libncurses.so.5 ln -s /lib64/libtinfo.so.6 /lib64/libtinfo.so.5 echo "正在重置mysql管理员密码..." cd /usr/local/mysql temp_password=`cat /root/mysql_temp_password.txt` bin/mysqladmin -S /tmp/mysql.sock -uroot password '123456' -p$temp_password echo "MySQL安装成功,软件安装路径:/usr/local/mysql,数据库初始密码:123456!"

#source master.sh
slave.sh(重点):

#!/bin/bash echo "正在安装依赖软件..." yum install -y libaio echo "解压MySQL二进制文件..." tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql echo "创建MySQL系统用户..." useradd -r -s /sbin/nologin mysql rm -rf /etc/my.cnf echo "准备目录权限..." cd /usr/local/mysql mkdir -p mysql-files chown mysql:mysql mysql-files chmod 750 mysql-files

注意:不进行初始化!

#bin/mysqld --initialize …

echo"设置my.cnf和mysqld.service文件..."cat>/etc/my.cnf <<EOF[mysqld]basedir=/usr/local/mysql datadir=/usr/local/mysql/datasocket=/tmp/mysql.sock port=3306 log-error=/usr/local/mysql/data/mysql.err log-bin=/usr/local/mysql/data/binlog server-id=20 character_set_server=utf8mb4 gtid-mode=on log-slave-updates=1 enforce-gtid-consistency read_only=1 relay_log=/usr/local/mysql/data/relaylog log_slave_updates=1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES EOF 生成SSL(可选)#bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/datacat<<EOF|sudotee/etc/systemd/system/mysqld.service[Unit]Description=MySQL Server After=network.target After=syslog.target[Service]User=mysqlGroup=mysql ExecStart=/usr/local/mysql/bin/mysqld--defaults-file=/etc/my.cnf LimitNOFILE = 5000 PrivateTmp=false[Install]WantedBy=multi-user.target EOFecho"刷新服务..."sudo systemctl daemon-reloadecho"添加到开机启动项..."systemctl enable mysqldecho'export PATH=$PATH:/usr/local/mysql/bin'>>/etc/profile source/etc/profile ln-s/lib64/libncurses.so.6/lib64/libncurses.so.5 ln-s/lib64/libtinfo.so.6/lib64/libtinfo.so.5echo"MySQL从服务器环境已配置完成。请确认数据目录已从主库复制或使用备份恢复后再启动服务。"

#source slave.sh
主从配置:

代码块 [root@master ~] # systemctl stop mysqld [root@master ~] # rm -rf /usr/local/mysql/data/auto.cnf [root@master ~] # rsync -av /usr/local/mysql/data root@192.168.88.109:/usr/local/mysql/ [root@master ~] # systemctl start mysqld [root@master ~] # mysql -uroot -p Enter password: 123456 mysql> CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123'; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; ------------------------------------------------------------------------------- [root@slave ~] # systemctl start mysqld mysql> CHANGE MASTER TO MASTER_HOST='192.168.88.106', MASTER_PORT=3306, MASTER_USER='slave', MASTER_PASSWORD='123', MASTER_AUTO_POSITION=1; mysql> start slave; mysql> show slave status\G
2、代码层级的读写分离(了解,不需要实操)

筛选:insert/update/delete操作,把这样的SQL传输到主服务器
筛选:select操作,把这样的SQL传输到从服务器
NiuShop底层采用ThinkPHP框架,寻找官网手册:https://doc.thinkphp.cn/v6_1/fenbushishujuku.html

vim database.php retun [ 'type'=>'mysql', 'hostname'=>'主IP,从IP', ==> 设置服务器列表,逗号隔开,第1台服务器默认为主服务器 ... 'deploy'=>1, ==> 开启分布式数据库(多台数据库,默认为0) 'rw_separate'=>true, ==> 开启读写分离模式,主写,从读 ]

测试可以down主库,看从库是否可以访问,在niushop配置文件中,如果slave宕机,master提供读服务。
适合场景说明:适合公司研发团队能力比较强的情况。

3、MyCAT2中间件(重点)

MyCAT一共有两个版本:MyCAT(支持MySQl5.7及以下版本)、MyCAT2(不仅支持MySQL5.7,还支持MySQL8.0等版本)
官方网址:http://www.mycatone.top/

Mycat2是Mycat社区开发的一款分布式关系型数据库(中间件)。它支持分布式SQL查询,兼容MySQL通信协议,以Java生态支持多种后端数据库,通过数据分片提高数据查询处理能力
MyCAT2在架构中的定位:

特点:
a.代码开源
学习中间件技术,数据库技术,代码是必须有的
b.兼容MySQL语法的分布式查询引擎
•兼容MySQL语法
•兼容MySQL值类型
•使用基于规则优化与代价的优化器
•独立的物理执行引擎
c.自定义功能算法开发
•分片算法,序列号算法,负载均衡算法等都可自定义加载
•查询引擎可脱离网络框架运行
d.自定义处理过程
自研DSL操纵物理查询计划
支持SQL转发,缓存结果集

4、MyCAT2工作原理图

Mycat 数据库中间件
国内最活跃的、性能最好的开源数据库中间件!
官方网址:http://www.mycatone.top/
因为mycat2是由java语言开发,必须使用java的允许环境进行启动和操作
5、准备机器
最好保证4核6G以上,因为MyCAT2占用内存与CPU比较大
更改IP地址以及Mac地址
绑定IP与HOSTNAME到/etc/hosts文件中
时间同步
安装必备软件

dnf install vim wget rsync net-tools -y
6、JDK安装

Java编程语言的一种,与之类似还有很多,Python/Go/PHP
语言分为两种:Python/PHP解释型语言,Java属于编译型语言。
解释型:每次运行都需要对代码进行重新解析。
编译型:首次运行时需要对源代码进行编译,产生一个中间文件.class,然后对其进行运行。以后再运行相同代码时,不需要重新编译,而是直接调用之前编译好的.class字节码文件,直接运行。

代码编译成机器码 执行机器码输出结果。
编译jdk => javac 编译java代码
运行jre 编译好的机器码(可以执行文件)
问:公司服务器部署的java环境是jdk还是jre?
答:
jre java解析运行环境 一般情况编译过的可执行的java程序 ,jre就够用了。
jdk javac 编译的环境 如果服务器上传是源代码文件 就可以编译,之后再执行。
实际业务环境中,如果存在需要编译的情况,就选择jdk。
oracle jdk(sun公司=>oracle公司收购)
open jdk(完全免费的jdk环境)
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

7、上传mycat2和jdk到Linux
第一步:解压安装jdk
shell > tar xvf jdk-8u192-linux-x64.tar.gz shell > mkdir /usr/local/java shell > mv jdk1.8.0_192 /usr/local/java/

注:最终完整路径/usr/local/java/jdk1.8.0_192

第二步:配置环境变量
shell> rpm -e java-1.8.0-openjdk-headless-1.8.0.362.b09-4.el9.x86_64 --nodeps shell> vim /etc/profile export PATH=$PATH:/usr/local/java/jdk1.8.0_192/bin ----------------------------华丽的分割线 -------------------------- shell > source /etc/profile

最终脚本:jdk.sh

#!/bin/bash tar xvf jdk-8u192-linux-x64.tar.gz mkdir -p /usr/local/java mv jdk1.8.0_192 /usr/local/java/ rpm -e java-1.8.0-openjdk-headless-1.8.0.362.b09-4.el9.x86_64 --nodeps echo 'export PATH=$PATH:/usr/local/java/jdk1.8.0_192/bin' >> /etc/profile source /etc/profile

执行

source jdk.sh
8、MyCAT2安装

下载地址:https://github.com/MyCATApache/Mycat2,需要编译,直接使用提供给大家的软件包

第一步:安装MyCAT
mkdir mycat2 # 上传软件到此目录,mycat2-install-template-1.21.zip 以及 mycat2-1.21-release-jar-with-dependencies.jar cd mycat2/ unzip mycat2-install-template-1.21.zip mv mycat /usr/local/ cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/ cd /usr/local/mycat/
第二步:设置数据源

前提:使用管理员账号
mysql01服务器:

mysql> CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123'; mysql> GRANT ALL ON *.* TO 'root'@'%';

配置数据源
配置MyCAT => ① schema(数据库)=> ② 数据源(连接哪些数据库实例)=> ③ 创建一个读写分离集群

cd conf/datasources

把mycat带的数据源配置正确

{ "dbType":"mysql", "idleTimeout":60000, "initSqls":[], "initSqlsGetConnection":true, "instanceType":"READ_WRITE", "maxCon":1000, "maxConnectTimeout":3000, "maxRetryCount":5, "minCon":1, "name":"prototypeDs", "password":"123", "type":"JDBC", "url":"jdbc:mysql://192.168.88.106:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8", "user":"root", "weight":0 } 需要修改位置: 1. 代表要连接数据源的MySQL密码 "password":"123" 2. 代表要连接数据源的MySQL数据库信息 "url":"jdbc:mysql://192.168.88.102:3306/niushop?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8" 3. 代表要连接数据源的MySQL账号 "user":"root"
9、目录说明
bin :mycat二进制文件目录 conf:配置文件目录 logs:目录可以查看到错误日志
10、启动MyCAT2

默认不进行任何配置,mycat也是可以启动的:

chmod +x /usr/local/mycat/bin/* /usr/local/mycat/bin/mycat console #新开一个远程连接窗口,确认mycat是否真的启动,查看它的端口 9066 8066 ss -naltp |grep 8066 8066:MyCAT客户端 9066:MyCAT管理端

如果启动不成功,报错:Ignoring option MaxPerSize:support was removed in 8.0
原因分析:因为系统不能够在规定时间内,启动mycat,可以设置启动等待时间延长(配置低)
部署好mycat之后,先启动一下,是否能够正常启动。就不需要修改。

#vim /usr/local/mycat/conf/wrapper.conf 111 wrapper.startup.timeout=300 ==> 添加这一行 112 wrapper.ping.timeout=120 ==> 默认存在

常见错误就几种情况:
① 配置低,服务无法启动,报错:Ignoring option MaxPerSize:support was removed in 8.0
解决思路:增大内存或者调整配置文件中的启动超时时间

#vim conf/wrapper.conf 111 wrapper.startup.timeout=300 ==> 添加这一行 112 wrapper.ping.timeout=120 ==> 默认存在

② 数据源报Access Denied,往往/usr/local/mycat/conf/datasources/prototypeDs.datasource.json
要么账号密码不对,要么连接地址不对,要么账号没有权限,严格按照这个路径排查

11、配置MyCAT2(重点)
第一步:进入数据源配置目录
cd /usr/local/mycat/conf/datasources/ 配置prototypeDs.datasource.json文件 PowerShell { "dbType":"mysql", "idleTimeout":60000, "initSqls":[], "initSqlsGetConnection":true, "instanceType":"READ_WRITE", "maxCon":1000, "maxConnectTimeout":3000, "maxRetryCount":5, "minCon":1, "name":"prototypeDs", "password":"123", "type":"JDBC", "url":"jdbc:mysql://192.168.88.106:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8", "user":"root", "weight":0 }
第二步:重新启动MyCAT
/usr/local/mycat/bin/mycat start

第三步:使用本地MySQL客户端或者DataGrip连接MyCAT,配置信息如下:
mysql客户端连接MyCAT2服务器(推荐):

1、安装mysql客户端 yum install mysql -y mysql-server:服务器端 mysql:客户端 安装客户端以后,我们就可以使用mysql命令 2、mycat本身有密码,密码为123456,如果我们连接的mycat客户端,必须要使用这个密码,这个密码保存在root.user.json文件中 [root@mycat mycat]# cat /usr/local/mycat/conf/users/root.user.json { "dialect":"mysql", "ip":null, "password":"123456", "transactionType":"proxy", "username":"root" } 3、连接mysql客户端 mysql -h127.0.0.1 -uroot -p123456 -P8066 mysql> show databases; +--------------------+ | `Database` | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.42 sec)

DataGrip配置,注意端口必须是8066,别写错了!

默认账号:root
默认密码:123456

补充说明:常见问题解析
问题1:[root@mycat mycat]# /usr/local/mycat/bin/mycat console没有任何反应?
答:
① 可能是由于jdk没有安装或者配置没有立即生效,缺少source /etc/profile,如果mycat找不到jdk也会出现无法启动的问题。
② 可能安装异常,这种情况可以移除/usr/local/mycat文件夹,重新解压,重新配置
③ 可能后台mycat服务卡死,没有正常启动导致的。重启Linux操作系统以后,往往这个问题就可以解决

问题2:mycat start,但是查看不到8066和9066这两个端口,这种情况要学会看报错日志

tail -100 /usr/local/mycat/logs/wrapper.log

第四步:创建db1数据库并设置数据源(为了让MyCAT可以识别到数据库,如果没有设置数据源,则MyCAT无法查看到指定数据库)

创建完成后,系统会自动在/usr/local/mycat/conf/schemas目录下生成db1.schema.json

#ll -rw-r--r-- 1 root root 607 Nov 14 19:46 db1.schema.json 编辑schema.json文件

第五步:添加数据源datasource(具体连接哪几个数据库实例)

-- 创建一个主数据库连接(负责读写分离中的写操作) /*+ mycat:createDataSource{ "name":"rwSepw", "url":"jdbc:mysql://192.168.88.106:3306/db1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123" } */; -- 创建一个从数据库连接(负责读写分离中的读操作) /*+ mycat:createDataSource{ "name":"rwSepr", "url":"jdbc:mysql://192.168.88.109:3306/db1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123" } */; /*+ mycat:showDataSources{} */; 扩展:删除数据源操作(不需要操作) PowerShell /*+ mycat:dropDataSource{"name":"rwSepw"} */; /*+ mycat:dropDataSource{"name":"rwSepr"} */; 第六步:添加数据集群(关键) PowerShell /*! mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */; /*+ mycat:showClusters{} */;

说明:
/!/ 语法:
MySQL 兼容的注释语法
这种注释中的内容会被 MySQL 服务器执行,但被其他数据库忽略(条件判断)
在 MyCAT 中表示这是一个需要执行的命令
通常用于执行 MyCAT 的管理命令,如创建集群等
简单理解:/!/主要用于实现MyCAT写操作!

/+/ 语法:
/+/通常用于查询提示(Query Hints)
在 MyCAT 中用于执行一些查询类的命令,如显示信息
一般用于不会修改配置的查询操作
简单理解:/+/主要用于实现MyCAT读操作!
扩展:删除数据集群(不需要操作)

/*+ mycat:dropCluster{"name":"prototype"} */;

第七步:启动MyCAT

/usr/local/mycat/bin/mycat restart

通过查看端口或者进程的方式,确认是否启动:

启动不了,一定要看错误日志:
① 翻译错误
② 养成看日志的习惯,自身存在日志看自身;自身不存在的看messages日志

cat /usr/local/mycat/logs/wrapper.log

配置完成服务启动不了,常见问题:

① master和slave没有对应用户给mycat操作 user password host ② 配置文件语法错误 wrapper.log查看错误解决
12、读写分离集群测试

第一步:测试之前,把node6(mysql01)、node9(mysql02)、mycat机器都拍一个快照
第二步:在db1这个数据库中创建一个测试数据表test_table

-- 选择数据库db1,然后创建一个test_table数据表,表中有两个字段,id与hostname主机名称 use db1; create table test_table( id int auto_increment, hostname varchar(255), primary key(id) );

第三步:插入数据与读取数据测试

-- 向test_table表中插入一条数据 -- @@hostname是MySQL内置变量,表示当前主机名称 insert into test_table(hostname) values (@@hostname); select * from test_table; ----------------------------------------------------------------------------- -- 一定要返回mysql02终端,不能在MyCAT中执行以下语句,然后选择db1数据库,强制向其test_table表中插入一条数据 => 破坏了主从结构 use db1; insert into test_table(hostname) values (@@hostname); ----------------------------------------------------------------------------- -- 返回MyCAT查看读是否进行分离 select * from test_table; -- 通过以上查询结果可知,MyCAT已经将读操作进行了分离,默认采用轮询算法,1次mysql01,1次mysql02

常见问题:
① 遇到问题不要紧张,翻译错误,看日志,如果实在翻译有问题,可以使用大模型读取错误或者日志的最后50行左右或者具体报错的内容。
② 注意事项:MyCAT、MySQL8都属于高内存型应用,MyCAT(Java开发)、MySQL8(不低于6G内存),如果MyCAT、MySQL8内存低于6G,MyCAT本身无法启动,Java异常,8066打开的,但是就是连接不上!
③ mycat与mysql01、mysql02数据不一致,比如mycat有一个db1数据库,但是mysql01和mysql02没有,就会导致出现异常,mycat无法启动。
解决思路:因为数据不一致,只能对MyCAT进行重置

清理一些文件:
cd /usr/local/mycat/conf
rm -rf clusters/prototype.cluster.json
rm -rf datasources/rwSep

rm -rf schemas/db1.schema.json*
删除完成后,重启MyCAT

13、Cluster集群配置选项说明

vim /usr/local/mycat/conf/clusters/prototype.cluster.json
readBalanceType:查询负载均衡策略

可选值 : BALANCE_ALL( 默认值 ) 获取集群中所有数据源,读取操作轮询所有机器 BALANCE_ALL_READ( 一主多从 ) 获取集群中允许读的数据源,获取所有从服务器,然后在这些机器上轮训 BALANCE_READ_WRITE 获取集群中允许读写的数据源 ,但允许读的数据源优先,所有机器参与读操作,优先从服务器 BALANCE_NONE 获取集群中允许写数据源 ,即主节点中选择,所有读操作都直接打在主服务器上

switchType:主从切换

NOT_SWITCH: 不进行主从切换 SWITCH: 进行主从切换

MyCAT不仅可以实现读写分离,还能实现高可用操作。
SWITCH(默认):如果主从服务器中的主服务器宕机了,则从服务器则会自动升级为主服务器。
NOT_SWITCH:正好相反,如果主从服务器中的主服务器宕机了,则从服务器不会升级为主服务器。

这里说的MyCAT主从切换 和 MGR中的主从切换有所不同,MGR主从切换,是真正意义的主从切换。主节点宕机了,则从节点选举出新的主节点,选择了新主节点以后,其他的所有从节点都会自动重定向到主节点,成为其的附属节点(从节点)。
而MyCAT中的主从切换,强调的请求路由地址,如果主节点心跳检测失败,则系统会自动移除此节点,然后把所有的写入操作转入从节点。在MyCAT层面已经实现了主从切换,但是MySQL本质并没有进行切换操作。
MyCAT + 配合Shell脚本、配合Keepalived、配合MGR一起做高可用 + 读写分离集群!

四、MyCAT客户端与管理端

1、客户端

直接面向客户(MySQL软件、DataGrip软件、Web服务器)
测试查看代理客户端 8066,负责对接Web

#安装mysql客户端(mysql-server服务器端,mysql客户端) yum install mysql -y #mysql -h127.0.0.1 -uroot -p123456 -P8066

启动MyCAT=>通过8066端口代理连接真实数据库服务器:

使用show databases以及show tables操作,查看数据信息。

2、管理端
ss -naltp |grep 9066 LISTEN 0 4096 [::ffff:127.0.0.1]:9066 *:* users:(("java",pid=101467,fd=51))

MyCAT2中和MyCAT有所不同,MyCAT早期版本,9066是可以正常登录,从管理端才能看到集群等信息,但是在MyCAT2中,把所有功能都集成在8066了,所以9066虽然被占用,但是不需要用户参与管理!

五、MyCAT2其他配置

1、修改MyCAT2登录密码
cd /usr/local/mycat/conf/users vim root.user.json { "dialect":"mysql", "ip":null, "password":"itheima123@", # 修改这里 "transactionType":"xa", "username":"root" } 更改完成后,重启mycat软件 /usr/local/mycat/bin/mycat restart
2、修改服务器server配置
cd /usr/local/mycat/conf/ vim server.json { "loadBalance":{ "defaultLoadBalance":"BalanceRandom", "loadBalances":[] }, "mode":"local", "properties":{}, "server":{ "bufferPool":{ }, "idleTimer":{ "initialDelay":3, "period":60000, "timeUnit":"SECONDS" }, "ip":"0.0.0.0", "mycatId":1, "port":8066, "serverVersion":"5.7.31", # 这里添加一行 "reactorNumber":8, "tempDirectory":null, "timeWorkerPool":{ "corePoolSize":0, "keepAliveTime":1, "maxPendingLimit":65535, "maxPoolSize":2, "taskTimeout":5, "timeUnit":"MINUTES" }, "workerPool":{ "corePoolSize":1, "keepAliveTime":1, "maxPendingLimit":65535, "maxPoolSize":1024, "taskTimeout":5, "timeUnit":"MINUTES" } } }

六、整合MyCAT2到NiuShop项目

cd /usr/local/mycat/ vim conf/schemas/niushop.schema.json { "customTables":{}, "globalTables":{}, "normalTables":{}, "schemaName":"niushop", "shardingTables":{}, "views":{} } ------------------------------------------------------------------------------------- #修改schema的配置 #指定niushop逻辑库默认的targetName, mycat会自动加载niushop下已经有的物理表或者视图作为单表. /*+ mycat:createSchema{ "customTables":{}, "globalTables":{}, "normalTables":{}, "schemaName":"niushop", "shardingTables":{}, "targetName":"prototype" } */; #动态添加数据源 /*+ mycat:createDataSource{ "name": "rw_master", "type": "JDBC", "dbType": "mysql", "instanceType": "READ_WRITE", "url": "jdbc:mysql://192.168.88.106:3306/niushop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai", "user": "root", "password": "123" } */; /*+ mycat:createDataSource{ "name": "rw_slave", "type": "JDBC", "dbType": "mysql", "instanceType": "READ", "url": "jdbc:mysql://192.168.88.109:3306/niushop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai", "user": "root", "password": "123" } */; #动态创建读写集群 /*+ mycat:createCluster{ "name": "niushop_cluster", "clusterType": "MASTER_SLAVE", "masters": ["rw_master"], "replicas": ["rw_slave"], "readBalanceType": "BALANCE_ALL" } */; #动态创建 schema 并指定集群 /*+ mycat:createSchema{ "schemaName": "niushop", "targetName": "niushop_cluster", "customTables": {}, "globalTables": {}, "normalTables": {}, "shardingTables": {}, "views": {} } */; ------------------------------------------------------------------------ #查看已有配置 /*+ mycat:showDataSources{} */; /*+ mycat:showClusters{} */; /*+ mycat:showSchemas{} */; #动态删除数据源 / 集群 / schema /*+ mycat:dropDataSource{"name":"rw_master"} */; /*+ mycat:dropCluster{"name":"niushop_cluster"} */; /*+ mycat:dropSchema{"schemaName":"niushop"} */;

更改web01和web02中database.php配置,指向MyCAT,这样NiuShop电商项目就可以实现数据库读写分离 + 高可用架构

vim /www/wwwroot/www.shop.com/niushop/config/database.php

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 9:49:45

MCP协议中context-mode的原理与SQLite FTS5协同实践

1. “context-mode”不是功能开关&#xff0c;而是MCP协议里的一类上下文协商机制你第一次在调试日志里看到context-modestream或context-modefull这种字段时&#xff0c;大概率会下意识把它当成某个软件里的“模式切换按钮”——就像VS Code里切编辑器主题那样&#xff0c;点一…

作者头像 李华
网站建设 2026/10/15 9:49:03

TVBox接口资源全解析与优化配置指南

1. 项目背景与需求解析最近两年&#xff0c;随着智能电视和网络机顶盒的普及&#xff0c;TVBox这类开源播放器应用的用户群体正在快速增长。作为一名长期关注流媒体技术发展的从业者&#xff0c;我注意到一个普遍存在的痛点&#xff1a;普通用户获取稳定可用的播放接口异常困难…

作者头像 李华
网站建设 2026/10/15 9:48:50

SpringBoot与大数据技术在旅游商品管理系统中的应用

1. 项目背景与核心价值旅游商品管理系统作为旅游产业链中的重要环节&#xff0c;其信息化程度直接影响着行业的运营效率和服务质量。传统管理系统往往面临数据孤岛、分析能力薄弱等问题&#xff0c;而基于SpringBoot和大数据技术的解决方案能够有效解决这些痛点。这个毕设项目的…

作者头像 李华
网站建设 2026/10/15 9:48:29

Python虚拟环境隔离失效分析与解决方案

1. 问题现象与本质分析第一次用Python的venv创建虚拟环境时&#xff0c;那种兴奋感我至今记得——直到发现pip install的包全都装到了系统Python里。这种"虚拟环境失效"的现象&#xff0c;其实比想象中更常见。上周帮团队新人排查问题时&#xff0c;发现他电脑里竟有…

作者头像 李华
网站建设 2026/10/15 9:48:28

UnoCSS:原子化CSS的高效实践与配置指南

1. UnoCSS初探&#xff1a;原子化CSS的新选择第一次接触UnoCSS是在重构一个Vue3项目时&#xff0c;当时正被传统CSS方案的维护成本折磨得焦头烂额。这个号称"即时原子化CSS引擎"的工具&#xff0c;用极简的配置就能生成实用的工具类&#xff0c;让我眼前一亮。与传统…

作者头像 李华
网站建设 2026/10/15 9:48:11

H5U PLC结构化文本ST编程实操指南:从梯形图到轴控调试

简介&#xff1a;面向PLC编程人员的H5U-ST简易编程手册&#xff0c;围绕AutoShop软件中的ST&#xff08;结构化文本&#xff09;编程展开&#xff0c;适合需要从梯形图过渡到高级语言编程的自动化工程师。手册系统讲解了ST工程创建、子程序/FB/FC插入、变量声明、D/RW字元件类型…

作者头像 李华