MyCat安装部署
官网下载地址http://dl.mycat.org.cn/
三个配置文件:schema.xml
定义逻辑库、表、分片节点等内容、rule.xml
定义分片规则、server.xml
定义用户以及系统相关变量如端口
MyCat对接MySQL
修改配置文件server.xml
中的用户信息,配置逻辑库的访问用户和库名
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
修改配置文件schema.xml
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="bigdata" database="hudi" />
<dataHost name="bigdata" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="bigdata:3306" user="root"
password="root">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="bigdata:3306" user="root" password="root" />
</writeHost>
</dataHost>
验证数据库访问情况
#如远程访问报错,请建对应用户
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 status\G;
主机新建库、新建表、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 不负担读压力
<dataHost name="host1" maxCon="1000" minCon="10" balance="2"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
验证方式
验证方式:由于配置的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 status\G;
两个主机互相复制
Master2 复制 Master1,Master1 复制 Master2
#启动两台主服务器复制功能
start slave;
#查看从服务器状态
show slave status\G;
验证测试
Master1主机新建库、新建表、insert 记录,Master2和从机复制
通过MyCat实现读写分离
<dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100" >
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.140.128:3306" user="root"password="123123">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.140.127:3306" user="root" password="123123" />
</writeHost>
<writeHost host="hostM2" url="192.168.140.126:3306" user="root"password="123123">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.140.125:3306" user="root"
password="123123" />
</writeHost>
</dataHost>
# 启动MyCat
# 在写主机插入
insert into mytbl values (3,@@hostname);
# 在MyCat里查询
select * from mytbl;
# Master1宕机
systemctl stop mysqld
# 在Mycat里插入数据依然成功,Master2自动切换为写主机
# Master1、Master2 互做备机,负责写的主机宕机,备机切换负责写操作,保证数据库读写分离高可用性。
MyCat垂直拆分-分库
分库划分
一个数据库由很多表构成,每个表对应着不同的业务,垂直切分是按照业务将表进行分类,分到不同的数据库上面,这样可以将数据或者说压力分摊到不同的库上面。划分表的原则:有紧密关联关系的表应该在一个库里,相互没有关联关系的表可以分到不同的库里。
实现分库
修改schema.xml
配置文件
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2" ></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="orders" />
<dataNode name="dn2" dataHost="host2" database="orders" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.140.128:3306" user="root"password="123123">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM2" url="192.168.140.127:3306" user="root"password="123123">
</writeHost>
</dataHost>
# 访问 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(自定义的名字)
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table>
第四步:修改配置文件rule.xml
# 在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id,
# 还有选择分片算法 mod-long(对字段求模运算),customer_id 对两个节点求模,根据结果分片
# 配置算法 mod-long 参数 count 为 2,两个节点
<tableRule name="mod_rule">
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
第五步:重启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 操作的拦截,如增删改查等操作的拦截