Mysql读写分离中间件 MyCat

Mycat简介

MyCat使用Mysql的通讯协议模拟成一个MySQl服务器,并建立了完整的Schema(数据库)、Table(数据表)、User(用户)的逻辑模型,并将这套逻辑模型映射到后端的存储节点DataNode上的真实的物理库中,这样一来所有能使用MySQL的客户端及编程语言都能将Mycat当成MYSQLServer使用,不必开发新的客户端。

Mycat的原理:当Mycat收到一个客户端发送的SQL请求,会先对SQL进行语法分析和检查,分析的结果用SQL路由,SQL路由策略支持传统的基于表格的分片字段进行分片,也支持独有的基于数据库E-R关系的分别片策略,对于路由到多个数据节点(DataNode)的SQL,则会对收到的数据集进行”归并“,然后输出到客户端。

DataNode是MyCat的逻辑数据节点,映射到后端的某一个物理数据库的一个Datebase,为了做到系统高可用,每个DataNode可以配置多个引用地址(DataSource),当主DataSource被检测为不可用时,系统会自动切换到下一个可用的DataSource上,这里的DataSoure即可认为是Mysql的主流服务器的地址。

搭建过程

在已经搭好mysql主从的环境

1.安装需求

需要 jdk 1.7 以及 mysql 5.1 以上版本

[root@yundun .ssh]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
[root@yundun .ssh]# 
[root@yundun .ssh]# mysql --version
mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
[root@yundun .ssh]# 

若未安装java,请自行到http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载安装

2.安装过程

https://github.com/MyCATApache/Mycat-download下载源码包,解压到相应的目录

wget https://github.com/MyCATApache/Mycat-download
tar xzf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
cp -a mycat /opt/mycat
echo 'export PATH=$PATH:/opt/mycat/bin' > /etc/profile.d/mycat.sh
source /etc/profile
useradd mycat -s /sbin/nologin -M
chown mycat.mycat /opt/mycat -R

3.配置读写分离

/opt/mycat/conf 目录下有两个文件比较重要,一个是 schema.xml ,另一个是 server.xml
server.xml 是修改用于连接mycat的帐号和权限, schema.xml 则是设置后端数据库的具体选项。

server.xml 配置:

#若要设置多个账户,把下面<user>标签内的内容复制即可
<user name="user">                                  #这里设置用于连接mycat的用户名
    <property name="password">abc123</property>     #这里设置密码
    <property name="schemas">firewall</property>    #这里设置连接的数据库名字(s逻辑库),改名字要与schema.xml对应(可以与真实数据库名字不同)
    <property name="readOnly">true</property>       #这里设置是否只读,需要写权限只需把这行注释
</user>

schema.xml 设置:

#默认的配置文件标签比较多,以下是仅仅是配置读写分离
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="firewall" checkSQLschema="false" dataNode="dn1">
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="firewall" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="-1">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="172.16.10.3:3306" user="dbuser" password="123456">
        <readHost host="hostS2" url="172.16.10.4:3306" user="dbuser" password="123456" />
        </writeHost>
    </dataHost>
</mycat:schema>

说明:

  • schema标签用来定义mycat实例中的逻辑库,mycat可以有多个逻辑库。

name 是逻辑库名字, server.xml 文件中配置要和这里配置对应
checkSQLschema ,当该值为 true 时,可以去掉逻辑库名字。例如我们执行语句select * from TESTDB.company 。mycat会把语句修改为 select * from company 去掉 TESTDB
dataNode 该标签用于绑定逻辑库到某个具体的database上。

  • datanode 标签定义了mycat中的数据节点,也就是我们所说的数据分片。一个datanode标签就是一个独立的数据分片。

name 是逻辑库的名字,这个名字需要唯一。
dataHost 用于定义该分片属于哪个数据库实例,属性与datahost标签上定义的name对应。
database 用于定义该分片的服务器上的真实数据库名

  • dataHost标签直接定义了具体数据库实例,读写分离配置和心跳语句。

name 唯一标示dataHost标签,与上层标签 datanode 中的 dataHost 对应
maxCon 指定每个读写实例连接池的最大连接。
minCon 指定每个读写实例连接池的最小连接,初始化连接池的大小
balance 读负载均衡属性
0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
1:全部的readHost与stand by writeHost参与select语句的负载均衡
2:所有读操作都随机的在writeHost、readHost上分发
3:所有读请求随机的分发到writeHst对应的readHost执行,writeHost不负担读写压力。
writeType 写负载均衡属性
0:所有的写操作发送到配置的第一个writeHost,第一个挂了切换到第二个。
1:所有的写操作都随机的发送到配置的writeHost,1.5以后版本废弃不推荐。
switchType 自动切换属性
-1不自动切换
1 默认值,自动切换
2 基于MySql主从同步的状态决定是否切换
dbType 指定后端链接的数据库类型目前支持二进制的mysql协议
dbDriver 指定连接后段数据库使用的driver
heartbeat 心跳语句,配合主从切换使用

  • writeHost标签,定义写数据库(服务器)

host 定义该服务器名字
url 定义连接方式(IP+端口)
user 连接数据库的帐号
password 连接数据的密码

  • readHost标签,定义读数据库(服务器)

host 定义该服务器名字
url 定义连接方式(IP+端口)
user 连接数据库的帐号
password 连接数据的密码

4.启动mycat

配置好配置文件之后,执行 #mycat start 启动,执行 #netstat -tunlp | grep 8066 检查是否正常
使用 server.xml 里面设置的帐号和密码连接后端真实数据库
# mysql -uuser -p'abc123' -P8066 -h127.0.0.1
此时可以看到在 schema.xml 里面定义的逻辑库的名字


参考文档
[1] http://blog.csdn.net/linlinv3/article/details/51777324
[2] https://github.com/MyCATApache/Mycat-Server

发表新评论