读写分离是一种高并发的方式
将数据库的读压力分摊到slave节点,性能不够,机器来凑,可以一定程度上缓解数据库压力。
但是这种建议在这之前能上 缓存 的数据还是先上缓存吧。
前情提要:
先配置成功一个一主多重的mysql组,参考:
http://www.younian.me/archives/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6
安装MyCat
网址:http://dl.mycat.io/ 下载解压,本章使用win版
Mysql组结构:
1主(localhost:3306) + 1从 (localhost:3307)
配置Mycat
server.xml
保存mycat的连接信息,不用修改,比如
<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>
schema.xml
主要的连接配置以及读写配置、分片配置都在这个文件中,比较重要:
指定mycat数据库连接哪些DataNode节点信息,可以进行表级别的配置:
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1,dn2">
</schema>
配置dataNode信息,使用具体的哪个连接信息以及使用的具体数据库
<dataNode name="dn1" dataHost="localhost1" database="test" ></dataNode>
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="root"/>
<writeHost host="hostS1" url="localhost:3307" user="root" password="root"/>
</dataHost>
对于2个节点的组合有2种,上面是一种,为了集中比较再复制一遍:
1:
<writeHost host="hostM1" url="localhost:3306" user="root" password="root"/>
<writeHost host="hostS1" url="localhost:3307" user="root" password="root"/>
2:
<writeHost host="hostM1" url="localhost:3306" user="root" password="root">
<readHost host="hostS1" url="localhost:3307" user="root" password="root" />
</writeHost>
先了解几个概念:
- writeHost可以参与写和读取,readHost只能参与读取。
- readHost从属于writeHost,如果w宕机,则下属的r也无法使用,所以对于配置方法2,如果master宕机,则两台slave也无法提供读服务,不适用。
- 但是两台writeHost都参与写入则不是我们想看到的,因此涉及到两个参数
balance和 switchType。
其中,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不负担读压力
switchType指的是切换的模式,目前的取值也有4种:
- switchType='-1' 表示不自动切换
- switchType='1' 默认值,表示自动切换
- switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
- switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
综上我们最后的配置可以定为:balance="1",switchType="-1"。这种情况下写数据只会写入到master,并且即使master对用的writeHost宕机也能通过slave提供读服务。
启动测试
- 启动master和slave并配置master
- 启动mycat:临时启动使用:
startup_nowrap.bat
- 数据库工具链接mycat,端口号默认
8066
,账号密码使用server.xml中配置的密码
- 直接修改TESTDB,在主从中会看到相应的数据
- 手动kill掉master,读取数据没有问题,但是写入将失败。
待续