使用mycat 实现mysql 数据的分库分表
概念
-
逻辑库(Schema)
将分开的物理库合并的一个逻辑数据库,跨多个物理主机
-
逻辑表(table)
逻辑表就是物理表的总和
只要进行了水平切分就是一个分片表,没有切分的就是非分片表
通过冗余方式复制到所有分片表所在库的表就叫全局表
-
分片节点(dataNode)
数据表被分片到不同的分片数据库上,每个分片表所在的库就叫数据节点
-
分片主机(dataHost)
所有分片数据实际存放的物理数据库
-
分片规则(rule)
MyCat有很多分片规则,基本够用,自己本身是用Java开发的
-
全局序列号
- UUID
- snow id
环境
搭建环境说明,两台服务器也可以,mycat 与其中一个节点搭在一起
安装
# 下载
wget http://dl.mycat.org.cn/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
# 解压
tar -xvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
配置
- 配置 server.xml
vim /root/mycat/conf/server.xml
<!--用户名密码配置-->
<user name="guanzc" defaultAccount="true">
<property name="password">123456</property>
<!--配置逻辑表,多个表以 "," 分割-->
<property name="schemas">mycat_user,mycat_order</property>
</user>
- 配置 schema.xml
vim /root/mycat/conf/schema.xml
<!-- dataNode 数据节点配置
name: 自定义名称
dataHost: 定义的dataHost
dataBase: 物理的数据库名
-->
<dataNode name="dn1" dataHost="dataHost_01" database="ikang_db_01" />
<dataNode name="dn2" dataHost="dataHost_02" database="ikang_db_02" />
<!-- 表配置
name:逻辑标名与 server.xml 配置保持一致
checkSQLschema: 如果是true会自动去掉数据库前缀
sqlMaxLimit: 最大显示行数
table: 数据库表配置
name: 对应物理数据表名
dataNode: 配置的数据节点
rule: 分片规则
-->
<schema name="mycat_user" checkSQLschema="true" sqlMaxLimit="100">
<table name="user_info" dataNode="dn1,dn2" rule="auto-sharding-long" />
</schema>
<!-- 逻辑数据库
dataHost 配置
name: 主机名称
maxCon:最大连接
minCon:最小链接
balance:
0: 不开启读写分离,所有的操作都在writeHost上操作
1: 全部的readHost与stand by writeHost参与select数据的负载均衡(当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡)
2:所有的读操作会随机writeHost和readHost
3: 所有的读操作都会随机分发到readHost。 writeHost不参与读操作双主也需要我们自己进行replica,mycat平时只写入一个主机
writeType:
0: 所有写操作都会发送到配置的第一个writeHost,如果第一个挂了就会自动切到第二个writeHost配置上
1: 所有的写操作会随机到writeHost上,1.5版本后不推荐
switchType: 切换类型配套我们的writeType来进行操作的
-1: 表示写操作不自动进行切换
1: 默认值,自动切换,从第一个到第二个writeHost
2: 基于MySQL的主从同步的状态决定是否切换
-->
<dataHost name="dataHost_01" 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.56.132:3306" user="guanzc"
password="123456">
</writeHost>
</dataHost>
<dataHost name="dataHost_02" 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.56.133:3306" user="guanzc"
password="123456">
</writeHost>
</dataHost>
安装数据库
参考另一篇博客:rpm 安装数据库
建库、建表
#建库
create database ikang_db_01;
# 建表
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
`id` int(11) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建用户授权
# 创建用户
CREATE USER 'guanzc'@'%' IDENTIFIED BY '123456';
# 授权
grant all privileges on *.* to 'guanzc'@'%' identified by '123456';
flush privileges;
启动
cd /root/mycat/bin
./mycat
注意:mycat 默认分片时3个,只有两个节点,会报错,修改配置:autopartition-long.txt
配置,与集群dataNode 节点保持一直,从0开始
连接mycat
mycat 可以当作一个数据库,建立的逻辑数据库、表可通过登录 mycat 查看
mycat 提供了两种端口
- 管理端口:9066, 查看配置
- 数据端口:8066 和sql 操作一样
- 觉得端口不爽,就修改
vim server.xml
<system>
<property name="serverPort">8067</property>
<property name="managerPort">9066</property>
</system>
- 登录数据接口
mysql -uguanzc -p -h192.168.56.130 -P8066
可以愉快的写sql 了
- 登录管理接口
mysql -uguanzc -p -h192.168.56.130 -P9066
# 查看命令
mysql> show @@help;
+--------------------------------------------------------------+--------------------------------------------+
| STATEMENT | DESCRIPTION |
+--------------------------------------------------------------+--------------------------------------------+
| show @@time.current | Report current timestamp |
| show @@time.startup | Report startup timestamp |
| show @@version | Report Mycat Server version |
| show @@server | Report server status |
| show @@threadpool | Report threadPool status |
| show @@database | Report databases |
| show @@datanode | Report dataNodes |
| show @@datanode where schema = ? | Report dataNodes |
| show @@datasource | Report dataSources |
| show @@datasource where dataNode = ? | Report dataSources |
| show @@datasource.synstatus | Report datasource data synchronous |
| show @@datasource.syndetail where name=? | Report datasource data synchronous detail |
| show @@datasource.cluster | Report datasource galary cluster variables |
| show @@processor | Report processor status |
| show @@command | Report commands status |
| show @@connection | Report connection status |
| show @@cache | Report system cache usage |
| show @@backend | Report backend connection status |
| show @@session | Report front session details |
| show @@connection.sql | Report connection sql |
| show @@sql.execute | Report execute status |
| show @@sql.detail where id = ? | Report execute detail status |
| show @@sql | Report SQL list |
| show @@sql.high | Report Hight Frequency SQL |
| show @@sql.slow | Report slow SQL |
| show @@sql.resultset | Report BIG RESULTSET SQL |
| show @@sql.sum | Report User RW Stat |
| show @@sql.sum.user | Report User RW Stat |
| show @@sql.sum.table | Report Table RW Stat |
| show @@parser | Report parser status |
| show @@router | Report router status |
| show @@heartbeat | Report heartbeat status |
| show @@heartbeat.detail where name=? | Report heartbeat current detail |
| show @@slow where schema = ? | Report schema slow sql |
| show @@slow where datanode = ? | Report datanode slow sql |
| show @@sysparam | Report system param |
| show @@syslog limit=? | Report system mycat.log |
| show @@white | show mycat white host |
| show @@white.set=?,? | set mycat white host,[ip,user] |
| show @@directmemory=1 or 2 | show mycat direct memory usage |
| show @@check_global -SCHEMA= ? -TABLE=? -retry=? -interval=? | check mycat global table consistency |
| switch @@datasource name:index | Switch dataSource |
| kill @@connection id1,id2,... | Kill the specified connections |
| stop @@heartbeat name:time | Pause dataNode heartbeat |
| reload @@config | Reload basic config from file |
| reload @@config_all | Reload all config from file |
| reload @@route | Reload route config from file |
| reload @@user | Reload user config from file |
| reload @@sqlslow= | Set Slow SQL Time(ms) |
| reload @@user_stat | Reset show @@sql @@sql.sum @@sql.slow |
| rollback @@config | Rollback all config from memory |
| rollback @@route | Rollback route config from memory |
| rollback @@user | Rollback user config from memory |
| reload @@sqlstat=open | Open real-time sql stat analyzer |
| reload @@sqlstat=close | Close real-time sql stat analyzer |
| offline | Change MyCat status to OFF |
| online | Change MyCat status to ON |
| clear @@slow where schema = ? | Clear slow sql by schema |
| clear @@slow where datanode = ? | Clear slow sql by datanode |
+--------------------------------------------------------------+--------------------------------------------+
59 rows in set (0.01 sec)
两个重要命令:reload @@config 、 reload @@config_all
修改完配置后,不用重启 mycat 服务,执行下命令就会生效,用哪个,自己去看。
验证
- 文件 autopartition-long.txt 定义了分片规则,0-5M 存储在第一个分片(db_01), 5M-10M存储在第二个分片(db_02)
- mycat 插入两条数据,分别存储到db_01、db_02
读写分离
在192.168.56.130 搭建一个数据库,db_01 作为192.168.56.132 的从库。主库只负责写从操作,读操由从库负载。为了演示效果,主从没做同步。
- 主从配置
scheml.xml
<dataHost name="dataHost_01" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.56.132:3306" user="guanzc"
password="123456">
<readHost host="S1" url="192.168.56.130:3306" user="guanzc" password="123456"/>
</writeHost>
</dataHost>
- readHost: 作为writeHost 从库,父子关系
- balance=1
- 加载配置
mysql>reload @@config_all;
- 测试
- 主从初始数据保持一直,尤其是id
- mycat逻辑库中加入一条记录成功后,查不到,因为数据写入了主库,查询的是从库(主从没有做同步),因此查不到。验证了主从读写分离。
双主
schema.xml
<dataHost name="DB213" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.56.132:3306" user="guanzc"
password="123456">
<writeHost host="hostM1" url="192.168.56.130:3306" user="guanzc"
password="123456">password="123456"/>
</dataHost>
- 配置两个同级的writeHost
- 测试
- 关闭192.168.56.132
- 从逻辑库中插入新的数据,能正常写入(关闭数据后,有延时)