一、概述
1. 数据库中间件
中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。
例子:Tomcat- > web中间件。
数据库中间件:连接 java 应用程序和数据库
例子:mycat 属于数据库中间件
2. 为什么需要 Mycat?
单体应用中,java 应用和单台或多台 mysql 过度耦合,会有以下缺点:
① Java与数据库紧耦合 --> Mycat
② 高访问量高
并发对数据库的压力 --> 读写分离 mycat
③ 读写请求数据不一致 --> mysql 主从复制
3. 数据库中间件对比
二、mycat 作用
1. 读写分离
2. 分库分表[数据分片]
垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)
3. 多数据源整合
三、mycat 原理
Mycat 的原理中最重要的一个动词是**“拦截”,它拦截了用户发送过来的SQL 语句**,首先对 SQL 语句做了一些特定的分析:如==分片分析、路由分析、读写分离分析、缓存分析==等,然后将此SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用Mycat还是MySQL。
四、安装
解压压缩包
递归拷贝 解压缩后的文件夹 到 local 目录
cp -r mycat /usr/local
五、启动
修改 server.xml
修改schema.xml
验证数据库访问情况
启动 mycat
六、登录
登录后台管理窗口
mysql -umycat -p123456 -P 9066 -h 192.168.140.128
登录数据管理窗口
mysql -umycat -p123456 -P 8066 -h 192.168.140.128
七、读写分离
1. 一主一从
Mysql 主从复制原理
biglog 日
志三种格式
主机配置
#修改配置文件:vim /etc/my.cnf
#主服务器唯一
IDserver-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
从机配置
#修改配置文件:vim /etc/my.cnf
#从服务器唯一
IDserver-id=2
#启用中继日志
relay-log=mysql-relay
主机、从机重启 Mysql 服务,都关闭防火墙
# 重启 mysql
systemctl restart mysqld
# 查看 mysql 服务状态
systemctl status mysqld
# 查看防火墙状态
systemctl status firewalld
在主机创建账户并授权 slave
#在主机MySQL里执行授权命令
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';
查询 master 状态
show master status
从机配置要复制的主机
主机建库、建表、插记录、从机复制
停止从机服务复制功能
stop slave
重新配置主从
stop slave
# 重置 master
reset master
2. 读写分离
balance 属性
启动 mycat
./ mycat console
验证 读写分离
3. 双主双从
1. 双主机配置
Master 1 配置
# 修改配置文件:vim /etc/my.cnf
#主服务器唯一
IDserver-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=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
Master 2 配置
# 修改配置文件:vim /etc/my.cnf
#主服务器唯一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=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2
2. 双从机配置
Slave1 配置
#修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
Slave2 配置
# 修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=4
#启用中继日志
relay-log=mysql-relay
3. 双主机,双从机重启 mysql 服务
4. 主从机都关闭防火墙
5. 在两台主机上执行授权命令
#在主机MySQL里执行授权命令
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';
#查询Master1的状态
show master status;
6. 从机上配置需要复制的主机
7. 两个主机互相复制
8. Master1主机新建库、新建表、insert记录,Master2和从机复制
9. 停止从服务复制功能
stop slave
10. 修改Mycat的配置文件schema.xml
修改的balance属性,通过此属性配置读写分离的类型
启动mycat验证读写分离
Master1、Master2互做备机,负责写的主机宕机,备机切换负责写操作,保证数据库读写分离高可用性
八、垂直拆分 - 分库
一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图
1. 如何划分表
一个问题:在两台主机上的两个数据库中的表,能否关联查询?
答案:不可以关联查询。
分库的原则:有紧密关联关系的表应该在一个库里,相互没有关联关系的表可以分到不同的库里。
比如:客户表分在一个数据库,另外三张都需要关联查询,分在另外一个数据库