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

用mycat做读写分离:基于 MySQL主从复制

2017-05-15 00:00 776 查看
本文基于MySQL主从复制利用mycat实现读写分离。

mycat在应用当中的作用可以看下图:



mycat可以让程序员只需要关心业务代码的编写,而不用担心后端数据库集群的负载均衡,读写分离,分库分表的数据分片逻辑的编写,只要直接连接mycat就可以了。

首先我们准备一台干净的centos机器,安装好jdk



解压mycat的安装包到/user/local/下



设置mycat的环境变量

vi /etc/profile




使配置文件立即生效

source /etc/profile

修改配置文件

先配置server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<!-- 这里配置的都是一些系统属性,可以自己查看mycat文档 -->
<property name="defaultSqlParser">druidparser</property>
<property name="charset">utf8mb4</property>
</system>

<!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群 -->
<user name="user1">
<property name="password">root</property>
<property name="schemas">pcx_schema</property>
</user>

<!-- 用户2,只读权限-->
<user name="user2">
<property name="password">root</property>
<property name="schemas">pcx_schema</property>
<property name="readOnly">true</property>
</user>

</mycat:server>

这里配置了两个可以来连接的用户
用户1 user1 密码root 给予了此用户pcx_schema数据库的权限
用户2 user2 密码root 给予了此用户pcx_schema数据库的只读权限
注意这里的pcx_schema 不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可

接下来配置schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

<!-- 定义MyCat的逻辑库 -->
<schema name="pcx_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema>

<!-- 定义MyCat的数据节点 -->
<dataNode name="pcxNode" dataHost="dtHost" database="pcx" />

<!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->
<!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->
<!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
<!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->
<dataHost name="dtHost" maxCon="500" minCon="20" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<!--心跳检测 -->
<heartbeat>show slave status</heartbeat>

<!--配置后台数据库的IP地址和端口号,还有账号密码 -->
<writeHost host="hostMaster" url="192.168.1.6:3306" user="root" password="root" />
<writeHost host="hostSlave" url="192.168.1.7:3306" user="root" password="root" />
</dataHost>

</mycat:schema>

一, <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
这里TESTDB 就是我们对外声称的我们有数据库的名称 必须和server.xml中的用户指定的数据库名称一致
添加一个dataNode="dn1" 是指定了我们这个库只在dn1上.没有进行分库

二, <dataNode name="dn1" dataHost="localhost1" database="db1" />
这里只需要改database的名字 db1 就是你真实数据库服务上的数据库名 .
根据你自己的数据库名进行修改.

三,<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

这里只需要配置三个地方 balance="1"与writeType="0" ,switchType=”1”
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 主从同步的状态决定是否切换

四,<writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.1.101:3306" user="root" password="123456" />
</writeHost>

这里是配置的我们的两台读写服务器IP地址访问端口和 访问用户的用户名和密码

启动mycat

cd /usr/local/mycat/bin/
./mycat start

我们可以使用mysql客户端连接或者navicat来连接mycat

测试一下读写分离
测试一下读操作
我们连接到mycat发送一句select *命令试试



进入mycat的日志目录

cd /usr/local/mycat/logs/

查看日志



可以看到select 操作被路由到了192.168.1.7也就是我们的slave节点

接下来我们测试一下写操作





可见插入被路由到了master节点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mycat 读写分离