Mycat 是基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分库分表和读写分离,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。
MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得 MyCat 变得非常的强大。
Mycat对于我们Java程序员来说,就是一个近似等于 MySQL 的数据库服务器,你可以用连接 MySQL 的方式去连接 Mycat(除了端口不同,默认的Mycat 端口是 8066 而非MySQL 的 3306,因此需要在连接字符串上增加端口信息)。
数据分片包括里:垂直分片和水平分片
垂直分片包括:垂直分库和垂直分表
水平分片包括: 水平分库和水平分表。
垂直分库
1.数据库中不同的表对应着不同的业务,垂直切分是指按照业务的不同将表进行分类,分布到不同的数据库上面
2.将数据库部署在不同服务器上,从而达到多个服务器共同分摊压力的效果
垂直分表
表中字段太多且包含大字段的时候,在查询时对数据库的IO、内存会受到影响,同时更新数据时,产生的binlog文件会很大,MySQL在主从同步时也会有延迟的风险。
1.将一个表按照字段分成多表,每个表存储其中一部分字段。
//例如:对职位表进行垂直拆分, 将职位基本信息放在一张表, 将职位描述信息存放在另一张表
1.解决业务层面的耦合,业务清晰
2.能对不同业务的数据进行分级管理、维护、监控、扩展等
3.高并发场景下,垂直分库一定程度的提高访问性能
4.垂直拆分没有彻底解决单表数据量过大的问题
水平分库
将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈.
简单讲就是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,
例如将订单表 按照id是奇数还是偶数, 分别存储在不同的库中。
水平分表
针对数据量巨大的单张表(比如订单表),按照规则把一张表的数据切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。
总结
垂直分表: 将一个表按照字段分成多表,每个表存储其中一部分字段。
垂直分库: 根据表的业务不同,分别存放在不同的库中,这些库分别部署在不同的服务器.
水平分库: 把一张表的数据按照一定规则,分配到不同的数据库,每一个库只有这张表的部分数据.
水平分表: 把一张表的数据按照一定规则,分配到同一个数据库的多张表中,每个表只有这个表的部分数据。
读写分离指的是:主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。
注意: 读写分离的数据节点中的数据内容是一致,所以要先搭建主从复制架构.
Java工程里需要同时控制(连接)多个数据源:
1.mycat是一个中间件,sharding-jdbc是一个jar包。
2.使用mycat时不需要修改代码,而使用sharding-jdbc时需要修改代码。
3.Mycat 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库,
而 Sharding-JDBC 是基于 JDBC 的扩展,是以 jar 包的形式提供轻量级服务的
Mycat(proxy中间件层)
Sharding-jdbc(应用层):
新特性
1.192.168.58.100服务器上的MySQL要部署到docker中,方便后面我们快速搭建MySQL集群, 并且MySQL的版本使用MySQL8
2.192.168.58.200服务器,安装Mycat2之前要安装JDK,并且必须选择JDK1.8 避免出现其他问题
shell docker run -d \ -p 3310:3306 \ -v /msb/mysql/conf:/etc/mysql/conf.d \ -v /msb/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --name msb-mysql \ mysql:8.0.29
参数说明:
1.-p 3310:3306:表示端口映射,前者是宿主机端口,后者是容器内的映射端口,将容器的 3306 端口映射到宿主机的 3310 端口。
2.-v /msb/mysql/conf:/etc/mysql/conf.d: 配置文件映射,:前面是宿主机目录,:后面是映射到宿主机上的文件,这样就可以在宿主机上做修改,然后共享到容器上。
3.-v /msb/mysql/data:/var/lib/mysql :数据文件目录映射,避免容器出现问题,导致数据丢失。
4.-e MYSQLROOTPASSWORD=123456:初始化 root 用户的密码。
5.--name msb-mysql :容器名称
6.mysql:8.0.29 :镜像名称
进入容器,操作mysql
1. docker exec –it msb-mysql /bin/bash
2. 使用Navicat连接容器中的mysql 因为我们做了端口映射,所以连接的是192.168.58.100:3310