一、配置 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’;
不能成功,说明已经实现了读写分离。