MyCat介绍

MyCat,这个是基于阿里巴巴的Cobar方案优化而来,支持半自动化分片、join。数据库是对底层存储文件的抽象,而Mycat是对数据库的抽象。MyCat高可用集群化(HAProxy可由其他负载均衡工具代替)

  • HAProxy 实现了 MyCat 多节点的集群高可用和负载均衡。
  • HAProxy 自身的高可用则可以通过Keepalived 来实现。
  • MyCat实现MySQL的读写分离(master可读写 cluster只读)。

MyCat 的读写分离是基于后端 MySQL 集群的主从同步来实现的,而 MyCat 提供语句的分发功能。

MyCat的安装
Mycat-server-1.4-release-20151019230038-linux.tar.gz
到解压并移动到 /usr/local/mycat 目录

设置 MyCat 的环境变量

# vi /etc/profile
## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
# source /etc/profile

MyCat配置

schema.xml 是 MyCat 最重要的配置文件之一,用于设置 MyCat 的逻辑库、表、数据节点、dataHost 等内容。

这里可以看做mycat对外提供的database 可以在里面定义table datanode可以根据业务选择多个

<schema name="db1" dml="0110" dataNode="d1,d2">
<table name="tb01" dml="0000" ></table>
<table name="tb02" dml="1111"></table>
</schema>

db1的权限是update,select。
tb01的权限是啥都不能干。
tb02的权限是insert,update,select,delete。
其他表默认是udpate,select。

dataNode 获取的mysql数据库中的database
dataHost 定义的是一组主从关系的数据源,通过writeHost 和readHost 标签实现读写分离

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

<!-- 定义MyCat的逻辑库 -->
<schema name="master_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_master"></schema>
<schema name="cluster_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_cluster"></schema>


<!-- 定义MyCat的数据节点 -->
<!-- database不能一样 -->
<dataNode name="rc_master" dataHost="dtHost2" database="luoforTest" />
<dataNode name="pay_cluster" dataHost="dtHost2" database="mysql" />


<!-- 使用MyCat托管MySQL主从切换 -->
<!-- 定义数据主机dtHost2,连接到MySQL读写分离集群,并配置了读写分离和主从切换 -->
<dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<!-- 通过show slave status检测主从状态,当主宕机以后,发生切换,从变为主,原来的主变为从,这时候show slave
status就会发生错误,因为原来的主没有开启slave,不建议直接使用switch操作,而是在DB中做主从对调。 -->
<heartbeat>show slave status</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="cluster" url="192.168.25.100:3306" user="root" password="092248" />
<writeHost host="cluster" url="192.168.25.101:3306" user="root" password="092248" />
</dataHost>

<!-- 参数balance决定了哪些MySQL服务器参与到读SQL的负载均衡中 -->
<!-- balance="0",为不开启读写分离,所有读操作都发送到当前可用的writeHost上-->
<!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
<!-- balance="2",所有读操作都随机的在writeHost、readHost上分发-->
<!-- MyCat1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,
则需要在MyCat里配置为两个writeHost并设置balance="1" -->
<!-- writeType="0",所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost-->
<!-- writeType="1",仅仅对于galera for mysql集群这种多主多节点都能写入的集群起效,此时Mycat会随机选择一个writeHost并写入数据,
对于非galera for mysql集群,请不要配置writeType=1,会导致数据库不一致的严重问题 -->
</mycat:schema>

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>
<property name="defaultSqlParser">druidparser</property>
<property name="charset">utf8mb4</property>
<!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
<property name="mutiNodePatchSize">100</property> 亿级数量排序批量
<property name="processors">32</property> <property name="processorExecutor">32</property>
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
</system>


<!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为MySQL主从复制配置中的Master节点,
没实现读写分离,读写都在该Master节点中进行 -->
<!--
<user name="user1">
<property name="password">roncoo.1</property>
<property name="schemas">rc_schema1,pay_schema1</property>
</user>
-->

<!-- 用户2,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群,并通过MyCat实现了读写分离 -->
<user name="root">
<property name="password">092248</property>
<property name="schemas">master_schema,cluster_schema</property>
</user>

<!-- 用户3,只读权限-->
<user name="mycat">
<property name="password">092248</property>
<property name="schemas">master_schema,cluster_schema</property>
<property name="readOnly">true</property>
</user>
</mycat:server>

Mycat的使用

mycat使用了两个端口:8066和9066
8066:mycat通过这个端口来接收数据库客户端的访问请求。
9066:用来接收mycat监控命令、查询mycat运行状况、重新加载配置文件等。

mycat的操作指令

  • mycat start 启动
  • mycat stop 停止
  • mycat restart 重启
  • mycat console 控制台启动

验证

mysql -p -h 192.168.25.100 -P 8066

Mycat入门_xml

Mycat入门_MyCat_02