Mycat的概述及部署安装

一、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发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
    1. 分析SQL语句涉及的表。
    2. 查看表的定义,如果表存在分片规则,则获取SQL语句的分片字段。
    3. 将SQL语句发送到对应的分片去执行。
    4. 最后处理所有分片返回的数据并返回给客户端。

二、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
  • 从日志文件中找出密码: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";

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 restartsystemctl 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;

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/
  • 重启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
  • 版本是大于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
  • 配置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
  • 使用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:版本信息

总结:

  1. Mycat是数据库中间件,主要解决高访问量高并发对数据库的压力。
    Mycat技术是在Cobar基础上发展的,Mycat的优势是性能可靠稳定、体系完善、强大的技术团队
  2. Mycat实现MySQL读写分离必须依赖MySQL的主从复制。
    MyCat的应用场景是可以自动进行主从切换以及读写分离、分库分表、整合多种数据源。
    Redis的主从切换是通过配置Cluster模式生效的,Cluster模式也是哨兵模式的升级版,也有读写分离、分片机制。
  3. 逻辑库schema,与MySQL的Database对应,一个逻辑库定义了所包括的逻辑表table。
    逻辑表table,即物理数据库中存储的某一张表。将逻辑表存储在逻辑数据节点DataNode上,并声明。可以分布在一个或多个分片节点(DataNode)。
    逻辑数据节点DataNode,也称为分片节点。数据库主机DataHost,也称为节点主机。他们之间的关系是一个节点主机DataHost可以包含一个或多个数据节点DataNode。
    即逻辑库定义逻辑表,逻辑表声明其存储的逻辑数据节点,数据库主机包含一个或多个逻辑数据节点。
  4. MyCat原理中最重要的动作是拦截。拦截后分析SQL语句的流程,即从分析SQL语句涉及的表,再到查看表的定义,存在分片规则时获取SQL语句对应的分片字段,再将SQL语句发送到对应的分片去执行,最后处理分片返回的数据,并返回给客户端。
  5. MySQL主从复制,即将会修改主机数据的SQL会记录到binlog日志中,从主机的binlog日志中读到从机的Relay log日志中,再由从机的SQL thread进行定时检查更新,有更新则更新到从机的数据库中。MySQL主从复制主要解决数据丢失的问题。
  6. mysql主从复制配置,需要准备两个虚拟机,分别启动Mysql服务,分别在主服务和从服务的/etc/my.cnf文件中配置唯一ID以及主从的两个文件,最后根据master提供的信息,由slave来连接master。
  7. MyCAT在MySQL主从复制的基础上才能发挥作用,Java通过MyCat连接MySQL。MyCat的读写分离、分库分表技术在schema.xml配置文件中配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值