在互联网时代,实现mysql读写分离,热切换,集群能大大提高mysql数据库访问压力,防止数据丢失,使用mycat能帮我们实现这些。我们要实现的是这种架构。
1、Mycat能实现数据库的垂直切分和水平切分,这里用户写数据的时候,通过mycat把数据按照特定的规则存储到mysql-1,mysql-2,mysq-3…中,读的时候,分布从mysql-1,mysql-2,mysql-3…等读出数据然后由tomcat合并结果给客户端,这样子能分发数据库的压力,实现mysql的集群。
2、Mysql自身能支持主从复制和主主复制,能够在不同服务器的数据库中相互复制数据,这是实现读写分离的前提。
3、Mycat能支持mysql的读写分离,还有热切换,可以在conf下schema.xml配置。
<dataHost name="master1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>show slave statusheartbeat>
<writeHost host="host1" url="192.168.137.101:3306" user="root" password="123" >
<readHost host="host3" url="192.168.137.103:3306" user="root" password="123" />
writeHost>
dataHost>
或
<dataHost name="master2" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>show slave statusheartbeat>
<writeHost host="host2" url="192.168.137.102:3306" user="root" password="123" />
<writeHost host="host4" url="192.168.137.104:3306" user="root" password="123" />
dataHost>
第一种的缺点是,当主down了之后,从也就不能读了,第二种,当主挂了,从还可以切换,继续可以用,上面的架构图中,我们采用第二种模式,另外在同步数据的时候,我们为什么要处理充主主同步,而不是主从同步呢,原因是,当主挂了之后,作为热备的mysql可以切换作为主继续服务,然后我们可以恢复原先down的mysql机器,那么他就可以同步数据了。如果是主从的话,当主down了之后,从切换为主,但是当原因的主重启之后,就很难同步从的mysq的数据了。那我们就来配置下上面那个架构
1、配置conf/schema.xml,配置切片集群,还有读写分离,热切换,主主数据的同步,参考http://blog.csdn.net/yingxiake/article/details/51691986和http://blog.csdn.net/yingxiake/article/details/51693537
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_fenpian" dataNode="dn1,dn2" rule="rule1" primaryKey="id"/>
schema>
<dataNode name="dn1" dataHost="master1" database="fenpian" />
<dataNode name="dn2" dataHost="master2" database="fenpian" />
<dataHost name="master1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>show slave statusheartbeat>
<writeHost host="host1" url="192.168.137.101:3306" user="root" password="123" />
<writeHost host="host3" url="192.168.137.103:3306" user="root" password="123" />
dataHost>
<dataHost name="master2" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>show slave statusheartbeat>
<writeHost host="host2" url="192.168.137.102:3306" user="root" password="123" />
<writeHost host="host4" url="192.168.137.104:3306" user="root" password="123" />
dataHost>
mycat:schema>
这里要说下,mycat读写分离的一些关键配置,按照官方文档说明:
a. 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 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。
b. writeType 属性,负载均衡类型,目前的取值有 3 种:
1. writeType=”0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType=”1”,所有写操作都随机的发送到配置的 writeHost。
3. writeType=”2”,没实现。
c. switchType 属性
- -1 表示不自动切换
- 1 默认值,自动切换
- 2 基于MySQL 主从同步的状态决定是否切换
2、配置conf/schema.xml了,需要配下分片规则,在/conf/rule.xml
<mycat:rule xmlns:mycat="http://org.opencloudb/">
<tableRule name="rule1">
<rule>
<columns>idcolumns>
<algorithm>func1algorithm>
rule>
tableRule>
<function name="func1" class="org.opencloudb.route.function.PartitionByLong">
<property name="partitionCount">2property>
<property name="partitionLength">512property>
function>
mycat:rule>
3、配置下链接mysql的帐号信息等,/conf/server.xml
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparserproperty>
system>
<user name="test">
<property name="password">testproperty>
<property name="schemas">testproperty>
user>
<user name="user">
<property name="password">userproperty>
<property name="schemas">testproperty>
<property name="readOnly">trueproperty>
user>
mycat:server>
4、进行测试步骤,可以按如下方式进行,本人测试通过,mycat是放在windows上,四个mysql是放在linux rhel7的四个虚拟机上。
a.验证分片规则集群,在mycat分别插入id为1还有id为513的数据,看看是否能根据id的分片规则,分布差到俩个数据库中,1在0~512,应该到101的数据库中,513在512~1024应该到102的数据库中
b.验证主主数据是否同步,查看年103还有104的数据是否和101和102的数据库数据一致
c.验证热切换,将101down掉,103是否能继续服务,读写是否正常,然后再启动101,是否正常
d.读写分离在主主同步的架构下,还没想出测试的方式,再看看。
现在这个架构还存在一个问题,就是mycat单点问题,由于篇幅问题,就留在下一篇博客写吧