基于Mycat实现读写分离(高并发)

读写分离是一种高并发的方式

将数据库的读压力分摊到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>

先了解几个概念:

  1. writeHost可以参与写和读取,readHost只能参与读取。
  2. readHost从属于writeHost,如果w宕机,则下属的r也无法使用,所以对于配置方法2,如果master宕机,则两台slave也无法提供读服务,不适用。
  3. 但是两台writeHost都参与写入则不是我们想看到的,因此涉及到两个参数

balance和 switchType。

其中,balance指的负载均衡类型,目前的取值有4种:

  1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
  2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
  3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
  4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

switchType指的是切换的模式,目前的取值也有4种:

  1. switchType='-1' 表示不自动切换
  2. switchType='1' 默认值,表示自动切换
  3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
  4. 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,读取数据没有问题,但是写入将失败。

待续

# 数据库 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×