数据库运维
记录DBA学习成长历程

MyCAT读写分离及高可用配置

配置文件简单介绍

逻辑库:schema

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> 
</schema> 
逻辑库将来访问的时候定义到dn1节点上
登入MyCAT
[root@db01 ~]# mysql -uroot -p123456 -h 127.0.0.1 -P8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+

数据节点:datanode

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

数据主机:datahost(w和r)

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"> 
<heartbeat>select user()</heartbeat> 
<writeHost host="db1" url="10.0.0.200:3307" user="root" password="123"> 
<readHost host="db2" url="10.0.0.200:3309" user="root" password="123" /> 
</writeHost> 
</dataHost>

读写分离结构配置

vim schema.xml 
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database= "world" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mys
ql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="db1" url="10.0.0.200:3307" user="root" password="123">
<readHost host="db2" url="10.0.0.200:3309" user="root" password="123" />
</writeHost>
</dataHost>
</mycat:schema>
重启mycat
mycat restart
读写分离测试
mysql> use TESTDB
mysql -uroot -p -h 127.0.0.1 -P8066
show variables like 'server_id';
begin;
show variables like 'server_id';
总结: 
以上案例实现了1主1从的读写分离功能,写操作落到主库,读操作落到从库.如果主库宕机,从库不能在继续提供服务了。

配置读写分离及高可用

[root@db01 ~]# cd /data/mycat/conf/
[root@db01 conf]# mv schema.xml schema.xml.rw
[root@db01 conf]# vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1"> 
</schema> 
<dataNode name="sh1" dataHost="db" database= "world" /> 
<dataHost name="db" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbD
river="native" switchType="1"> 
<heartbeat>select user()</heartbeat> 
<writeHost host="db1" url="10.0.0.200:3307" user="root" password="123">
<readHost host="db2" url="10.0.0.200:3309" user="root" password="123" />
</writeHost> 
<writeHost host="db3" url="10.0.0.201:3307" user="root" password="123">
<readHost host="db4" url="10.0.0.201:3309" user="root" password="123" />
</writeHost> 
</dataHost> 
</mycat:schema>
真正的 writehost:负责写操作的writehost 
standby writeHost :和readhost一样,只提供读服务
当写节点宕机后,后面跟的readhost也不提供服务,这时候standby的writehost就提供写服务,
后面跟的readhost提供读服务
测试:三读一写
mysql -uroot -p123456 -h 127.0.0.1 -P 8066
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 19 |
+-------------+
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 9 |
+-------------+
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 17 |
+-------------+
mysql> begin;select @@server_id;commit;
+-------------+
| @@server_id |
+-------------+
| 7 |
+-------------+
对db01 3307节点进行关闭,测试读写高可用操作,一写一读
[root@db01 conf]# systemctl stop mysqld3307
17为写节点,19为读节点
对db01 3307节点进行启动,测试读写高可用操作,一写三读
17为写节点,7,9,19为读节点

配置中的属性介绍

balance属性

负载均衡类型,目前的取值有3种: 
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。 
2. balance="1",全部的readHost与standby writeHost参与select语句的负载均衡,简单的说,
当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。 
3. balance="2",所有读操作都随机的在writeHost、readhost上分发。

writeType属性

负载均衡类型,目前的取值有2种: 
1. writeType="0", 所有写操作发送到配置的第一个writeHost,
第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为主,切换记录在配置文件中:dnindex.properties . 
2. writeType=“1”,所有写操作都随机的发送到配置的writeHost,但不推荐使用

switchType属性

-1 表示不自动切换 
1 默认值,自动切换 
2 基于MySQL主从同步的状态决定是否切换 ,心跳语句为 show slave status

datahost其他配置

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
maxCon="1000":最大的并发连接数
minCon="10" :mycat在启动之后,会在后端节点上自动开启的连接线程
tempReadHostAvailable="1"
这个一主一从时(1个writehost,1个readhost时),可以开启这个参数,如果2个writehost,2个readhost时
<heartbeat>select user()</heartbeat> 监测心跳
赞(1)
MySQL学习笔记 » MyCAT读写分离及高可用配置