官网下载地址http://dl.mycat.org.cn/
三个配置文件:schema.xml定义逻辑库、表、分片节点等内容、rule.xml定义分片规则、server.xml定义用户以及系统相关变量如端口
MyCat对接MySQL
修改配置文件server.xml中的用户信息,配置逻辑库的访问用户和库名
mycat TESTDB true
修改配置文件schema.xml
select user()
验证数据库访问情况
#如远程访问报错,请建对应用户 grant all privileges on *.* to root@'缺少的host' identified by '密码';
启动程序
# 控制台启动 $MYCAT_HOME/bin/mycat console # 后台启动 $MYCAT_HOME/bin/mycat start
登录后台管理窗口:用于管理维护MyCat
mysql -umycat -pmycat -P9066 -hbigdata # 常用命令 show database show @@help
登录数据窗口:用于通过MyCat查询数据
mysql -umycat -pmycat -P8066 -hbigdata使用MyCat搭建读写分离-MySQL一主一从
一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下
修改MySQL配置文件/etc/my.cnf
主机配置(ip:host79)
# 主服务器唯一ID server-id=1 # 启用二进制日志 log-bin=mysql-bin # 设置不要复制的数据库(可设置多个) binlog-ignore-db=mysql binlog-ignore-db=information_schema # 设置需要复制的数据库 binlog-do-db=需要复制的主数据库名字 # 设置logbin格式 binlog_format=STATEMENT
从机配置(ip:host80)
# 从服务器唯一ID server-id=2 # 启用中继日志 relay-log=mysql-relay
MySQL实现主从复制
并且主从都需要重启MYSQL服务、以及关闭防火墙
systemctl restart mysqld systemctl status mysqld
在主机上建立账户并授权slave
#在主机MySQL里执行授权命令 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123'; # 查看master状态 show master status # 记录下File的Position的值,执行完此步骤后不操作主MySQL,防止主服务器状态值变化
在从机上配置需要复制的主机
# 复制主机的命令 CHANGE MASTER TO MASTER_HOST='主机的IP地址', MASTER_USER='slave', MASTER_PASSWORD='123123', MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
# 启动从服务器复制功能 start slave; # 查看从服务器状态 show slave statusG;
主机新建库、新建表、insert记录、从机复制
停止主从复制功能
stop slave;
重新配置主从
stop slave; reset master;
通过MyCat实现读写分离
修改MyCat的配置文件schema.xml中的dataHost标签的balance属性,通过此属性配置读写分离类型
balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上 balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡 balance="2",所有读操作都随机的在 writeHost、readhost 上分发 balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力
验证方式
验证方式:由于配置的binlog_format=STATEMENT ,所以在使用系统变量或者时间函数时会造成不一致,通过这种方式插入系统IP,查看是否是同一个服务读写即可验证。
# 启动MyCat # 在写主机插入 insert into mytbl values (1,@@hostname); # 在MyCat里查询 select * from mytbl; # 在Mycat里查询mytbl表,可以看到查询语句在主从两个主机间切换使用MyCat搭建读写分离-MySQL双主双从
一个主机M1用于处理所有的写请求,它的从机S1和另一台主机M2还有它的从机S2负责所有读请求。当M1主机宕机后,M2主机负责写请求,M1、M2互为备机。架构图如下
| 编号 | 角色 | IP 地址 | 机器名 |
|---|---|---|---|
| 1 | Master1 | 192.168.140.128 | host79 |
| 2 | Slave1 | 192.168.140.127 | host80 |
| 3 | Master2 | 192.168.140.126 | host81 |
| 4 | Slave2 | 192.168.140.125 | host82 |
修改MySQL配置文件/etc/my.cnf
Master1配置
# 主服务器唯一ID server-id=1 # 启用二进制日志 log-bin=mysql-bin # 设置不要复制的数据库(可设置多个) binlog-ignore-db=mysql binlog-ignore-db=information_schema # 设置需要复制的数据库 binlog-do-db=需要复制的主数据库名字 # 设置logbin格式 binlog_format=STATEMENT # 在作为从数据库的时候,有写入操作也要更新二进制日志文件 log-slave-updates # 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535 auto-increment-increment=1 # 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535 auto-increment-offset=1
Master2配置
# 主服务器唯一ID server-id=3 # 启用二进制日志 log-bin=mysql-bin # 设置不要复制的数据库(可设置多个) binlog-ignore-db=mysql binlog-ignore-db=information_schema # 设置需要复制的数据库 binlog-do-db=需要复制的主数据库名字 # 设置logbin格式 binlog_format=STATEMENT # 在作为从数据库的时候,有写入操作也要更新二进制日志文件 log-slave-updates # 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535 auto-increment-increment=1 # 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535 auto-increment-offset=1
Slave1配置
# 从服务器唯一ID server-id=2 # 启用中继日志 relay-log=mysql-relay
Slave2配置
# 从服务器唯一ID server-id=4 # 启用中继日志 relay-log=mysql-relay
并且主从都需要重启MYSQL服务、以及关闭防火墙
systemctl restart mysqld systemctl status mysqld
在两台主机上建立账户并授权slave
#在主机MySQL里执行授权命令 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123'; #查询Master1的状态 show master status; # 记录下File的Position的值,执行完此步骤后不操作主MySQL,防止主服务器状态值变化
在从机上配置需要复制的主机
Slave1复制Master1、Slave2复制Master2
#复制主机的命令 CHANGE MASTER TO MASTER_HOST='主机的IP地址', MASTER_USER='slave', MASTER_PASSWORD='123123', MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
#启动两台从服务器复制功能 start slave; #查看从服务器状态 show slave statusG;
两个主机互相复制
Master2 复制 Master1,Master1 复制 Master2
#启动两台主服务器复制功能 start slave; #查看从服务器状态 show slave statusG;
验证测试
Master1主机新建库、新建表、insert 记录,Master2和从机复制
通过MyCat实现读写分离
select user()
# 启动MyCat # 在写主机插入 insert into mytbl values (3,@@hostname); # 在MyCat里查询 select * from mytbl; # Master1宕机 systemctl stop mysqld # 在Mycat里插入数据依然成功,Master2自动切换为写主机 # Master1、Master2 互做备机,负责写的主机宕机,备机切换负责写操作,保证数据库读写分离高可用性。MyCat垂直拆分-分库
分库划分
一个数据库由很多表构成,每个表对应着不同的业务,垂直切分是按照业务将表进行分类,分到不同的数据库上面,这样可以将数据或者说压力分摊到不同的库上面。划分表的原则:有紧密关联关系的表应该在一个库里,相互没有关联关系的表可以分到不同的库里。
实现分库
修改schema.xml配置文件
select user() select user()
# 访问 Mycat mysql -umycat -p123456 -h 192.168.140.128 -P 8066 # 切换到 TESTDB # 创建 4 张表 # 查看表信息,可以看到成功分库
MyCat水平拆分-分表
分表划分
相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。即按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。
实现分表
第一步:选择要拆分的表,MySQL单表达到1000w条数据就到达了瓶颈,会影响查询效率。
第二步:分表字段,一般是主键ID、外键ID或者是时间戳。
第三步:修改配置文件schema.xml
# 为orders表设置数据节点为dn1、dn2,并指定分片规则为mod_rule(自定义的名字)
第四步:修改配置文件rule.xml
# 在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id, # 还有选择分片算法 mod-long(对字段求模运算),customer_id 对两个节点求模,根据结果分片 # 配置算法 mod-long 参数 count 为 2,两个节点customer_id mod-long2
第五步:重启MyCat让配置生效,访问测试分片
#在 mycat 里向 orders 表插入数据,INSERT 字段不能省略 INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020); #在mycat、dn1、dn2中查看orders表数据,分表成功MyCat安全设置
User标签权限控制
| 标签属性 | 说明 |
|---|---|
| name | 应用连接中间件逻辑库的用户名 |
| password | 该用户对应的密码 |
| TESTDB | 应用当前连接的逻辑库中所对应的逻辑表。schemas 中可以配置一个或多个 |
| readOnly | 应用连接中间件逻辑库所具有的权限。true 为只读,false 为读写都有,默认为 false |
Privileges标签权限控制
在 user 标签下的 privileges 标签可以对逻辑库(schema)、表(table)进行精细化的 DML 权限控制。
privileges 标签下的 check 属性,如为 true 开启权限检查,为 false 不开启,默认为 false。
由于 Mycat 一个用户的 schemas 属性可配置多个逻辑库(schema) ,所以 privileges 的下级节点 schema 节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制。
| DML 权限 | 增加(insert) | 更新(update) | 查询(select) | 删除(select) |
|---|---|---|---|---|
| 0000 | 禁止 | 禁止 | 禁止 | 禁止 |
| 0010 | 禁止 | 禁止 | 可以 | 禁止 |
| 1110 | 可以 | 禁止 | 禁止 | 禁止 |
| 1111 | 可以 | 可以 | 可以 | 可以 |
SQL拦截
白名单:可以通过设置白名单,实现某主机某用户可以访问 Mycat,而其他主机用户禁止访问。
黑名单:可以通过设置黑名单,实现 Mycat 对具体 SQL 操作的拦截,如增删改查等操作的拦截



