MyCat - 高级 - 读写分离 - 一主一从读写分离配置 | 学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 快速学习MyCat - 高级 - 读写分离 - 一主一从读写分离配置

开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 高级 - 读写分离 - 一主一从读写分离配置】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/756/detail/13280


MyCat - 高级 - 读写分离 - 一主一从读写分离配置

内容介绍:

一、读写分离原理

二、读写分离配置

 

一、读写分离原理

1、读写分离原理

MyCat 如何来完成 mysql 的读写分离。首先,读写分离的原理。

image.png

如上图:右边部分 MySQL 的主从复制已经搭建完成,是基于 binlog 来完成的主从复制。现在要做的是读写分离,读写分离,简单的说就是把数据库的读操作和写操作分开,读操作走从库,而写操作走主数据库。主数据库在 MyCat 当中也叫做 writeHost,就是写入的主机,而读数据库在 Mycat 当中也叫做 readHost,也就是读取的主机。读写分离之后,就可以降低单台服务器数据库的压力。通过 Mycat 就可以轻松的完成读写分离,让我们的 DML 语句也就是增删改的语句,走 writeHost主节点,而 select 语句查询语句,直接走从节点。MyCat 可以轻松完成这个。要想完成这个功能,还需要在 MyCat 当中进行适当的配置。

读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。

通过 MyCat 即可轻易实现上述功能,不仅可以支持 MySQL,也可以支持 Oracle 和 SQL Server。

MyCat 控制后台数据库的读写分离和负载均衡由 schema. Xml 文件 datahost 标签的 balance 属性控制。

 

二、读写分离配置

1、配置如下

(1)检查 MySQL 的主从复制是否运行正常 .

(2)修改 MyCat 的 conf/schema. Xml 配置如下:

<? xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM"schema. dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="ITCAST"checkSQLschema="true"sqlMaxLimit="100">

<table name="user"dataNode="dn1"pr i maryKey="id"/>

</schema>

<dataNode name="dn1"dataHost="localhost1"database="db01"/>

<dataHost name="localhost 1"maxCon="1000"mince="1"write Type="0"db Type="mysql"

dbDriver="native"switchType="1"slaveThreshold="100">

heartbeat>select user()</heartbeat><writeHosthost="hastM1"url="192.168.192.147:3306"user="root"password="itcast"><readHosthost="hostS1"url="192.168.192.149:3306"user="root"password="itcast"/>

</writeHost>

</dataHost>

</mycat:schema>

①首先,先需要在 schema.xml 当中配置逻辑库以及数据节点和节点主机。需要打开 Notepad++,然后再 schema.xml 当中做一个修改。在修改之前,先把这个文件备份一下,关闭当前文件。找到 local 下面 有一个 mycat,在 mycat 当中把 schema.xml 做一个备份。点击 Rename File,把 schema.xml 修改为 schema_parittion.xml,这是我分片规则用到的配置。然后再去创建一个新的文件,点击 create new file,把文件名修改为 schema.xml。

②如上部分代码,首先看第一个 schema,schemea 声明的是逻辑库,逻辑库取了一个库名 ITCAST,checkSQLschema 指的是是否去过滤逻辑库的库名,limit 是分页的限制;逻辑表的表明叫 user,这个 user 是刚才测试的 user;dataNode 我们只配置了一个 dn1,指定了一个主件 primaryKey 为 id,刚才这个表的主件就是 id。

image.png

逻辑库以及逻辑表的配置就已经完成了。继续来看,配置了 dataNode 为 dn1,dn1 关联的是 localhost1,还有一个 database,database 数据库用的都是 db01这个数据库。因为主从复制我们复制的就是 db01。heartbeat 心跳不用动。里面的标签需要重点说明,一个是 writehost,writehost 代表的是写的主机,他实际上指的是 MySQL 的主节点。因为写是走主节点,需要把服务器改为 157,用户名 root,密码 itcast;如果是从节点就是读的主机,readhost 就是读的主机,就是从节点,它的IP地址应该是 192.158:3306,用户名 root,密码 itcost,这样配置就可以了。writehost  配置的是主节点,也就是主库,read host 配置的是从库,写会走主库,读会走从库。到底是不是这样配置,还要取决于一个参数,取决于 balance 这个参数,balance 的取值为 0,1,2,3。假如把 balance 的取值改为0,改为 0 之后到底是什么现象,测试之后在看。这样 schema 的配置我们就已经配置好了。

<? xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM"schema. dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="ITCAST"checkSQLschema="true"sqlMaxLimit="100">

<table name="user"dataNode="dn1"pr i maryKey="id"/>

</schema>

<dataNode name="dn1"dataHost="localhost1"database="db01"/>

<dataHost name="localhost1"maxCon="1000"mince="10"balance="0" writeType=”0” db Type="mysql"

dbDriver="native"switchType="1"slaveThreshold="100">

heartbeat>select user()</heartbeat><writeHosthost="hastM1"url="192.168.192.157:3306"user="root"password="itcast"><readHosthost="hostS1"url="192.168.192.159:3306"user="root"password="itcast"/>

</writeHost>

</dataHost>

</mycat:schema>

③还需要配置一个 server.xml。因为改了一个逻辑库的库名叫 ITCAST,所以需要在 server.xml 中,需要把 PARTITION_DB 改为 ITCAST。

image.png

所有配置配置完成之后,需要重新启动 MyCat,重新启动 my cat 需要执行 bin 目录下的 bin/mycat start,启动完成之后需要连接 MyCat,mysql -h 127.0.0.1 -P 8066 -u root -p,MyCat 已经连接上了。接下来执行一个 show databases,ITCAST 逻辑库也已经有了,use ITCAST 切换逻辑库,切换完成之后 show  tables 来查看表,里面就一张表 user 表。接下来,执行操作 select *from user,数据是查询到了,现在想知道这个读操作,select 操作,到底有没有走刚才配置的从节点,到底走了哪个节点,怎么判断?这个时候需要再打开一个窗口,再打开一个窗口去查看 MyCat 的日志 /user/local/mycat,在 my cat 的 logs 目录下,有对应的日志。但是在查看日志之前,先需要修改日志级别,cd  conf/当中然后修改日志级别,log4j2.xml,按 G 切换到最后。需要把这个日志级别修改为 debug,修改为 debug 之后才能看到。cd..,切换到 logs/ 目录下 tail  -f mycat.log,我们再执行两次查询,

image.png

SELECT *FROW user LIMIT100 这条语句执行了,他走的是 157 这个节点。再来试一次,再查一次,走的还是 157;再来查一次,走的还是 157,现在做的查询操作一直在走 157,157 是主节点,也就是现在主从复制并没有生效。

④原因是因为 balance,balance 的含义是 My cat 当中的负载均衡类型,有四种。Balance 为 0 不开启读写分离机制,所有的读操作都发送到 writeHost, writeHost 就是主节点,主数据库。所以这不能配置为零,配置为 0 代表的是不开启读写分离。balance 如果配置为 1 代表的是全部的 readHost,也就是从节点和 stand by writeHost,这个叫备用的主节点,就是主库的一个备库,所有的读的节点和备用的 writeHost 都会参与到 select 语句的负载均衡,这主要用的是双主双从模式。在一主一从的情况下,也可以用 balance 为 1。然后把 balance 改为 1,是什么样的情况。改了之后需要重启 MyCat,再打开一个窗口重启 MyCat ,/user/local/mycat,需要重新启动 MyCat,bin 目录下的 bin/mycat restart,重启完成。大家再来看,重新执行一下,因为他已经断开了,看一下这个日志到底走的是哪个节点,需要重新开启一下,查询,现在走的是 158,再查询一次,走的是 158 节点,现在我们执行 select,走的都是 158 这个节点。

image.png

这样的话就成功了,至少我们读这个操作是走了主节点。

⑤接下来需要验证的是,插入的操作到底是走哪个节点,insert  into user 在这我们需要插入的是 values,插入 4,再来一个 cat 和 1,insert into user values(4,‘Cat’,‘1’)直接执行。我们在执行的时候已经操作成功了,select * from user,看上面连接的是谁,不要连接错了,我们连接的是 MyCat。下面在进行操作的时候,已经插入进来了,重要的是我们刚才 insert 操作插入到哪了。找到 insert,这是 insert 操作,他操作的是 157。

image.png

