开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 高级 - 读写分离 - 一主一从读写分离配置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13280
MyCat - 高级 - 读写分离 - 一主一从读写分离配置
内容介绍:
一、读写分离原理
二、读写分离配置
一、读写分离原理
1、读写分离原理
MyCat 如何来完成 mysql 的读写分离。首先,读写分离的原理。
如上图:右边部分 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。
逻辑库以及逻辑表的配置就已经完成了。继续来看,配置了 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。
所有配置配置完成之后,需要重新启动 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,我们再执行两次查询,
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 这个节点。
这样的话就成功了,至少我们读这个操作是走了主节点。
⑤接下来需要验证的是,插入的操作到底是走哪个节点,insert into user 在这我们需要插入的是 values,插入 4,再来一个 cat 和 1,insert into user values(4,‘Cat’,‘1’)直接执行。我们在执行的时候已经操作成功了,select * from user,看上面连接的是谁,不要连接错了,我们连接的是 MyCat。下面在进行操作的时候,已经插入进来了,重要的是我们刚才 insert 操作插入到哪了。找到 insert,这是 insert 操作,他操作的是 157。
再做一个测试,查询他走的是 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 之后生效 .