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

Posted node2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mycat实现mysql读写分离,热切换,集群相关的知识,希望对你有一定的参考价值。

在互联网时代,实现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单点问题,由于篇幅问题,就留在下一篇博客写吧

以上是关于mycat实现mysql读写分离,热切换,集群的主要内容,如果未能解决你的问题,请参考以下文章

基于Mycat中间件的MySQL读写分离

随手记:MyCAT实现MySQL集群与读写分离

mysql与mycat搭建实现集群与读写分离

MyCAT实现MySQL的读写分离

Mariadb安装,主从热备操作步骤,MyCat配置安装实现读写分离

mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离