再做一个测试,查询他走的是 158 节点,在查询走的是 158,在这执行插入 insert 的操作 insert into user values(5,‘Cat2’,‘1’),注意先清空日志,执行完毕之后,insert 操作走的是 157 这个节点。再来执行一个更新操作 update user set sex= ‘0’;更新完成,执行的 update 语句,他走的是 157 节点。

⑥这样就可以通过 balance 属性设置他的负载均衡策略。如果 balance 为 1 代表的是开启读写分离,在一主一从的,模式下已经开启了读写分离。Balance 为 2 代表的是将所有的读写操作都随机分发到 writeHost 和 readHost 上。Balance 为3代表的是将所有的读请求随机分发到 writeHost 对应的 readHost 上执行,而 writeHost 不负但读的压力。实际 balance 也可以改成 3,测试一下,重启,重启完成之后,再来进行测试。把日志先清空,先来执行查询操作,需要把日志重新开一下,查询走的是 158,再查询走的依然是 158,接下来再来更新,更新为 1,更新走的是 157。balance 为 1 balance 为 3 实际上代表的都是开启读写分离,读走主节点或者说走 readHost,而写则走 writeHost。

⑦ checkSQLschema

当该值设置为 true 时,如果我们执行语句 "select*from test01. user;"语句时, My Cat 则会把 schema 字符去掉,可以避免后端数据库执行时报错 ;

balance

负载均衡类型,目前取值有4种:

balance="0":不开启读写分离机制,所有读操作都发送到当前可用的 writeHost上.

balance="1": 全部的 readHost 与 stand by writeHost (备用的 writethost) 都参与 select 语句的负载t恤,简而言之,就是采用双主双从模式( M1-->51,M2-->S2,正常情况下, M2,51,52 都参与 select 语句的负载均衡。);

balance="2": 所有的读写操作都随机在 writeHost ,readHost 上分发

balance="3": 所有的读请求随机分发到 writeHost 对应的 readhost 上执行, writeHost 不负担读压力; balance=3 只在 MyCat1.4 之后生效 .

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 关系型数据库 MySQL
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
1025 0
|
5月前
|
cobar 关系型数据库 MySQL
使用MyCat实现MySQL主从读写分离(一)概述
【8月更文挑战第11天】MySQL读写分离通过主从复制分散负载,主库负责写操作,从库承担读查询,以复制技术确保数据一致性。此策略有效缓解锁竞争,提升查询效能并增强系统可用性。实现方式包括应用层处理,简便快捷但灵活性受限;或采用中间件如MyCAT、Vitess等,支持复杂场景但需专业团队维护。
166 0
|
6月前
|
SQL 存储 关系型数据库
Mycat 实现分库分表及读写分离
Mycat 实现分库分表及读写分离
98 0
|
8月前
|
中间件 数据库
mycat2.X读写分离
mycat2.X读写分离
148 9
|
运维 关系型数据库 MySQL
MyCat-架构剖析-MyCat 主从切换实现 | 学习笔记
快速学习 MyCat-架构剖析-MyCat 主从切换实现
MyCat-架构剖析-MyCat 主从切换实现 | 学习笔记
|
SQL 关系型数据库 MySQL
Mycat的读写分离
MySQL主从复制原理
106 1
|
SQL 存储 关系型数据库
MyCat - 高级 - 读写分离 - 主从复制(一主一从)搭建 | 学习笔记
快速学习 MyCat - 高级 - 读写分离 - 主从复制(一主一从)搭建
MyCat - 高级 - 读写分离 - 主从复制(一主一从)搭建 | 学习笔记
|
关系型数据库 MySQL 中间件
MyCat-高级-读写分离-双主双从架构 | 学习笔记
快速学习 MyCat-高级-读写分离-双主双从架构
MyCat-高级-读写分离-双主双从架构 | 学习笔记
|
SQL 关系型数据库 MySQL
MyCat-高级-读写分离-双主双从搭建 | 学习笔记
快速学习 MyCat-高级-读写分离-双主双从搭建
MyCat-高级-读写分离-双主双从搭建 | 学习笔记
|
负载均衡 关系型数据库 MySQL
MyCat - 高级 - 读写分离 - MyCat 实现 MySQL 双主双从读写分离 | 学习笔记
快速学习 MyCat - 高级 - 读写分离 - MyCat 实现 MySQL 双主双从读写分离
MyCat - 高级 - 读写分离 - MyCat 实现 MySQL 双主双从读写分离 | 学习笔记