您的位置:首页 > 数据库 > MySQL

mycat实现mysql读写分离,热切换,集群

2016-06-17 10:40 896 查看
在互联网时代,实现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 status</heartbeat>
<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 status</heartbeat>
<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/51691986http://blog.csdn.net/yingxiake/article/details/51693537

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<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" />

<!--切片mysql-1-->
<dataHost name="master1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>show slave status</heartbeat>
<!--主,用于写-->
<writeHost host="host1" url="192.168.137.101:3306" user="root" password="123" />
<!--主2,用于读,host1 down了,自动切换为主,读写都可以-->
<writeHost host="host3" url="192.168.137.103:3306" user="root" password="123" />
</dataHost>
<!--切片mysql-2-->
<dataHost name="master2" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>show slave status</heartbeat>
<!--主1,用于写-->
<writeHost host="host2" url="192.168.137.102:3306" user="root" password="123" />
<!--主2,用于读,host2 down了,自动切换为主,读写都可以-->
<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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>

<function name="func1" class="org.opencloudb.route.function.PartitionByLong">
<property name="partitionCount">2</property>
<property name="partitionLength">512</property>
</function>
</mycat:rule>


3、配置下链接mysql的帐号信息等,/conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="test">
<property name="password">test</property>
<property name="schemas">test</property>
</user>

<user name="user">
<property name="password">user</property>
<property name="schemas">test</property>
<property name="readOnly">true</property>
</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单点问题,由于篇幅问题,就留在下一篇博客写吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息