Mycat学习笔记
作者:互联网
1.安装
-
下载安装包
资源地址:http://dl.mycat.org.cn/2.0/
1.安装程序包:http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
2.Jar包:http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar -
将jar包拷贝进安装包lib目录下
-
将安装包上传到服务器/usr/local目录下
-
修改安装包bin目录下的文件权限
1.mycat文件
2.wrapper-linux-ppc-64
3.wrapper-linux-x86-32
4.wrapper-linux-x86-64 -
修改mycat的prototype的配置
修改/bin/datasources/目录下的prototypeDs.datasource.json配置文件
2.启动
-
启动命令
./mycat start
./mycat restart
3.mysql主从复制实践
步骤:
-
修改主机mysql的配置文件my.cnf
# 主服务器唯一id
server-id=1
# 启用二进制文件
log-bin=mysql-bin
# 设置不要复制的数据库(可以设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 设置需要复制的数据库
binlog-do-db=test
# 设置binlog格式
binlog_format=STATEMENT主从复制的三种模式:
statement
row
mixed -
修改从机mysql的配置文件my.cnf
# 从服务器唯一id
server-id=2
# [可选] 启用中继日志
relay-log=mysql-relay -
在主机为从机创建一个账户,并授权
# 创建账户并授权
CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
# 此语句必须执行
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
# 查询master状态
show master status; -
在从机上执行命令(配置需要复制的主机)
CHANGE MASTER TO MASTER_HOST ='主机的IP地址',
MASTER_PORT = 主机端口号
MASTER_USER = 'slave1',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.具体数字',
MASTER_LOG_POS = 具体值;
# 启动从服务器复制功能
start slave;
# 查看从服务器状态
show slave status\G;
# 查看Slave_IO_Runnging和Slave_SQL_Runnging的值是不是Yes,如果不是,可查看Last_IO_Error和Last_SQL_Error字段的值,查看具体原因
常见问题:
如果想重新配置,可停下从机复制功能
# 从服务停止复制功能
stop slave;
# 重置配置的主机信息
reset master;
4.配置MyCat读写分离
-
查看数据源
/*+ mycat:showDataSources{} */;
-
查看集群
/*+ mycat:showClusters{} */;
-
创建数据源
/*+ mycat:createDataSource{
"name":"数据源名称",
"url":"jdbc:mysql://127.0.0.1:3306",
"user":"root",
"password":"123456"
}*/ -
添加集群配置
/*! mycat:createCluster{
"name":"集群名称",
"masters":["主数据源1",...],
"replicas":["从数据源1", ...]
}*/
5.搭建双主双从双从
关系图
1.master1配置
修改mysql配置文件my.cnf
# 主服务器唯一id
server-id=1
# 启用二进制文件
log-bin=mysql-bin
# 设置不要复制的数据库(可以设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 设置需要复制的数据库
binlog-do-db=test
# 设置binlog格式
binlog_format=STATEMENT
# 作为从数据库的时候,写入操作也要更新二进制日志文件
log-slave-updates
# 自增长字段每次递增的量,其默认值是1
auto-increment-increment=2
# 自增长字段从哪个数开始,指字段一次递增多少,取值范围是1
auto-increment-offset=1
2.master2配置
修改mysql配置文件my.cnf
# 主服务器唯一id
server-id=3
# 启用二进制文件
log-bin=mysql-bin
# 设置不要复制的数据库(可以设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 设置需要复制的数据库
binlog-do-db=test
# 设置binlog格式
binlog_format=STATEMENT
# 作为从数据库的时候,写入操作也要更新二进制日志文件
log-slave-updates
# 自增长字段每次递增的量,其默认值是1
auto-increment-increment=2
# 自增长字段从哪个数开始,指字段一次递增多少,取值范围是1
auto-increment-offset=2
3.slave1配置
修改mysql的配置文件my.cnf
# 从服务器唯一id
server-id=2
# [可选] 启用中继日志
relay-log=mysql-relay
4.slave2配置
修改mysql的配置文件my.cnf
# 从服务器唯一id
server-id=4
# [可选] 启用中继日志
relay-log=mysql-relay
5.各服务器防火墙开放mysql端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
6.两台主机上建立账户并授权给slave
# 创建账户并授权
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
# 此语句必须执行
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
# 查询master状态
show master status;
7.各从机上配置需要复制的主机
Slave1复制Master1,Slave2复制Master2
CHANGE MASTER TO MASTER_HOST ='主机的IP地址',
MASTER_PORT = 主机端口号
MASTER_USER = 'slave',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.具体数字',
MASTER_LOG_POS = 具体值;
# 启动从服务器复制功能
start slave;
# 查看从服务器状态
show slave status\G;
# 查看Slave_IO_Runnging和Slave_SQL_Runnging的值是不是Yes,如果不是,可查看Last_IO_Error和Last_SQL_Error字段的值,查看具体原因
8.两个主机相互复制
Master2复制Master1,Master1复制Master2
CHANGE MASTER TO MASTER_HOST ='主机的IP地址',
MASTER_PORT = 主机端口号
MASTER_USER = 'slave',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.具体数字',
MASTER_LOG_POS = 具体值;
# 启动从服务器复制功能
start slave;
# 查看从服务器状态
show slave status\G;
# 查看Slave_IO_Runnging和Slave_SQL_Runnging的值是不是Yes,如果不是,可查看Last_IO_Error和Last_SQL_Error字段的值,查看具体原因
9.修改mycat2的集群配置实现多主多从
1.双主双从集群角色划分
m1:主机
m2:备机,也负责读
s1,s2:从机
1.各数据源配置(看情况配置)
cd /usr/local/mycat/conf/datasources
vim master01.datasource.json
vim master02.datasource.json
vim slave01.datasource.json
vim slave02.datasource.json
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"master",
"password":"root123",
"type":"JDBC",
"url":"jdbc:mysql://1.117.226.189:33056/test?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
2.修改集群配置
cd /usr/local/mycat/clusters
cp prototype.cluster.json master-slave.cluster.json
vim master-slave.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
// 主节点数据源
"masters":[
"master01","master02"
],
// 从节点数据源
"replicas":[
"master02","slave-01","slave-02"
],
"maxCon":200,
// 集群名称
"name":"master-slave",
// 负载均衡
"readBalanceType":"BALANCE_ALL",
"switchType":"SWITCH"
}
10.重启Mycat
./mycat restart
6.分库分表
垂直拆分:分库
水平拆分:分表
分库原则:有紧密关联关系的表放在同一个库里,相互没有关联关系的表可以分到不同的库里。
1.添加数据库、存储数据源
/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://1.117.226.189:33056",
"user":"root",
"password":"root123"
}*/
/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://1.117.226.189:33056",
"user":"root",
"password":"root123"
}*/
/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://120.76.137.249:33056",
"user":"root",
"password":"root123"
}*/
/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://120.76.137.249:33056",
"user":"root",
"password":"root123"
}*/
通过注释命令添加数据源后,会在对应的目录生成相关的配置文件
cd /usr/local/mycat/conf/datasources
如图:
2.添加集群配置
在mycat执行命令:
/*! mycat:createCluster{
"name":"c0",
"masters":["dw0"],
"replicas":["dr0"]
}*/
/*! mycat:createCluster{
"name":"c1",
"masters":["dw1"],
"replicas":["dr1"]
}*/
在对应的目录可查看配置
cd /usr/local/mycat/conf/clusters
如图:
3.在mycat上创建逻辑库
create DATABASE db1;
对应的mycat的配置文件:
cd /usr/local/mycat/conf/datasources
如图:
4.广播表(全局表)的创建
mycat只需要在建表语句最后加上BROADCAST关键字
CREATE TABLE db1.`user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(255) DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 BROADCAST
5.数据分片
dbpartition BY mod_hash(order_no) tbpartition BY mod_hash(order_no) tbpartitions 1 dbpartitions 2
数据库根据用户id取模分片,数据表根据用户id取模分片,数据库分2个,数据表在每个数据库里分1个
CREATE TABLE db1.`orders` (
`id` int NOT NULL COMMENT 'id',
`order_no` varchar(255) DEFAULT NULL COMMENT '订单号',
`user_id` int DEFAULT NULL COMMENT '用户id',
`amount` decimal(12, 2) DEFAULT NULL COMMENT '金额',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
dbpartition BY mod_hash(user_id) tbpartition BY mod_hash(user_id) tbpartitions 1 dbpartitions 2
-- 插入数据
insert into db1.`orders` (id, order_no, user_id, amount) VALUES (1,"101", 4, 432.12);
insert into db1.`orders` (id, order_no, user_id, amount) VALUES (2,"102", 4, 543.34);
insert into db1.`orders` (id, order_no, user_id, amount) VALUES (3,"103", 4, 543.33);
insert into db1.`orders` (id, order_no, user_id, amount) VALUES (4,"104", 5, 754.74);
insert into db1.`orders` (id, order_no, user_id, amount) VALUES (5,"105", 5, 937.23);
insert into db1.`orders` (id, order_no, user_id, amount) VALUES (6,"106", 5, 342.34);
-- 查询数据
select * from order;
6.创建ER表
与分片表关联的表如何分表,也就是ER表如何分表,如下
CREATE TABLE db1.`order_details` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`order_id` int DEFAULT NULL COMMENT '订单id',
`detail` varchar(128) DEFAULT NULL COMMENT '详情',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
dbpartition BY mod_hash(order_id) tbpartition BY mod_hash(order_id) tbpartitions 1 dbpartitions 2
# 插入数据
insert into order_details(id, order_id, detail) VALUES(1, 1, 'detail');
insert into order_details(id, order_id, detail) VALUES(2, 2, 'detail');
insert into order_details(id, order_id, detail) VALUES(3, 3, 'detail');
insert into order_details(id, order_id, detail) VALUES(4, 4, 'detail');
insert into order_details(id, order_id, detail) VALUES(5, 5, 'detail');
insert into order_details(id, order_id, detail) VALUES(6, 6, 'detail');
# 关联查询
select * from order o INNER JOIN order_details od on o.id = od.order_id;
查看配置的表是否具有ER关系,使用以下执行语句:
/*+ mycat:showErGroup{}*/
group_id表示相同的组,改组中的表具有相同的存储分布
7.常用分片规则
mycat2支持常用的(自动)HASH型分片算法,也兼容1.6的内置(cobar)分片算法.
HASH型分片算法默认要求集群名字以c开头为前缀,数字为后缀,c0就是就是分片表第一个节点,c1就是第二个节点,改命名规则允许用户手动改变.
标签:slave,笔记,id,学习,mycat,mysql,MASTER,Mycat,order 来源: https://www.cnblogs.com/zhouqiangshuo/p/16511978.html