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

使用mycat 读写分离mysql

2016-07-08 09:15 344 查看
机器准备

1、mysql 主从配置
http://blog.csdn.net/convict_eva/article/details/51734853
    主  192.168.192.128

    从  192.168.192.129

2、mycat服务器    192.168.192.133

安装jdk

下载mycat(mycat 社区 http://www.mycat.org.cn/),并解压到/usr/local目录下

3、修改/usr/local/mycat/conf/schema.xml 配置

<mycat:schema xmlns:mycat="http://org.opencloudb/" >
<!-- TESTDB 类似mysql中的数据库,全局唯一 ,
dataNode 指定 此schema 对应的数据库-->

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn_master">

                <!-- auto sharding by id (long) -->

        </schema>

      <!-- 配置数据结点,对应真实的数据库
      name 全局唯一
     database
对应真实数据库中的dabase 
     dataHost
对应配置的dataHost结点名称 -->
     <dataNode name="dn_master" dataHost="master" database="test_db"
/>

     <!--
 
     name
全局唯一
     maxCon
minCon 对应初始化连接数
     dbType
对应数据库类型,dbDriver 驱动
     wirteType:
"0" 所有的写操作发送到配置的第一个writeHost,第一个挂了切换到第二个wirteHost,重新启动后以切换的为准。切换记录在配置文件    
   dnindex.properties
中,"1":所有有写操作随机发送到writeHost 中,1.5 不推荐
     switchType:"-1"
表示不自动切换,"1"默认值,自动切换,"2" 基于MySQL 主人同步的状态决定是否切换(心跳语句为 show slave status)

     MyCat
心跳机制通过检测show slave status 中的"seconds_behind_master","slave_io_running","slave_sql_runing" 三个字段来确定当前主从同步的状态以及seconds_behind_master 主从复制延时,当seconds_behind_master>slaveThreshold时,读写分离筛选器会过滤掉此slave机器,防止读到脏数据,当主节点宕机后,切换逻辑会检查slave上的seconds_behind_master
是否为0,为0时则表示主从同步,可以安全切换,否则不切换。

     切换后的dn 配置在dnindex.properties 配置文件中,重启mycat 以此文件为准

balance 
0  不开启读写分享,所有的读操作都发送到当前可用的writehost 上
1  全部readHost 与stand by writeHost 参与select 语句负载均衡。简单的说,当双主双从模式(m1->s1,m2-s2,并且 m1 m2 互为主备),正常情况下,m2 s1 s2 都参与select 语句的负载均衡
2  所有读操作都随机的在 writeHost ,readHost 上分发
3  所有读请求随机的分发到writerHost 对应的readHost 执行,write 不负担读压力。balance=3 只在1.4及其以后版本才有。

-->

        <dataHost name="master" maxCon="10" minCon="2" balance="1"

                writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">

                <heartbeat>show slave status</heartbeat>
 
           
  <writeHost host="hostM1" url="192.168.192.128:3306"
user="root" password="Abc123!@#"></writeHost>
         
      <writeHost host="hostS1" url="192.168.192.129:3306"
user="root" password="Abc123!@#"></writeHost>

        </dataHost>

</mycat:schema>

启动mycat

# ./bin/mycat start

4、测试
主数据库数据:
mysql>  select * from tb_a;

+------+

| a    |

+------+

|    1 |

|    1 |

|    1 |

|    1 |

|    2 |

|    3 |

|    5 |

+------+

从数据库数据:
mysql>  select * from tb_a;

+------+

| a    |

+------+

|    1 |

|    1 |

|    1 |

|    1 |

|    2 |

|    3 |

|    4 |

|    5 |

+------+

通过客户端工具连接mycat,mycat默认端口为8066,和直接连接mysql是一样的。用户名和密码在conf/server.xml 中配置文件中找到。

        <user name="user">

                <property name="password">user</property>

                <property name="schemas">TESTDB</property>

                <property name="readOnly">false</property>

        </user>

配置 schema.xml 中的schema 可以被那个用户访问。name:user   Password:user

通过工具连接后,查询出的数据是从数据库的数据。当停止主库时可以自动切换(要满足切换的条件)到从库。

踩到的坑:
1、数据库的密码有 & 符号,启动时报xml 解析异常。
2、mycat jvm的配置放在wrapper.conf 文件中,默认的虚拟机内存大小为1G--4G,由于使用的是虚拟机所以启动前要修改下jvm内存设置

mycat 主从的另一种方式,当write 挂了读不可用。

        <dataHost name="master" maxCon="10" minCon="2" balance="3"

                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

                <heartbeat>show slave status</heartbeat>

                <writeHost host="hostM1" url="192.168.192.128:3306" user="root" password="Abc123!@#">

                         <readHost host="hostS2" url="192.168.192.129:3306" user="root" password="Abc123!@#" />

                </writeHost>

        </dataHost>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql mycat