MyCat (二) --------- MyCat 读写分离


一、配置 server.xml 文件

为了看的更清晰,可以将配置文件先下载到本地,使用文本编辑工具进行编辑,注意编码方式设置为 UTF-8。

A、修改之前备份 server.xml

在这里插入图片描述

B、配置 sequenceHandlerType 属性

<property name="sequnceHandlerType">1</property>

指定使用 MyCat 全局序列的类型:

0为本地文件方式,1为数据库方式,2为时间戳序列方式。对于读写分离而言,是不需要考虑主键生成方式的,也就是不需要配置全局序列号的。

C、设置连接 MyCat 时的用户名和密码,逻辑库

<user name="mycat">
    <property name="password">aszhuo123</property>
    <property name="schemas">mycatdb</property>
</user>

D、完整配置信息

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <!-- 1为开启实时统计、0为关闭 -->
        <property name="useSqlStat">0</property>  
        <!-- 1为开启全加班一致性检测、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>  
    
        <property name="sequnceHandlerType">2</property>
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
        <property name="processorBufferPoolType">0</property>
    
        <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(
        如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>
        <!--off heap for merge/order/group/limit      1开启   0关闭-->
        <property name="useOffHeapForMerge">1</property>
        <!--单位为m-->
        <property name="memoryPageSize">1m</property>
        <!--单位为k-->
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <!--单位为m-->
        <property name="systemReserveMemorySize">384m</property>
        <!--是否采用zookeeper协调切换  -->
        <property name="useZKSwitch">true</property>
    </system>
    
    <user name="mycat">
        <property name="password">aszhuo1123</property>
        <property name="schemas">mycatdb</property>
    </user>
    
    <user name="user">
        <property name="password">user</property>
        <property name="schemas">mycatdb</property>
        <property name="readOnly">true</property>
    </user>
</mycat:server>

二、配置 schema.xml 文件

A、修改之前备份 schema.xml

在这里插入图片描述

B、配置 schema

作用 :

schema 用于配置逻辑库

配置说明 :

只做读写分离,不做分库分表,MyCat 只是帮我们转发一下请求,读转发到从库,写转发到主库,则 schema 标签里面不用配置 table。

给 schema 标签加上属性 dataNode,配置 dataNode 的名字(name)。

最终配置如下

<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>

C、配置 dataNode

作用 :

dataNode 定义了 MyCat 中的数据节点,也就是我们通常说的数据分片,一个 dataNode 标签就是一个独立的数据分片,通俗理解,一个分片就是一个物理数据库。

配置说明 :

name

定义数据节点的名字,这个名字需要是唯一的,这个名字在schema里面会使用到;

dataHost

用于定义该分片属于哪个数据库实例的,属性值是引用dataHost标签上定义的name属性;

database

用于对应真实的数据库名,必须是真实存在的;

最终配置

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

D、配置 dataHost

作用:

定义具体的数据库实例、读写分离配置和心跳语句。

配置说明:

balance 属性

负载均衡类型,目前的取值有4种:
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设置为1

writeType 属性

已过时,1.6 版本就不用了

switchType 属性

用于指定主服务器发生故障后的切换类型 ,-1 表示不自动切换
1 默认值,自动切换 (推荐)
2 基于MySQL主从同步的状态决定是否切换
3 基于MySQL galary cluster的切换机制 (适合集群) (1.4.1)
通常情况下,我们 MySQL 采用双主双从的模式下,switchType 为 1 即可。因为双主从模式下,主从同步关系很复杂,不能根据 MySQL 的状态来切换。只需要在一个主出问题后,切换到另外的主。

heartbeat 标签

用于和后端数据库进行心跳检查的语句,检测 MySQL 数据库是否正常运行
当 switchType 为 1 时,mysql心跳检查语句是 select user()
当 switchType 为 2 时,mysql心跳检查语句是 show slave status
当 switchType 为 3 时,mysql心跳检查语句是 show status like 'wsrep%'

writeHost 与 readHost 标签

这两个标签都指定后端数据库的相关配置给 mycat,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例,组合这些读写实例来满足系统的要求。

在一个 dataHost 内可以定义多个 writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机系统会自动的检测到,并切换到备用的writeHost 上去。

推荐配置

switchType 设置为 1,表示自动切换主从
heartbeat 语句为 select user()
balance 一般设置为 1 即可

一主两从配置示例:

<!--配置逻辑库-->
<schema name="mydb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>

<!--配置数据分片节点-->
<dataNode name="dn1" dataHost="localhost1" database="db1"/>

<!--配置节点主机:定义具体的数据库实例、读写分离配置和心跳语句-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" salveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.230.129:3307" user="root" password="aszhuo123">
        <readHost host="hostS1" url="192.168.230.129:3309" user="root" password="aszhuo123">
        <readHost host="hostS2" url="192.168.230.129:3310" user="root" password="aszhuo123">
    </writeHost> 
</dataHost>

双主双从配置示例

<!--配置逻辑库-->
<schema name="mydb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>

<!--配置数据分片节点-->
<dataNode name="dn1" dataHost="localhost1" database="db1"/>

<!--配置节点主机:定义具体的数据库实例、读写分离配置和心跳语句-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" salveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.230.129:3307" user="root" password="aszhuo123">
        <readHost host="hostS1" url="192.168.230.129:3309" user="root" password="aszhuo123">
    </writeHost>
    <writeHost host="hostM2" url="192.168.230.129:3308" user="root" password="aszhuo123">  
        <readHost host="hostS2" url="192.168.230.129:3310" user="root" password="aszhuo123">
    </writeHost> 
</dataHost>

E、完整配置信息(双主双从)

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<!--只做读写分离,不做分库分表,Mycat只是帮我们转发一下请求,读转发到从库,写转发到主库,则schema标签里面不用配置table-->
	<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
	<!--配置真实存在的物理数据库-->
	<dataNode name="dn1" dataHost="localhost1" database="test" />
	
	<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="hostM3307" url="localhost:3307" user="root" password="123456">
	        <readHost host="hostS3308" url="localhost:3308" user="root" password="123456" />
	        <readHost host="hostS3309" url="localhost:3309" user="root" password="123456" />
	    </writeHost>
	    <writeHost host="hostM3308" url="localhost:3308" user="root" password="123456">
	        <readHost host="hostS3307" url="localhost:3307" user="root" password="123456" />
	        <readHost host="hostS3310" url="localhost:3310" user="root" password="123456" />
	    </writeHost>
	</dataHost>
</mycat:schema>

三、测试读写分离

A、将修改好的配置文件上传到 MyCat 的 conf 目录下

B、配置好 MySQL 主从复制并启动主从 MySQL (4个)

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.24/data/3307/my.cnf &

C、启动 MyCat

/usr/local/mycat/bin/mycat start

在这里插入图片描述

D、登录 MyCat,在 MySQL 的 bin 目录下

./mysql -umycat -p -P8066 -h 192.168.235.128

在这里插入图片描述

MyCat 默认数据访问端口是 8066

use mycatdb;

在这里插入图片描述

E、创建 dept 表,插入数据,各个数据库都会存在,说明实现了主从复制

create table dept(
	id int(10) primary key AUTO_INCREMENT,
	name varchar(20)
);
insert into dept(id,name) values(1,"development");

在这里插入图片描述

通过 Navicat 修改从库中 User 表数据,从库数据不会同步到主库,在命令行中对查询几次,分别来自不同数数据库,说明实现了负载均衡。
在这里插入图片描述

然后执行 delete from user where name=’Jack-3309’; 不能成功,说明已经实现了读写分离。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值