MyCat2学习:
一、mycat是什么:
mycat是数据库中间件。
连接java应用程序和数据库
二、为什么要学习mycat:
java与数据库紧耦合。
高访问量高并发对数据库的压力大
读写请求数据不一致
三、mycat能干什么?
1.读写分离:
2.数据分片
垂直拆分(分库),水平拆分(分表)、垂直拆分+水平拆分(分库分表)
3.多数据源整合
四、原理
Mycat的原理中最重要的一个词就是拦截:拦截用户发送过来的SQL语句,首先对SQL语句进行一些特定的分析:如分片分析,路由分析,读写分离分析,缓存分析等,然后将这个SQL发往后端真实的数据库,并将返回的结果做适当的处理,最终返回给用户。
五、MyCat2安装启动:
把这个jar放进解压的tar中的mycat\lib文件夹下
把整合好的文件夹拷贝到linux下/usr/local/
修改文件夹及以下文件的权限修改成最高权限,否则运行启动命令时,会因权限不足而报错
chmod -R 777 mycat
chmod -R 777 wrapper-linux-x86-32
chmod -R 777 wrapper-linux-x86-64
chmod -R 777 wrapper-linux-ppc-64
六、启动
在mycat连接的mysql数据库里添加用户
创建用户,用户名为mycat,密码为123456,赋权限,如下:
CREATE USER 'mycat'@'%'IDENTIFIED BY '123456';
–必须要赋的权限mysql8才有的
GRANTXA_RECOVER_ADMINON*.*TO'root'@'%';
—视情况赋权限
GRANTALLPRIVILEGESON*.*TO'mycat'@'%';flushprivileges;
2、修改mycat的prototype的配置
启动mycat之前需要确认prototype数据源所对应的mysql数据库配置,修改对应的user(用户),password(密码),url中的ip
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"root",
"type":"JDBC",
"url":"jdbc:mysql://localhost:3306/mydb1?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
测试远程访问数据库是否联通:
mysql -uroot -proot -h 192.168.126.129 -P 3306
七、启动Mycat
linux启动命令
cd /usr/local/mycat/bin/
./mycat start
./mycat stop
./mycat status
./mycat console
./mycat restart
八、登录
登录后台管理窗口
此登录方式用于管理维护Mycat
mysql -uroot -proot -P 9066
登录数据窗口
此登录方式用于通过Mycat查询数据,我们选择这种方式访问Mycat
mysql -uroot -proot -P 8066
九、MyCat的相关概念:
1、分库分表
按照一定规则把数据库中的表拆分为多个带有数据库实例,物理库,物理表访问路径的分表。
**分表:**一张订单表数据数百万,达到MySQL单表瓶颈,分到多个数据库中的多张表
**分库:**一个电商项目,分为用户库、订单库等等。
2、逻辑库
数据库代理中的数据库,它可以包含多个逻辑表。
解读:Mycat里定义的库,在逻辑上存在,物理上在MySQL里并不存在。有可能是多个MySQL数据库共同组成一个逻辑库。类似多个小孩叠罗汉穿上外套,扮演一个大人。
3、逻辑表
数据库代理中的表,它可以映射代理连接的数据库中的表(物理表)
解读:Mycat里定义的表,在逻辑上存在,可以映射真实的MySQL数据库的表。可以一对一,也可以一对多。
4、物理库
数据库代理连接的数据库中的库
解读:MySQL真实的数据库。
5、物理表
数据库代理连接的数据库中的表
解读:MySQL真实的数据库中的真实数据表。
6、拆分键
即分片键,描述拆分逻辑表的数据规则的字段
解读:比如订单表可以按照归属的用户id拆分,用户id就是拆分键
7、物理分表
指已经进行数据拆分的,在数据库上面的物理表,是分片表的一个分区
解读:多个物理分表里的数据汇总就是逻辑表的全部数据
8、物理分库
一般指包含多个物理分表的库
解读:参与数据分片的实际数据库
9、分库
一般指通过多个数据库拆分分片表,每个数据库一个物理分表,物理分库名字相同
解读:分库是个动作,需要多个数据库参与。就像多个数据库是多个盘子,分库就是把一串数据葡萄,分到各个盘子里,而查询数据时,所有盘子的葡萄又通过Mycat2组成了完整的一串葡萄。
10、分片表,水平分片表
按照一定规则把数据拆分成多个分区的表,在分库分表语境下,它属于逻辑表的一种
解读:安按照规则拆分数据,上个例子中的那串葡萄。
11、单表没有分片,
没有数据冗余的表,
解读:没有拆分数据,也没有复制数据到别的库的表。
12、全局表,广播表
每个数据库实例都冗余全量数据的逻辑表.它通过表数据冗余,使分片表的分区与该表的数据在同一个数据库实例里,达到join运算能够直接在该数据库实例里执行.它的数据一致一般是通过数据库代理分发SQL实现.也有基于集群日志的实现
解读:例如系统中翻译字段的字典表,每个分片表都需要完整的字典数据翻译字段。
13、ER表
狭义指父子表中的子表,它的分片键指向父表的分片键,而且两表的分片算法相同广义指具有相同数据分布的一组表
解读:关联别的表的子表,例如:订单详情表就是订单表的ER表
14、集群
多个数据节点组成的逻辑节点.在mycat2里,它是把对多个数据源地址视为一个数据源地址(名称),并提供自动故障恢复,转移,即实现高可用,负载均衡的组件。
解读:集群就是高可用、负载均衡的代名词
15、数据源
连接后端数据库的组件,它是数据库代理中连接后端数据库的客户端
解读:Mycat通过数据源连接MySQL数据库
16、原型库(prototype)
原型库是Mycat2后面的数据库,比如mysql库
解读:原型库就是存储数据的真实数据库,配置数据源时必须指定原型库
十、MyCat 的配置文件
十一、搭建读写分离
我们通过Mycat和MySQL的主从复制配合搭建数据库的读写分离,实现MySQL的高可用性。
10.1搭建一主一从
一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下
10.1.1、搭建MySQL数据库主从复制
主从复制的原理:
主机配置:
修改配置文件:
vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制文件
log-bin=chf-bin
#需要复制的数据库
binlog-do-db=mydb1
#设置logbin的格式
binlog_format=STATEMENT
从机配置
修改配置文件:vim/etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
重启mysql服务
systemctl restart mysqld
systemctl status mysqld
#创建从机用户
CREATE USER 'slave1'@'%' IDENTIFIED BY 'root';
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
#赋权限
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
#刷新
flush privileges;
#查看主机的状态
show master status;
#连接主机地址
CHANGE MASTER TO MASTER_HOST='192.168.126.128',
#从机用户
MASTER_USER='slave1',
#从机密码
MASTER_PASSWORD='root',
#日志文件名,开始节点(主机show master status;可以查看)
MASTER_LOG_FILE='chf-bin.000001',MASTER_LOG_POS=1136;
#启动从服务器复制功能
start slave;
#查看从服务器状态
show slave status;
10.1.2、配置mycat读写分离:
#登录Mycat,创建逻辑库,配置数据源
#在Mycat里创建数据库mydb1,创建db2逻辑库
CREATE DATABASE mydb1;
修改配置文件mydb1.schema.json,指定数据源"targetName":“prototype”
"targetName":"prototype"
使用注解的方式添加数据源:
#登录Mycat,注解方式添加数据源,指向从机
/*+mycat:createDataSource{"name":"rwSepw","url":"jdbc:mysql://192.168.126.128:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"root"}*/;
/*+mycat:createDataSource{"name":"rwSepr","url":"jdbc:mysql://192.168.126.129:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"root"}*/;
#查询配置数据源结果
/*+mycat:showDataSources{}*/;
更新集群信息,添加dr0从节点.实现读写分离
#更新集群信息,添加dr0从节点.
/*!mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]}*/;
#查看配置集群信息
/*+mycat:showClusters{}*/;
查看集群文件:
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetryCount":3,
"minSwitchTimeInterval":300,
"showLog":false,
"slaveThreshold":0.0
},
"masters":[
"rwSepw"
],
"maxCon":2000,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"replicas":[
"rwSepr"
],
"switchType":"SWITCH"
}