一、介绍
1. 实现功能
- 可以对数据库进行分库分表,提升效率
- 支持读写分离,支持Mysql双主多从,以及一主多从的模式
- 多平台支持,部署和实施简单
- 自动故障切换,高可用性
- 遵守sql 92标准
2.基础知识介绍
- 切分
逻辑上的切分. 在物理层面,是使用多库[database],多表[table]实现的切分.
1.1 纵向切分
把一个数据库切分成多个数据库,配置方便 只能实现两张表的表连接查询. 将一张表中的数据,分散到若干个 database 的同结构表中。多个表的数据的集合是当 前表格的数据。
1.2 横向切分
把一个表切分成多个表,相比纵向切分配置麻烦 无法实现表连接查询. 将一张表的字段,分散到若干张表中,将若干表连接到一起,才是当前表的完整数据。 - 逻辑库
Mycat 中定义的 database.是逻辑上存在的.但是物理上未必存在. 主要是针对纵向切分提供的概念。
访问 MyCat,就是将 MyCat 当做 MySQL 使用。 Db 数据库是 MyCat 中定义的 database。通过 SQL 访问 MyCat 中的 db 库的时候,对应 的是 MySQL 中的 db1,db2,db3 三个库。物理上的 database 是 db1,db2,db3.逻辑上的 database 就是 db。 - 逻辑表
Mycat 中定义的 table.是逻辑上存在,物理上未必存在.
主要是针对横向切分提供的概念 MyCat 中的表格 table,其字段分散到 MySQL 数据库的表格 table1,table2,table3 中。 - 默认端口
Mycat 默认端口是 8066 - 数据主机
dataHost 物理 MySQL 存放的主机地址.可以使用主机名,IP,域名定义. - 数据节点
dataNode 物理的 database 是什么.数据保存的物理节点.就是 database. - 分片规则
当控制数据的时候,如何访问物理 database 和 table. 就是访问 dataHost 和 dataNode 的算法. 在 Mycat 处理具体的数据 CRUD 的时候,如何访问 dataHost 和 dataNode 的算法.如:哈希 算法,crc16 算法等.
二、安装
1. 安装JDK
基于Java实现,使用时需要安装JDK,这里就不介绍JDK的安装了。
2. 安装数据库主从
配置完主从后,在主数据库中添加mycat使用的用户。
3. 安装mycat
上传mycat压缩包,解压后需要进入conf目录下配置,配置完即可使用。
三、使用
文件介绍
-
rule.xml
用于定义分片规则的配置文件.主要是查看.很少修改. mycat 默认的分片规则: 以 500 万为单位,实现分片规则.
-
schema.xml
用于定义逻辑库和逻辑表的配置文件.在配置文件中可以定义读写分离,逻辑库,逻辑 表,dataHost,dataNode 等信息.
2.1 标签 schema
配置逻辑库的标签
-
属性 name
逻辑库名称 -
属性 checkSQLschema
是否检测 SQL 语法中的 schema 信息.如: Mycat 逻辑库名称 A, dataNode 名称 B
SQL : select * from A.table; checkSQLschema 值是 true, Mycat 发送到数据库的 SQL 是 select * from table; checkSQLschema 值是 false,Mycat 发送的数据库的 SQL 是 select * from A.table; -
sqlMaxLimit
Mycat 在执行 SQL 的时候,如果 SQL 语法中没有 limit 子句.自动增加 limit 子句. 避免一次 性得到过多的数据,影响效率. limit 子句的限制数量默认配置为 100.如果 SQL 中有具体的 limit 子句,当前属性失效.SQL : select * from table . mycat
解析后: select * from table limit 100
SQL : select * from table limit 10 . mycat 不做任何操作修改.
2.2 标签 table
定义逻辑表的标签,如果需要定义多个逻辑表,编写多个 table 标签。要求逻辑表的表 名和物理表(MySQL 数据库中真实存在的表)的表名一致。
-
属性 name
逻辑表名 -
属性 dataNode
数据节点名称.配置文件中后续需要定义的标签(即物理数据库中的 database 名称). 多个名称使用逗号分隔. 多个 database 定义后,代表分库。
-
属性 rule
分片规则名称.具体的规则名称参考 rule.xml 配置文件. SQL 语句发送到 Mycat 中后,Mycat 如何计算,应该将当期的 SQL 发送到哪一个物理数 据库管理系统或物理 database 中。
2.3 标签 dataNode
定义数据节点的标签, 定义具体的物理 database 信息的。
- 属性 name 数据节点名称, 是定义的逻辑名称,对应具体的物理数据库 database
- 属性 dataHost 引用 dataHost 标签的 name 值,代表使用的物理数据库所在位置和配置信息.
- 属性 database 在 dataHost 物理机中,具体的物理数据库 database 名称.
2.4 dataHost 标签
定义数据主机的标签, 就是物理 MYSQL 真实安装的位置。
-
属性 name 定义逻辑上的数据主机名称
-
属性 maxCon/minCon 最大连接数, max connections 最小连接数, min connections
-
属性 dbType 数据库类型 : mysql 数据库
-
属性 dbDriver 数据库驱动类型, native,使用 mycat 提供的本地驱动.
-
balance 属性
balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
balance=”1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡
balance=”2”,所有读操作都随机的在 writeHost、 readhost 上分发。
balance=”3”, 所有读请求随机的分发到 writeHost 对应的 readhost 执行,writerHost 不负担读压力 -
writeType 属性
writeType=”0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第 二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:conf/dnindex.properties (datanode index)
writeType=”1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐 -
switchType 属性
也涉及到读写分离问题,可以解决 IO 延迟问题。
switchType=’-1’ 表示不自动切换
switchType=‘1’ 默认值,表示自动切换
switchType=‘2’ 基于 MySQL 主从同步的状态决定是否切换读写主机,心跳语句为 show slave status。 当心跳监测获取的数据发现了 IO 的延迟,则读操作自动定位到 writeHost 中。如果心跳监测获取的数据没有 IO 延迟,则读操作自动定位到 readHost 中。建议为 不同的表格定位不同的 dataHost 节点。
2.4.1 dataHost 子标签witeHost
写数据的数据库定义标签. 实现读写分离操作.
- 属性 host 数据库命名
- 属性 url 数据库访问路径
- 属性 user 数据库访问用户名
- 属性 password 访问数据库用户密码
2.4.1.1 writeHost子标签readHost
读数据的数据库定义标签. 实现读写分离操作.
- 属性 host 数据库命名
- 属性 url 数据库访问路径
- 属性 user 数据库访问用户名
- 属性 password 访问数据库用户密码
2.4.2 dataHost 子标签heartbeat
执行心跳检测时发送给数据库的语句
-
注意: 在 mycat 中,rule.xml 配置文件中定义的分片规则只能给一个表格使用。如果 有多个表格使用同一个分片规则,需要再 rule.xml 配置文件中,为每个表格定义一个分片规 则。
scheme.xml模板
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.11.138:3306" user="root" password="root"/>
</dataHost>
</mycat:schema>
- server.xml
配置 Mycat 服务信息的
如: Mycat 中的用户,用户可以访问的逻辑库,可以访问的逻辑表,服务的端口号等. 常见修改内容:
server.xml部分模板
<property name="serverPort">8066</property> <!-- Mycat 服务端口号 -->
<property name="managerPort">9066</property><!-- Mycat 管理端口号 -->
<user name="root"><!-- mycat 用户名 -->
<property name="password">密码</property>
<property name="schemas">用户可访问逻辑库名</property> <!-- 表级 DML 权限设置 -->
<!-- 不检查权限
<privileges check="false">
<schema name="逻辑库名" dml="0110" >
<table name="逻辑表名" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user"><!-- 其他用户名 -->
<property name="password">密码</property>
<property name="schemas">可访问逻辑库名</property>
<property name="readOnly">是否只读</property>
</user>
四、结尾
根据自己的需要对schema.xml以及rule.xml配置后,在bin目录下启动mycat即可。mycat可以当做数据库来使用。
在安装有mysql的系统下,运行下面这句话即可。
mysql -u用户名 -p密码 -hmycat主机IP -P8066