一.概念
运行在应用层和数据库之间,可以当作一个Mysql服务器使用(不论是在工具还是在代码或者命令中都可以直接连接),实现对Mysql数据库的分库分表。也可以通过JDBC支持其他的数据库。
二.关键特性
1.可以当作一个Mysql数据库来使用
2.支持Mysql之外的数据库,通过JDBC实现
3.解决了我们提到的所有问题,多表join、分布式事务、全局序列号、翻页排序
4.支持ZK配置,带监控mycat-web
三.主要术语
概念 | 含义 |
主机 | 物理主机, 一台服务器, 一个数据库服务, 一个 3306 端口 |
物理数据库 | 真实的数据库 |
物理表 | 真实的表 |
分片 | 将原来单个数据库的数据切分后分散存储在不同的数据库节点 |
分片节点 | 分片以后数据存储的节点 |
分片键 | 分片依据的字段,通常是主键 |
分片算法 | 分片的规则, 例如随机、 取模、 范围、 哈希、 枚举以及各种组合算法 |
逻辑表 | 相对于物理表, 是分片表聚合后的结果, 对于客户端来说跟真实的表没有区别 |
逻辑数据库 | 相对于物理数据库, 是数据节点聚合后的结果, 例如 imall |
四.配置详解
主要配置文件server.xml、schemal.xml、rule.xml和具体的分片配置文件
1.server.xml
包含系统配置信息:
system标签:例如字符集、线程数、心跳、分布式事务开关等等
user标签:配置登录用户和权限
2.schema.xml
包含逻辑库、表、分片规则、分片节点和数据源,可以定义多个schema。里面有三个主要的标签(table、dataNode、dataHost)
1)Tabke
<schema name="imall" checkSQLschema="false" sqlMaxLimit="100">
<table name="customer" primaryKey="id" dataNode="122-imall,123-imall,124-imall" rule="auto-sharding-long" />
<table name="order_info" dataNode="122-imall,123-imall,124-imall" rule="mod-long-order" >
<childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="order_id"/>
</table>
</schema>
<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
<table name="student" primaryKey="sid" dataNode="122-gupao,123-gupao,124-gupao" rule="mod-long" />
</schema>
配置 | 作用 |
checkSQLschema | 在查询 SQL 中去掉逻辑库名 |
sqlMaxLimit | 自动加上 limit 控制数据的返回 |
primaryKey | 指定该逻辑表对应真实表的主键。 MyCat 会缓存主键(通过 primaryKey 属性配置) 与具体 dataNode 的信息。 当分片规则(rule) 使用非主键进行分片时, 那么在使用主键进行查询时, MyCat 就会通过缓存先确定记录在哪个 dataNode 上, 然后再在该 dataNode 上执行查询。 如果没有缓存/缓存并没有命中的话, 还是会发送语句给所有的 dataNode。 |
dataNode | 数据分片的节点 |
autoIncrement | 自增长(全局序列) , true 代表主键使用自增长策略 |
type | 全局表: global。 其他: 不配置 |
2) dataNode
数据节点与物理数据库的对应关系
<dataNode name="124-imall" dataHost="host124" database="imall" />
3)dataHost
配置物理主机的信息,readhost 是从属于 writehost 的
<dataHost name="host122" 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.44.122:3306" user="root" password="123456">
</writeHost>
</dataHost>
<dataHost name="host123" 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.44.123:3306" user="root" password="123456">
<!-- <readHost host="hostS1"></readHost>-->
</writeHost>
</dataHost>
<dataHost name="host124" 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.44.124:3306" user="root" password="123456">
</writeHost>
</dataHost>
balance:负载的配置,决定 select 语句的负载
值 | 作用 |
0 | 不开启读写分离机制, 所有读操作都发送到当前可用的 writeHost 上。 |
1 | 所有读操作都随机发送到当前的 writeHost 对应的 readHost 和备用的 writeHost |
2 | 所有的读操作都随机发送到所有的 writeHost,readHost 上 |
3 | 所有的读操作都只发送到 writeHost 的 readHost 上 |
writeType:读写分离的配置,决定 update、delete、insert 语句的负载
值 | 作用 |
0 | 所有写操作都发送到可用的 writeHost 上(默认第一个, 第一个挂了以后发到第二个) |
1 | 所有写操作都随机的发送到 writeHost |
switchType:主从切换配置
值 | 作用 |
-1 | 表示不自动切换 |
1 | 默认值, 表示自动切换 |
2 | 基于 MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status |
3 | 基于 MySQL galera cluster 的切换机制(适合集群) (1.4.1), 心跳语句为 show status like 'wsrep%'。 |
3.rule.xml
定义分片规则和算法
//分片规则
<tableRule name="rang-long-cust">
<rule>
<columns>id</columns>
<algorithm>func-rang-long-cust</algorithm>
</rule>
</tableRule>
//分片算法
<function name="func-rang-long-cust" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">rang-long-cust.txt</property>
</function>
五. 监控
1.连接到管理端
mysql -uroot -h127.0.0.1 -p123456 -P9066
2.基本命令
命令 | 作用 |
show @@server; | 查看服务器状态, 包括占用内存等 |
show @@database; | 查看数据库 |
show @@datanode; | 查看数据节点 |
show @@datasource; | 查看数据源 |
show @@connection; | 该命令用于获取 Mycat 的前端连接状态, 即应用与 mycat 的连接 |
show @@backend; | 查看后端连接状态 |
show @@cache; | 查看缓存使用情况 SQLRouteCache: sql 路由缓存。 TableID2DataNodeCache : 缓存表主键与分片对应关系。 ER_SQL2PARENTID : 缓存 ER 分片中子表与父表关系 |
reload @@config; | 重新加载基本配置(热加载) , 使用这个命令时 mycat 服务不可用 |
show @@sysparam; | 查询 mycat 服务的系统参数 |
show @@sql.high; | 执行频率高的 SQL |
show @@sql.slow; | 慢 SQL 设置慢 SQL 的命令: reload @@sqlslow=5 ; |
show @@syslog limit=50; | 查看最近 50 条系统日志 |