使用MyCat实现MySQL读写分离
说明
配置MyCat读写分离前需要先配置MySQL的主从复制
配置MyCat账号密码和数据库名
MyCat作为数据库的中间件,对于上层应用来说,就是一个数据库。因此需要配置数据库的用户名,密码,数据库名,以及读写权限。
下面是MyCat的默认配置(server.xml):
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
user节点配置用户信息,详细说明如下:
name
登录的用户名,也就是连接Mycat的用户名password
登录的密码,也就是连接Mycat的密码schemas
数据库名,这里会和schema.xml
中的配置关联,多个用逗号分开,例如这个用户需要管理两个数据库db1,db2,则配置db1,dbs
这里修改如下(只需要改动user节点信息即可):
<user name="root">
<property name="password">123456</property>
<property name="schemas">db_test</property>
</user>
在 schema.xml 文件中配置读写分离
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 数据库配置,与server.xml中的数据库对应 -->
<schema name="db_test" checkSQLschema="false" sqlMaxLimit="100" dataNode="db_node"></schema>
<!-- 分片配置 -->
<dataNode name="db_node" dataHost="db_host" database="db_test" />
<!-- 物理数据库配置 -->
<dataHost name="db_host" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="mysql_master:3306" user="root" password="apple">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="mysql_slaver:3306" user="root" password="apple" />
</writeHost>
</dataHost>
</mycat:schema>
这里有几个配置需要说明下:
sqlMaxLimit
,配置默认查询数量database
,真实数据库名balance="0"
,不开启读写分离机制,所有读操作都发送到当前可用的writeHost
上balance="1"
,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1, M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡balance="2"
,所有读操作都随机的在 writeHost、readhost 上分发balance="3"
,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意balance=3
只在 1.4 及其以后版本有,1.3 没有writeType="0"
,所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中dnindex.properties
writeType="1"
,所有写操作都随机的发送到配置的 writeHostwriteType="2"
,没实现switchType="-1"
,表示不自动切换switchType="1"
,默认值,自动切换switchType="2"
,基于MySQL 主从同步的状态决定是否切换
启动MyCat
在MyCat所在的服务器启动
./mycat start
mysql -uroot -p123456 -P8066 -h127.0.0.1
#stop
./mycat stop
连上之后跟普通的MySQL一模一样
使用Navicat连接MyCat
在外网(相对虚拟机而言)访问MyCat,需要配置ip白名单。
配置文件在server.xml
中
<!-- 全局SQL防火墙设置 -->
<firewall>
<whitehost>
<host host="192.168.10.8" user="root"/>
<host host="127.0.0.1" user="root"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
这里192.168.10.8
为我本机相对虚拟机的ip地址,这里要说明下,如果配置了ip白名单,则127.0.0.1
也是要加上才能本地访问的,不然会被拒绝掉。
测试
(1)通过在MyCat中插入数据检测是否主从复制配置成功
(2)通过修改从数据库的数据来验证是否读写进行分离
可以看到,MyCat读取的是从库的数据。说明MyCat读写分离功能已经实现。
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/12/implement-mysql-read-write-separation-using-mycat/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论