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问题

相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull5 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花6 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸6 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain6 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java7 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿7 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb