文章目录

  • 一、MyCat概述
    • 1.Mycat
    • 2.Mycat与其他数据库中间件的区别
    • 3.Mycat的应用场景
    • 4.Mycat的核心概念
    • 5.Mycat的原理
  • 二、MyCat的部署安装
    • 1.MySQL主从复制概述
    • 2.MySQL主从复制的搭建
      • 2.1安装MySQL数据库
      • 2.2开启bin-log日志
    • 3.Docker搭建MySQL主从复制
    • 4.MyCat下载安装及管理命令详解
    • 5.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配置文件中配置。

Mycat的概述及部署安装相关推荐

  1. Redis(主从复制、哨兵模式、集群)概述及部署

    Redis(主从复制.哨兵模式.集群)概述及部署 前言 一.主从复制 (1)主从复制原理 (2)主从复制作用 (3)主从复制流程 (4)搭建主从复制 ①修改master节点配置文件 ②修改Slave节 ...

  2. Kafka入门(一) 概述、部署与API的简单使用

    Kafka入门(一) 概述.部署与API的简单使用 MQ 传统架构的问题 MQ简介 MQ的优缺点 优点 缺点 同步与异步 P2P模式 订阅发布模式 Kafka概述 简介 特点 名称解释 Broker ...

  3. CEPH iSCSI GateWay 编译部署安装

    参考链接: https://docs.ceph.com/en/latest/rbd/iscsi-overview/ https://www.enterprisestorageforum.com/sto ...

  4. OpenStack Redhat部署安装详解

    [资料] 社区OpenStack Queens版本部署安装详解 KeyStone配置详细解释 openstack之keystone部署 照着官网来安装openstack pike之创建并启动insta ...

  5. Ansible概述与部署及playbook剧本编写

    Ansible自动化运维管理工具的概述与部署 文章目录 Ansible自动化运维管理工具的概述与部署 一.Ansible简介 1.Ansible概述 2.ansible环境安装部署 3.ansible ...

  6. 分布式文件系统MooseFS的部署安装

    概述: MooseFS是一种分布式文件系统,MooseFS文件系统结构包括以下四种角色: 1 管理服务器managing server (master) 2 元数据日志服务器Metalogger se ...

  7. Vmware Vcenter 5.1 部署安装过程 part 4 vmware vcenter 安装步骤

    Vmware  Vcenter 5.1  部署安装过程 part 4 vmware vcenter  安装步骤 作者:黄鑫      时间:2013-8-14    QQ:153890227(欢迎交流 ...

  8. LVS负载均衡之ipvsadm部署安装(安装篇)

    在上一节我们讲到了关于lvs的工作原理,本节我们将会讲到关于lvs部署安装的相关细节,比如安装前的注意事项等等: Lvs是linux virtual server的缩写.虚拟的服务器.可以在Linux ...

  9. SharePoint Server 2016 部署安装(三)—— 安装SharePoint Server

    上一篇文章我们说到了安装SharePoint Server 2016 之前所需要做的准备工作.那么今天就来直接讲讲SharePoint Server的部署安装了. 由于我们的测试环境是单台的 Sing ...

  10. 如何一键部署php应用,我们怎样来使用宝塔面板一键部署安装博客程序ZBlogPHP

    通常,当我们安装ZBlogPHP时,我们需要提前创建一个数据库,然后下载并上传ZBlogPHP安装包,然后按照步骤逐步安装它.如果您的主机/服务器上安装了Pagoda面板,则可以通过"宝塔一 ...

最新文章

  1. 区块链+5G=智慧城市?
  2. 关于生成漏洞信息属性代码备份
  3. 走近分形与混沌(part11)--一个新概念、新理论的诞生往往伴随着新常数的出现
  4. 如何通过postman测试需要登录授权的接口
  5. split 将字符串分割成字符串数组
  6. UBUNTU : Destination Host Unreachable
  7. 堆之二项堆(Binominal Heap)
  8. 卡通形象医疗病毒细菌宣传海报模板,psd分层,方便应用!
  9. Android-LayoutInflater布局文件解析过程分析
  10. GEE开发之Landsat8_NDVI的数据分析
  11. 最新免费wap网址大全
  12. 像外行一样思考,像专家一样实践——科研成功之道(修订版)
  13. 用MinIO对象存储构建企业数据集中备份系统
  14. Image 图像转化为 PDF 文件
  15. 金华万豪、温州万豪、温州乐清万怡、哈尔滨城市中心万枫、九寨英迪格等酒店开业 | 全球旅报...
  16. 微博博主侮辱女性 街猫koryili
  17. Google(谷歌)高级搜索
  18. JAVA布局管理器导包_在 Java 中,要使用布局管理器,必须导入下列( )包。_计算机网络基础答案_学小易找答案...
  19. webgl_gpgpu_birds 样例分析
  20. 【Linux4.1.12源码分析】协议栈gro收包之TCP处理

热门文章

  1. 驱动开发:内核遍历进程VAD结构体
  2. Python修改图片尺寸、裁剪图片、拼接图片
  3. Android6.0 打开自启动管理页面(华为、小米)
  4. UE4 C++与UMG
  5. 2018.8.10Yukimai模拟Day1
  6. B端产品的PMF的定义原则
  7. JAVA 订单号生成类
  8. MT6761处理器介绍
  9. Android底层网络防火墙,Android系统中实现网络防火墙的方法
  10. 四、Storm入门之Spout