文章目录
一、MyCat概述
1.Mycat
- Mycat是数据库中间件,所谓数据库中间件是连接连接java应用程序和数据库中间的软件。
- 在未使用Mycat遇到的问题
- Java与数据库的紧耦合
- 高访问量高并发对数据库的压力
- 读写请求不一致
2.Mycat与其他数据库中间件的区别
Mycat的优势:
- 性能可靠稳定
基于阿里开源的Cobar产品研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例,使得MyCat一开始就拥有一个很好的起点。 - 强大的技术团队
MyCat现在由一支强大的技术团队维护,吸引和聚集了一大批业内大数据和云计算方面的资深工程师、架构师、DBA,优秀的团队保障了Mycat的稳定高效运行。 - 体系完善
MyCat已经形成了一系列周边产品,比较有名的是Mycat-web、Mycat-NIO、Mycat-Balance等,已经形成了一个比较完成的解决方案,而不仅仅是一个中间件。
3.Mycat的应用场景
- 高可用性与Mysql读写分离
利用Mycat可以轻松实现热备份,当一台服务器停机呢,可以由双机或集群中的另一台服务器自动接管其业务,从而在无须人工干预的情况下,保证系统持续提供服务。这个切换动作由Mycat自动切换完成。
Mycat的读写分离及自动切换都依赖于数据库产品的主从同步。 - 百亿大表水平分表、集群并行计算
数据切分是Mycat的核心功能,是指通过某种特定的条件,将存放在一个数据库中的数据分散存放在多个数据库(主机)中,以达到分散单台设备负载的效果。
数据切分有两种切分模式:- 按照不同的表将数据切分到不同的数据库中,这种切分叫做数据的垂直切分。
- 根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多个数据库中,这种切分叫做数据的水平切分。当数据量超过800W行且需要做分片时,可以利用Mycat实现数据切分。
- 数据库路由器
Mycat基于MySQL实例的连接池复用机制,可以让每个应用最大程度地共享一个MySQL实例的所有连接池,让数据库的并发访问能力大大提升。 - 整合多种数据源
当一个项目需要用到多种数据源,如Oracle、MySQL、SQL Server、PostgreSQL时,可以利用Mycat进行整合,只需要访问Mycat这一个数据源就行。
4.Mycat的核心概念
- 逻辑库schema
业务开发人员通常在实际应用中并不需要知道中间件的存在,只需要关注数据库,所以数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。
逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的table。 - 逻辑表table
在分布式数据库中,对于应用来说,读写数据的表就是逻辑表。逻辑表可以分布在一个或多个分片库中,也可以不分片。
逻辑表table,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。 - 数据节点DataNode(分片节点)与节点主机(DataHost)
将数据切分后,每个分片节点不一定会独占一台机器,同一个机器上面可以有多个分片数据库,这样一个或多个分片节点(DataNode)所在的机器就是节点主机(DataHost)。为了规避单点主机并发数量的限制,尽量将读写压力高的分片节点(DataNode)均匀的放在不同的节点主机(DataHost)上。 - 用户
MyCat的用户(类似于MySQL的用户,支持多用户)
<user name="user">
<property name="password">123456</property>
<property name="schemas">TestDB</property>
<property name="readOnly">true</property>
</user>
5.Mycat的原理
- Mycat的原理中最重要的一个动作是"拦截",它拦截了用户发送过来的SQL语句。
- 分析SQL语句流程,首先对SQL语句做了一些特定的分析,如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
- 分析SQL语句涉及的表。
- 查看表的定义,如果表存在分片规则,则获取SQL语句的分片字段。
- 将SQL语句发送到对应的分片去执行。
- 最后处理所有分片返回的数据并返回给客户端。
二、MyCat的部署安装
1.MySQL主从复制概述
- 主从复制是MySQL自己的功能
- MySQL是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证MySQL数据库的可靠性。就要会一些提高可靠性的技术。
- 解决性能问题,采用多台Mysql数据库(集群),从而提高效率
- MySQL主从复制原理,是采用Binary log文件进行复制,我们都知道MySQL的数据库会产生一个二进制日志,就是binlog,该日志文件记录了数据的任何修改,所以从机Slave会从主机读取二进制文件binlog日志到本机的I/O thread中,然后写入一个Relay log文件中,从机开启了一个SQL thread定时检查Relay log文件,如果发现有更新,立即把更新的内容在本地的数据库上执行。
- binlog日志的三种格式
- Statement:每一条会修改数据的sql都会记录在binlog中
- Row:仅保存哪条记录被修改(即不完全记录,只记录该SQL中有修改的部分)
- Mixed:以上两种的混合使用,一般的语句修改用statement,全表更新使用Row,但是无法使用@@host name
- 二进制日志位置,在my.cnf文件中使用log-bin=指定位置;命名规则为mysql-bin.000000 (后为6位数字)
在mysql命令行客户端中,查看二进制日志位置:show variables like %log_bin%;
- 查看二进制日志格式:
show variables like %format%;
- 查看当前使用的二进制日志文件:
show master status;
2.MySQL主从复制的搭建
2.1安装MySQL数据库
- 准备两台虚拟机,主机与从机,开启多个终端同步命令
- 下载YUM库:
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
- 安装YUM库:
rpm -ivh mysql57-community-release-el7-10.noarch.rpm
- 安装MySQL服务:
yum -y install mysql-community-server
- 此时出现问题: 源 “MySQL 5.7 Community Server” 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。
解决方法:
rm /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
再次执行安装MySQL服务:yum -y install mysql-community-server
即删除原有公钥 URL ,插入网络公钥URL,如果存在则递归删除。- 完成安装,启动mysql:
systemctl start mysqld
- 完成安装,启动mysql:
- 从日志文件中找出密码:
grep "password" /var/log/mysqld.log
- 进入mysql命令行客户端:
mysql -u root -p 密码
- 修改密码策略
set global validate_password_policy=0;
set global validate_password_policy=LOW;
set global validate_password_length=6;
- 修改完策略后,修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
- 开启远程连接
- 使用mysql库:
use mysql
- 查询user表的user,host字段:
select user ,host from user;
- 将root用户修改为任意ip主机都可以访问,即允许远程连接:
update user set host = "%" where user = "root";
- 使用mysql库:
2.2开启bin-log日志
- 修改主服务器Master
- 修改配置文件:
vim /etc/my.cnf
,添加如下配置:#主服务器唯一ID server-id=1 #启动二进制日志 bin-log=mysql-bin
- 修改配置文件:
- 修改从服务器Master
- 修改配置文件:
vim /etc/my.cnf
,添加如下配置:#从服务器唯一ID server-id=2 #启用中继日志 relay-log=mysql-realy
- 修改配置文件:
- 重启两台服务器的mysql服务:
service mysqld restart
或systemctl restart mysqld
- 修改密码策略
set global validate_password_policy=0;
set global validate_password_policy=LOW;
set global validate_password_length=6;
- 在主服务器上建立账户并授权slave,以实现主从复制:
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by '123456';
一般不用root账号,"%"表示所有客户端都可能连,只要账号跟密码正确,此处可用具体客户端IP代替,加强安全。 - 查看Master的状态:
show master status;
执行完此步骤后,不要再操作主服务器MySQL,防止主服务器状态值发生变化。 - 配置从服务器slave:
change master to master_host='192.168.126.17',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=430;
- 启动从服务器的复制功能:
start slave;
- 检查从服务器的复制功能状态:
show slave status \G;
Slave_IO_Running以及Slave_SQL_Running都为yes,即配置主从复制成功。 - 在主服务器Mysql建立数据库,插入一条数据,再由从服务器Mysql查询。
- 主服务器Mysql创建数据库:
create database mydb;
- 使用数据库:
use mydb;
- 创建表mytb:
create table mytb(id int(3),name char(10));
- 插入一条数据:
insert into mytb values(001,"zzx");
- 从服务器Mysql查询:
show databases;
- 使用数据库:
use mydb;
- 查询表:
select * from mytb;
- 主服务器Mysql创建数据库:
3.Docker搭建MySQL主从复制
-
关闭之前的mysql服务:
systemctl stop mysqld
-
下载docker:
yum -y install docker
-
启动docker:
systemctl start docker
-
通过docker指令拉取镜像:
docker pull mysql:latest
-
启动Master:
docker run -p 3305:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
-
启动Slave:
docker run -p 3304:3306 --name slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
参数:
–name:为容器指定名称
-p:将容器的指定端口映射到主机的指定端口
-e:设置环境变量
-d:后台运行容器,并返回容器id -
查看是否启动成功:
docker ps -a
Up即启动 -
配置Master
- 进入到master容器:
docker exec -it master /bin/bash
- 进入docker容器后只显示bash-4.4,则输入:
cp /etc/skel/.bash* /root/
- 修改my.cnf文件:
vim /etc/my.cnf
,添加如下内容,且必须放在[mysqld]下一行:#配置唯一ID server-id=17 #开启二进制日志 log-bin=mysql-bin
- 若vim报错,有2种方法
- 在docker容器内下载vim
apt-get update
apt-get install vim
然后就可以使用vim了,但是这种是临时文件,容器被删除就失效了。 - 直接拷贝出来修改后再拷贝进去,不用下载vim:
docker cp master:/etc/my.cnf .
vim my.cnf
docker cp my.cnf master:/etc/
- 在docker容器内下载vim
- 若vim报错,有2种方法
- 进入到master容器:
-
重启Mysql服务:
docker restart master
-
进入master容器,进入master数据库的命令行客户端:
mysql -u root -p
,再输入密码123456 -
创建数据同步用户:
CREATE USER slave IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%' ;
FLUSH PRIVILEGES;
-
配置Slave
- 拷贝容器内的文件:
docker cp slave:/etc/my.cnf .
- 编辑my.cnf文件:
vim my.cnf
,添加如下:# 配置唯一ID server-id=18 # 开启二进制日志,以备slave作为其他slave的master时使用 log-bin=mysql-slave-bin # 开启中继日志 relay-log=mysql-relay-bin
- 将修改好的my.cnf文件拷贝回容器:
docker cp my.cnf master:/etc/
- 拷贝容器内的文件:
-
重启Mysql服务:
docker restart slave
-
进入master容器,进入master数据库的命令行客户端:
mysql -u root -p
,再输入密码123456 -
此时是同一台虚拟机中的话可以如此来区分ip地址
- 获取主服务器容器的ip地址:
docker inspect master
- 获取从服务器容器的ip地址:
docker inspect slave
- 获取主服务器容器的ip地址:
-
版本是大于8.0.4的,需要在master上更换密码机制并修改密码:
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-
查看master的状态:
show master status;
-
进入从服务器slave的mysql命令行客户端,配置主从复制:
change master to master_host='192.168.126.17',master_port=3305,master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=324;
参数:- master_host: Master 的IP地址
- master_user: 在 Master 中授权的用于数据同步的用户
- master_password: 同步数据的用户的密码
- master_port: Master 的数据库的端口号
- master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
- master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
- master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。
-
在从服务器Slave中开启主从复制:
start slave;
-
在slave中查看主从同步状态:
show slave status \G;
-
重置主从关系:
- 关闭主从复制:
stop slave;
- 重置slave的所有文件:
reset slave all;
- 关闭主从复制:
4.MyCat下载安装及管理命令详解
- MyCat下载地址:http://www.mycat.org.cn/mycat1.html
- 将MyCat和JDK从mobax终端上传到master的/opt目录中,shell则用rz,lz指令
因为MyCat需要JDK环境 - 进入/opt目录,解压Mycat压缩文件:
tar -zxvf Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz -C /usr/local/
- 解压JDK压缩文件:
tar -zxvf jdk-11.0.15.1_linux-x64_bin.tar.gz -C /usr/local/
- 配置JDK环境,进入到/usr/local目录下,获取JDK名字,再编辑profile文件:
vim /etc/profile
,在文件底部添加如下配置:export JAVA_HOME=/usr/local/jdk-11.0.15.1 export PATH=$PATH:$JAVA_HOME/bin
- 生效配置文件profile:
source /etc/profile
- 查看jdk的版本号:
java -version
- 如果出现OpenJDK,则进行如下操作:
- 查看OpenJDK相关文件:
rpm -qa |grep java
- 卸载所有相关文件:
rpm -e --nodeps 文件名
- 生效profile文件:
source /etc/profile
- 查看jdk的版本号:
java -version
- 查看OpenJDK相关文件:
- 配置MyCat环境,编辑profile文件:
vim /etc/profile
,在文件底部添加如下配置:export MYCAT_HOME=/usr/local/mycat export PATH=$PATH:$MYCAT_HOME/bin
- 生效配置文件profile:
source /etc/profile
- MyCat操作命令
- 启动mycat:
mycat start
- 停止mycat:
mycat stop
- 前台运行mycat带控制台输出:
mycat console
- 重启mycat:
mycat restart
- 暂停mycat:
mycat pause
- 查看mycat状态:
mycat status
- 启动mycat:
- 使用MySQL命令进行MyCat连接
MyCat提供类似数据库的管理监控方式,可以通过MySQL命令行登录管理端口(9066)执行相应的SQL语句进行管理,也可以通过JDBC方式进行远程连接管理。
管理端口9066
- 9066用于查看MyCat的运行状态:
mysql -uroot -p123456 -h 192.168.126.17 -P9066 -DTESTDB
参数:
-h:后面是主机。 即当前Mycat安装的主机IP地址。
-u:Mycat server.xml中配置逻辑库的用户。
-p:Mycat server.xml中配置逻辑库的密码。
-P:后面是管理端口号。注意P是大写。
-D:Mycat server.xml中配置逻辑库
数据端口8066
-
8066用于进行数据的CRUD操作:
mysql -uroot -p123456 -h 192.168.126.17 -P8066 -DTESTDB
-
MyCat的连接用户名相关信息在配置文件
/usr/local/mycat/conf/server.xml
中编辑 -
show命令
- 查看所有的可用命令:
show @@help;
- 查看所有的逻辑数据库:
show @@database;
- 查看所有的数据节点:
show @@datanode;
- 查看所有的数据源:
show @@datasource;
- 查看所有的可用命令:
5.MyCat的核心配置文件及目录结构
三个配置文件
- schema.xml:定义逻辑库、表、分片节点等内容。
- rule.xml:定义分片规则。
- server.xml:定义用户以及系统的相关变量,如端口等。
目录结构
- bin:可执行文件
- conf:配置文件
- lib:存放jar包
- logs:日志信息
- tmlogs:临时日志
- version.txt:版本信息
总结:
- Mycat是数据库中间件,主要解决高访问量高并发对数据库的压力。
Mycat技术是在Cobar基础上发展的,Mycat的优势是性能可靠稳定、体系完善、强大的技术团队 - Mycat实现MySQL读写分离必须依赖MySQL的主从复制。
MyCat的应用场景是可以自动进行主从切换以及读写分离、分库分表、整合多种数据源。
Redis的主从切换是通过配置Cluster模式生效的,Cluster模式也是哨兵模式的升级版,也有读写分离、分片机制。 - 逻辑库schema,与MySQL的Database对应,一个逻辑库定义了所包括的逻辑表table。
逻辑表table,即物理数据库中存储的某一张表。将逻辑表存储在逻辑数据节点DataNode上,并声明。可以分布在一个或多个分片节点(DataNode)。
逻辑数据节点DataNode,也称为分片节点。数据库主机DataHost,也称为节点主机。他们之间的关系是一个节点主机DataHost可以包含一个或多个数据节点DataNode。
即逻辑库定义逻辑表,逻辑表声明其存储的逻辑数据节点,数据库主机包含一个或多个逻辑数据节点。 - MyCat原理中最重要的动作是拦截。拦截后分析SQL语句的流程,即从分析SQL语句涉及的表,再到查看表的定义,存在分片规则时获取SQL语句对应的分片字段,再将SQL语句发送到对应的分片去执行,最后处理分片返回的数据,并返回给客户端。
- MySQL主从复制,即将会修改主机数据的SQL会记录到binlog日志中,从主机的binlog日志中读到从机的Relay log日志中,再由从机的SQL thread进行定时检查更新,有更新则更新到从机的数据库中。MySQL主从复制主要解决数据丢失的问题。
- mysql主从复制配置,需要准备两个虚拟机,分别启动Mysql服务,分别在主服务和从服务的/etc/my.cnf文件中配置唯一ID以及主从的两个文件,最后根据master提供的信息,由slave来连接master。
- MyCAT在MySQL主从复制的基础上才能发挥作用,Java通过MyCat连接MySQL。MyCat的读写分离、分库分表技术在schema.xml配置文件中配置。