Mycat实现MySQL读写分离

环境

MySQL版本:

mysql> select version();

+————+

| version() |

+————+

| 5.6.30-log |

+————+

1 row in set (0.05 sec)

确保主从已经同步

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

QQ20160627094913

安装mycat

在192.168.10.252上操作

cd /soft

wget https://github.com/MyCATApache/Mycat-download/raw/master/1.4.1-DEV/Mycat-server-1.4.2-20160613220038-linux.tar.gz

tar xf Mycat-server-1.4.2-20160613220038-linux.tar.gz

[root@db01 soft]# mkdir -p /application

[root@db01 soft]# mv mycat /application/

[root@db01 soft]# ll /application/mycat/

total 24

drwxr-xr-x. 2 root root 4096 Jun 7 13:53 bin

drwxrwxrwx. 2 root root 4096 Oct 20 2015 catlet

drwxrwxrwx. 2 root root 4096 Jun 7 13:53 conf

drwxr-xr-x. 2 root root 4096 Jun 7 13:53 lib

drwxrwxrwx. 2 root root 4096 Oct 20 2015 logs

-rwxrwxrwx. 1 root root? 211 Jun 13 2016 version.txt

[root@db01 soft]# source /etc/profile

[root@db01 soft]# tail -1 /etc/profile

export PATH=/application/mycat/bin:$PATH

安装java环境

在192.168.10.252操作

下载JDK

wget http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.tar.gz

tar xf jdk-8u60-linux-x64.tar.gz -C /application/

ln -s /application/jdk1.8.0_60 /application/jdk

设置java的环境变量

echo ‘export JAVA_HOME=/application/jdk’>>/etc/profile

echo ‘export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib’ >>/etc/profile

echo ‘export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin’ >>/etc/profile

. /etc/profile

[root@db01 soft]# java -version

java version “1.8.0_60”

Java(TM) SE Runtime Environment (build 1.8.0_60-b27)

Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

提示:jdk至少要1.7的版本

创建管理用户

主库上对web用户授权如下:

grant insert,delete,update,select on web.* to web@’192.168.10.%’ identified by ‘123456’;

从库上对web用户授权如下:

提示:由于主库和从库是同步复制的,所以从库上的web用户会自动和主库的一致,即无法实现只读select的授权

revoke insert,update,delete on web.* from web@’192.168.10.%’;

 

配置mycat

修改server.xml,

 

[codesyntax lang=”text”]

 <user name="web">

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

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

 </user>



 <user name="web_r">

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

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

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

</user>

[/codesyntax]

 

注意:

1、这里配置的是可以连接主库的两个用户

用户:web 密码: 123456 给予此用户web数据库增删改查的权限。

用户:web_r 密码:123456 给予此用户web数据库的权限。

2、这里的web,不一定是你数据库上的真实库名,可以任意指定,只要接下来和schema.xml的配置文件的库名统一即可

修改schemaxml

 

[codesyntax lang=”xml”]

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://org.opencloudb/">



 <schema name="web" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

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

 <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />



 <!-- global table is auto cloned to all defined data nodes ,so can join

 with any table whose sharding node is in the same data node -->

 <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />

 <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />

 <!-- random sharding using mod sharind rule -->

 <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3"

 rule="mod-long" />

 <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"

 needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"

 rule="mod-long" /> -->

 <table name="employee" primaryKey="ID" dataNode="dn1,dn2"

 rule="sharding-by-intfile" />

 <table name="customer" primaryKey="ID" dataNode="dn1,dn2"

 rule="sharding-by-intfile">

<childTable name="orders" primaryKey="ID" joinKey="customer_id"

 parentKey="id">

 <childTable name="order_items" joinKey="order_id"

 parentKey="id" />

 </childTable>

 <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"

 parentKey="id" />

 </table>

 <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"

 /> -->

 </schema>

 <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"

 /> -->

 <dataNode name="dn1" dataHost="localhost1" database="web" />

 <dataNode name="dn2" dataHost="localhost1" database="web" />

 <dataNode name="dn3" dataHost="localhost1" database="web" />



 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"

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

 <heartbeat>select user()</heartbeat>

 <!-- can have multi write hosts -->

<writeHost host="hostM1" url="192.168.10.230:3306" user="web"

 password="123456">

 <!-- can have multi read hosts -->





<readHost host="hostS1" url="192.168.10.229:3306" user="web"

 password="123456" />

 </writeHost>

 <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->

 </dataHost>



</mycat:schema>

[/codesyntax]

 

需要配置的位置:

 

balance=”1″ writeType=”0″ switchType=”1

 

balance

 

1、balance=0 不开启读写分离机制,所有读操作都发送到当前可用的writehostle .

2、balance=1 全部的readhost与stand by writeHost 参与select语句的负载均衡。简单的说,双主双从模式(M1àS1,M2àS2,并且M1和M2互为主备),正常情况下,M1,S1,S2都参与select语句的复杂均衡。

3、balance=2 所有读操作都随机的在readhost和writehost上分发

writeType

负载均衡类型,目前的取值有3种:
1、writeType=”0″,?所有写操作发送到配置的第一个writeHost。
2、writeType=”1″,所有写操作都随机的发送到配置的writeHost。
3、writeType=”2″,不执行写操作。

switchType

1、switchType=-1?表示不自动切换
2、switchType=1?默认值,自动切换
3、switchType=2?基于MySQL?主从同步的状态决定是否切换

启动mycat

[root@wohong bin]# ./mycat console
Running Mycat-server…
wrapper | –> Wrapper Started as Console
wrapper | Launching a JVM…
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | log4j 2016-06-23 15:48:16 [./conf/log4j.xml] load completed.
jvm 1 | MyCAT Server startup successfully. see logs in logs/mycat.log

或者后台运行./mycat console&

在客户端上连接数据库
mysql -uweb -p123456 -h127.0.0.1 -P8066

QQ20160627095734

提示:这里的web用户是跟server.xml配置文件中的web保持一致的

查询操作

QQ20160627095942

看到查询找的是从库

QQ20160627100106

做插入数据操作

QQ20160627100351

看到是找主库

QQ20160627100619

这样数据库读写分离就完成了!!!

Mycat实现MySQL读写分离
Scroll to top