说明:
MyCat是数据库中间件,用于配置MySQL等数据库分片、读写分离等,属于服务端代理。
一、MyCat安装:
1.下载MyCat,用XFtp上传到CentOS7系统/usr/local目录下:
地址:Mycat1.6
2.解压(/usr/local目录下):
[root@localhost local]# tar -xvf Mycat-server-1.6.7.5-release-20210616151418-linux.tar.gz
二、分片配置:
MySQL安装:JavaEE:MySQL安装(rpm方式)/配置_a526001650a的专栏-CSDN博客
MySql1主机:192.168.233.141,端口:3306
MySql2主机:192.168.233.142,端口:3306
1.配置逻辑数据库、用户名/密码:
打开server.xml(/usr/local/mycat/conf目录下):
[root@localhost conf]# vi server.xml
修改内容如下,可增加多个<user>:
<mycat:server xmlns:mycat="http://io.mycat/">
...
<!--配置MyCat用户1,默认用户,此处为root用户名-->
<user name="root" defaultAccount="true">
<property name="password">root</property><!--配置MyCat密码-->
<property name="schemas">mycat_db</property><!--配置MyCat逻辑数据库名称-->
<property name="defaultSchema">mycat_db</property>
</user>
<!--配置MyCat用户2,此处为yyh用户名-->
<user name="yyh">
<property name="password">123456</property> <!--配置MyCat密码-->
<property name="schemas">mycat_db</property> <!--配置MyCat逻辑数据库名称-->
<property name="readOnly">true</property><!-- 只读 -->
<property name="defaultSchema">mycat_db</property>
</user>
</mycat:server>
2.配置MyCat逻辑数据库到MySql数据库(此处只配置了分片):
打开schema.xml(/usr/local/mycat/conf目录下):
[root@localhost conf]# vi schema.xml
修改内容如下,一个schema就是一个逻辑数据库:
<mycat:schema ...>
<schema name="mycat_db" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1"><!--配置mycat逻辑数据库,sqlMaxLimit为mycat查询时单页条数-->
<!--name属性值配置mysql数据库中的表,多张表用逗号分割(多个表使用这个配置)。dataNode为逻辑库到mysql数据库的映射,属性值为下方dataNode节点name值,多个时用逗号隔开。rule配置取模规则。ruleRequired:true必须设置rule的值,false可以不设-->
<table name="table_user, table_account" dataNode="dn1,dn2" rule="auto-sharding-long" />
</schema>
<!--配置mysql数据库列表-->
<dataNode name="dn1" dataHost="MySql1" database="mysql_db1" /><!--MySql1为dataHost的name值,mysql_db1为mysql数据库名称-->
<dataNode name="dn2" dataHost="MySql2" database="mysql_db2" />
<!--
maxCon:最大连接数
minCon:最小连接数
balance:设置负载均衡类型,0关闭读写分离(读写操作访问writeHost配置的mysql主机)。1在双主双从时除M1外的其他主机参与查询时的负载均衡。2随机访问readHost或writeHost主机。3读操作访问readHost主机(写访问writeHost主机)
writeType:推荐使用0,0写操作访问第1个writeHost的mysql主机(当第1个宕机时访问第2个writeHost的mysql主机),1随机访问writeHost的mysql主机
dbType:数据库类型,此处为mysql
dbDriver:连接驱动,此处使用native
-->
<dataHost name="MySql1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><!-- 配置数据库连接数 -->
<heartbeat>select user()</heartbeat><!--连接的心跳-->
<writeHost host="M1" url="192.168.233.141:3306" user="root" password="root123456"><!-- 配置mysql写库连接地址:端口、登录用户/密码 -->
<!-- <readHost host="S1" url="192.168.233.143:3306" user="root" password="root123456" /><!-- balance非0时,配置mysql读库连接地址:端口、登录用户/密码 -->
</writeHost>
</dataHost>
<dataHost name="MySql2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><!-- 配置数据库连接数 -->
<heartbeat>select user()</heartbeat><!--连接的心跳-->
<writeHost host="M1" url="192.168.233.142:3306" user="root" password="root123456" /><!-- 配置mysql连接地址:端口、登录用户/密码 -->
</dataHost>
...
</mycat:schema>
3.编辑分片规则:
见三章第1节(1)小节
三、其他配置:
1. 分片规则:
分片规则文档(9.5章Mycat常用的分片规则):
(1)范围约定,根据id值分配到不同的范围:
查看rule.xml(cd /usr/local/mycat/conf,vi rule.xml):
[root@localhost conf]# vi rule.xml
auto-sharding-long的rule规则如下:
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns> <!-- 对应表中的id字段 -->
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
修改autopartition-long.txt(cd /usr/local/mycat/conf):
[root@localhost conf]# vi autopartition-long.txt
内容如下:
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0 #id值在此范围的放第0个数据库
500M-1000M=1 #id值在此范围的放第1个数据库
#1000M-1500M=2 #id值在此范围的放第2个数据库,本文只有2个MySql主机节点,注释
(2)分片枚举,适用固定数据的场景,比如省份或区县数据分片保存:
修改schema.xml(cd /usr/local/mycat/conf,vi schema.xml):
<mycat:schema ...>
<schema ...>
<!--rule="sharding-by-intfile"配置分片枚举规则-->
<table ... rule="sharding-by-intfile" />
</schema>
...
</mycat:schema>
修改rule.xml(cd /usr/local/mycat/conf,vi rule.xml):
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">0</property> <!-- type默认值为0,0表示Integer,非零表示String,
所有的节点配置都是从0开始,及0代表节点1 -->
<property name="defaultNode">0</property><!-- defaultNode配置默认节点:小于0表示不设置默认节点,大于等于0表示设置默认节点。碰到不识别的枚举值,使用默认节点(不配置默认节点时遇到不识别的枚举值会报错)。 -->
</function>
修改partition-hash-int.txt(cd /usr/local/mycat/conf,vi partition-hash-int.txt):
10000=0
10010=1
(3)取模,id % count = 模值,模值与节点编号对应:
修改schema.xml(cd /usr/local/mycat/conf,vi schema.xml):
<mycat:schema ...>
<schema ...>
<!--rule="mod-long"配置取模规则-->
<table ... rule="mod-long" />
</schema>
...
</mycat:schema>
修改rule.xml(cd /usr/local/mycat/conf,vi rule.xml):
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property> <!-- 取模的除数,模值 = id % count -->
</function>
2.配置全局表(cd /usr/local/mycat/conf,vi schema.xml):
<mycat:schema ...>
<schema ...>
<!--type="global"配置当前表为全局表,数据存一张表,不分片-->
<table ... type="global" />
</schema>
...
</mycat:schema>
3.配置子表分片(共用父表的分片规则):
<mycat:schema ...>
<schema ...>
<table ...>
<!--、
childTable:定义分片子表
name:子表名称
joinKey:子表的分片列(以此列值的进行分片),与父表parentKey关联(一般为父表id)
parentKey:父表的id列,与子表joinKey关联
primaryKey:子表主键,同table标签
needAddLimit:同table标签
例:
父表-dep表: id列
子表-子表user表:dep_id列
-->
<childTable name="子表名" joinKey="子表列名(如dep_id)" parentKey="父表列名(如id)" />
</table>
</schema>
...
</mycat:schema>
4.配置读写分离:
(1)MySQL主从搭建(主MySQL用于写数据,从MySQL用于读数据):
JavaEE:MySQL主从配置_a526001650a的专栏-CSDN博客
(2)配置读写分离(cd /usr/local/mycat/conf,vi schema.xml):
<mycat:schema ...>
...
<!--
balance:设置负载均衡类型,0关闭读写分离(读写操作访问writeHost配置的mysql主机)。1在双主双从时除M1外的其他主机参与查询时的负载均衡。2随机访问readHost或writeHost主机。3读操作访问readHost主机(写访问writeHost主机)
-->
<dataHost ... balance="3" ><!-- 3打开读写分离配置,读操作访问readHost主机(写访问writeHost主机) -->
<heartbeat>select user()</heartbeat><!--连接的心跳-->
<writeHost host="M1" url="主MySQL主机IP地址:3306" user="root" password="root123456"> <!-- 配置mysql写库连接地址:端口、登录用户/密码 -->
<readHost host="S1" url="从MySQL主机IP地址:3306" user="root" password="root123456" /><!-- 配置mysql读库连接地址:端口、登录用户/密码 -->
</writeHost>
</dataHost>
...
</mycat:schema>
四、启动/停止(/usr/local/mycat//bin目录):
1.启动:
[root@localhost bin]# ./mycat start
以控制台方式启动:
[root@localhost bin]# ./mycat console
2.重启:
[root@localhost bin]# ./mycat restart
3.看状态:
[root@localhost bin]# ./mycat status
4.停止:
[root@localhost bin]# ./mycat stop
五、使用Navicat连接远程的MyCat逻辑库:
1.下载并安装Navicat:
Navicat | 下载 Navicat for MySQL 14 天免费 Windows、macOS 和 Linux 的试用版
2.使用Navicat连接远程的MyCat逻辑库:
(1)打开Navicat软件,点击"连接"按钮,在下拉列表中选择"MySQL...":
(2)新建连接,填入远程MyCat的主机IP、MyCat端口(8066)、MyCat登录用户+密码,确定:
(3)连接成功后如图所示: