MySQL入门到精通——运维篇(基础篇——进阶篇——运维篇)本文以MySQL8.0版本以上为例

文章目录

此文档来源于网络,如有侵权,请联系删除!

前言

MySQL 是一个 关系型数据库管理系统 。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。

SQL 是结构化查询语言(Structured Query Language)的英文首字母,它是一种专门用来与数据库通信的语言。


MySQL——运维篇

一、日志

1.日志-错误日志

  • 错误日志

    错误日志是 MySQL 中最重要的日志之一,它记录了当 mysgld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。

    该日志是默认开启的,默认存放目录 /var/log/,默认的日志文件名为 mysqld.log 。

    查看日志位置

    show variables like '%log error%';
    

    在这里插入图片描述

2.日志-二进制日志

  • 二进制日志
    介绍

    二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。

    作用

    ①.灾难时的数据恢复;
    ②.MySQL的主从复制。

    在MySQL8版本中,默认二进制日志是开启着的,Linux系统日志存放在/var/lib/mysql路径下。涉及到的参数如下:

    show variables like '%log_bin%';
    

    在这里插入图片描述

    日志格式

    MySQL服务器中提供了多种格式来记录二进制日志,具体格式及特点如下:

    日志格式 含义
    STATEMENT 基于SQL语句的日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中。
    ROW 基于行的日志记录,记录的是每一行的数据变更。(默认)
    MIXED 混合了STATEMENT和ROW两种格式,默认采用STATEMENT,在某些特殊情况下会自动切换为ROW进行记录。
    show variables like '%binlog_format%';
    

    在这里插入图片描述

    日志查看

    由于日志是以二进制方式存储的,不能直接读取,需要通过二进制日志查询工具 mysqlbinlog 来查看,具体语法:

    mysqlbinlog [参数选项] log-files
    
    参数选项:
    	-d		指定数据库名称,只列出指定的数据库相关操作。
    	-o		忽略掉日志中的前n行命令。
    	-v		将行事件(数据变更)重构为SQL语句。
    	-w		将行事件(数据变更)重构为SQL语句,并输出注释信息。
    

    在这里插入图片描述

    将日志格式修改为STATEMENT

    #编辑配置文件
    vim /etc/my.cnf
    

    在这里插入图片描述

    #添加参数(:wq保存退出)
    binlog_format=STATEMENT
    

    在这里插入图片描述

    #重启数据库服务
    systemctl restart mysqld
    

    在这里插入图片描述

    #查看日志格式
    show variables like '%binlog_format%';
    

    在这里插入图片描述

    日志删除

    对于比较繁忙的业务系统,每天生成的binlog数据巨大,如果长时间不清除,将会占用大量磁盘空间。可以通过以下几种方式清理日志:

    指令 含义
    reset master 删除全部binlog日志,删除之后,日志编号,将从 binlog.000001重新开始
    purge master logs to ‘binlog.******’ 删除******编号之前的所有日志
    purge master logs before ‘yyyy-mm-dd hh24:mi:ss’ 删除日志为"yyyy-mm-dd hh24:mi:ss"之前产生的所有日志

    也可以在mysql的配置文件中配置二进制日志的过期时间,设置了之后,二进制日志过期会自动删除

    #默认为2592000秒=30天
    show variables like '%binlog_expire_logs_seconds%';
    

    在这里插入图片描述

    例子

    reset master;
    

    在这里插入图片描述

    例子

    #删除binlog.000008之前二进制日志文件
    purge master logs to 'binlog.000008';
    

    在这里插入图片描述

3.日志-查询日志

  • 查询日志

    查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的SQL语句。默认情况下,查询日志是未开启的。如果需要开启查询日志,可以设置以下配置:

    show variables like '%general%';
    

    在这里插入图片描述

    修改MySQL的配置文件 /etc/my.cnf 文件,添加如下内容:

    #该选项用来开启查询日志,可选值:0 或者1;0代表关闭,1代表开启
    general_log=1
    #设置日志的文件名,如果没有指定,默认的文件名为 host_name.log
    general_log_file=mysql_query.log
    

    示例

    #修改配置文件
    vim /etc/my.cnf
    

    在这里插入图片描述

    #开启查询日志
    general_log=1
    #设置日志的文件名为host_name.log
    general_log_file=/var/lib/mysql/mysql_query.log
    

    在这里插入图片描述

    #重启数据库服务
    systemctl restart mysqld
    

    在这里插入图片描述

    #查看查询日志相关配置(修改完成)
    show variables like '%general%';
    

    在这里插入图片描述

    #查看/var/lib/mysql目录下的文件信息(mysql_query.log文件已生成)
    ll /var/lib/mysql
    

    在这里插入图片描述

查询日志记录了所有增删改查以及DDL语句(日志文件比较大)

4.日志-慢查询日志

  • 慢查询日志

    慢查询日志记录了所有执行时间超过参数 long_query_time 设置值并且扫描记记录数不小于 min_examined_row_limit的所有的SQL语句的日志,默认未开启。long_query_time 默认为 10 秒,最小为0,精度可以到微秒。

    #查看慢查询日志相关参数配置
    show variables like '%slow_query_log%';
    

    在这里插入图片描述

    #查看慢查询日志执行时间参数
    show variables like '%long_query_time%';
    

    在这里插入图片描述

    开启慢查询日志

    #开启慢查询日志
    slow_query_log=1
    #执行时间参数
    long_query_time=2
    

    示例

    #修改数据库配置文件
    vim /etc/my.cnf
    

    在这里插入图片描述

    #开启慢查询日志
    slow_query_log=1
    #设置执行时间参数为2秒
    long_query_time=2
    

    在这里插入图片描述

    #重启数据库服务
    systemctl restart mysqld
    

    在这里插入图片描述

    #查看慢查询日志执行时间参数
    show variables like '%long_query_time%';
    

    在这里插入图片描述

    #查看慢查询日志相关参数配置
    show variables like '%slow_query_log%';
    

    在这里插入图片描述

    #查看/var/lib/mysql目录下的慢日志文件
    ll /var/lib/mysql/
    

    在这里插入图片描述

    默认情况下,不会记录管理语句,也不会记录不使用索引进行查找的查询。可以使用log_slow_admin_statements和更改此行为log_queries_not_using_indexes,如下所述。

    #记录执行较慢的管理语句
    log_slow_admin_statements=1
    #记录执行较慢的未使用索引的语句
    log_queries_not_using_indexes=1
    

二、主从复制

1.主从复制-概述

  • 概述

    主从复制是指将主数据库的DDL和 DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。

    MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。

    MySQL复制的优点主要包含以下三个方面:
    ①主库出现问题,可以快速切换到从库提供服务。
    ②实现读写分离,降低主库的访问压力。
    ③可以在从库中执行备份,以避免备份期间影响主库服务

2.主从复制-原理

  • 原理
    在这里插入图片描述

    复制分成三步:(master代表是主库,slave代表从库)
    ①Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
    ②从库读取主库的二进制日志文件 Binlog,写入到从库的中继日志 Relay Log。
    ③slave重做中继日志中的事件,将改变反映它自己的数据。

3.主从复制-搭建

3.1.主从复制-搭建-主库配置

  • 主库配置
    在这里插入图片描述

    1.修改配置文件/etc/my.cnf

    #mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方 - 1,默认为1
    server-id=1
    #是否只读,1 代表只读,0 代表读写
    read-only=0
    #忽略的数据,指不需要同步的数据库
    #binlog-ignore-db=mysql
    #指定同步的数据库
    #binlog-do-db=db01
    

    2.重启MySQL服务

    systemctl restart mysqld
    

    3.登录MySQL,创建远程连接的账号,并授予主从复制权限

    #创建test用户,并设置密码,该用户可以在任意主机连接该MySQL服务
    create user 'test'@'%' identified with mysql_native_password by 'Root@123456';
    #为'test'@'%'用户分配主从复制权限
    grant replication slave on *.* to 'test'@'%';
    
     > 4.通过指令,查看二进制日志坐标
    
    show master status;
    

    在这里插入图片描述

    字段含义说明
    File:从哪个日志文件开始推送日志文件
    Position:从哪个位置开始推送日志
    Binlog_Do_DB:指定不需要同步的数据库

3.2.主从复制-搭建-从库配置

  • 从库配置

    1.修改配置文件/etc/my.cnf

    #mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方 - 1,和主库不一样即可
    server-id=2
    #是否只读,1 代表只读,0 代表读写
    read-only=1
    

    2.重启MySQL服务

    systemctl restart mysqld	
    

    3.登录MySQL,设置主库配置(在从库中执行下面SQL语句)

    change replication source to source_host = 'xxx.xxx.xxx.xxx',source_user = 'xxx',source_password = 'xxx',source_log_file = 'xxx',source_log_pos = xxx;
    

    例子

    change replication source to source_host = '192.168.200.200',source_user = 'test',source_password = 'Root@123456',source_log_file = 'binlog.000008',source_log_pos = 156;
    

    上述是8.0.23中的语法。如果MySQL是8.0.23之前的版本,执行如下SQL:

    change master to master_host = 'xxx.xxx.xxx.xxx',master_user = 'xxx',master_password = 'xxx',master_log_file = 'xxx',master_log_pos = xxx;
    
    参数名 含义 8.0.23之前
    SOURCE_HOST 主库IP地址 MASTER_HOST
    SOURCE_USER 连接主库的用户名 MASTER_USER
    SOURCE_PASSWORD 连接主库的密码 MASTER_PASSWORD
    SOURCE_LOG_FILE binlog日志文件名 MASTER_LOG_FILE
    SOURCE_LOG_POS binlog日志文件位置 MASTER_LOG_POS

    4.开启同步操作

    start replica;		#8.0.22之后
    start slave;		#8.0.22之前
    

    5.查看主从同步状态

    show replica status;	#8.0.22之后
    show slave status;		#8.0.22之前
    

    在这里插入图片描述

3.2.主从复制-搭建-测试

  • 测试

    1.在主库上创建数据库、表,并插入数据

    2.在从库中查询数据,验证主从是否同步

三、分库分表

1.分库分表-介绍

1.1.分库分表-介绍

  • 介绍
    问题分析

    随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:
    ①IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。
    ②CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。

    分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。

1.2.分库分表-介绍-拆分方式

  • 拆分方式
    在这里插入图片描述

  • 垂直拆分

    垂直拆分-垂直分库
    在这里插入图片描述

    垂直分库: 以表为依据,根据业务将不同表拆分到不同库中。

    特点

    ①每个库的表结构都不一样。
    ②每个库的数据也不一样。
    ③所有库的并集是全量数据。

    垂直拆分-垂直分表
    在这里插入图片描述

    垂直分表: 以字段为依据,根据字段属性将不同字段拆分到不同表中。

    特点

    ①每个表的结构都不一样。
    ②每个表的数据也不一样,一般通过一列(主键/外键)关联。
    ③所有表的并集是全量数据。

  • 水平拆分
    水平拆分-水平分库
    在这里插入图片描述

    水平分库: 以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。

    特点

    ①每个库的表结构都一样。
    ②每个库的数据都不一样。
    ③所有库的并集是全量数据。

    水平拆分-水平分表
    在这里插入图片描述

    水平分表: 以字段为依据,按照一定策略,将一个表的数据拆分到多个表中。

    特点

    ①每个表的表结构都一样。
    ②每个表的数据都不一样。
    ③所有表的并集是全量数据。

  • 实现技术
    在这里插入图片描述
    在这里插入图片描述

    shardingJDBC: 基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。

    MyCat: 数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。

2.分库分表-MyCat概述

  • 介绍

    MyCat是开源的、活跃的、基于Java语言编写的MySQL 数据库中间件。可以像使用MySQL一样来使用MyCat,对于开发人员来说根本感觉
    不到MyCat的存在。

    优势

    ①性能可靠稳定
    ②强大的技术团队
    ③体系完善
    ④ 社区活跃

2.1.分库分表-MyCat概述-安装

  • MyCat下载

    下载地址:http://www.mycat.org.cn/ 点击前往

    网盘下载链接:https://pan.baidu.com/s/1xcylGdwv_k7nACh1ab_9dQ?pwd=xjv5
    提取码:xjv5

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    MyCat是采用java语言开发的开源的数据库中间件,支持Windows和Linux运环境,下面介绍MyCat的Linux中的环境搭建。我们需要在准备好的服务器中安装如下软件。
    ①MySQL
    ②JDK
    ③MyCat

    服务器 安装软件 说明
    192.168.200.210 JDK、MyCat MyCat中间件服务器
    192.168.200.210 MySQL 分片服务器
    192.168.200.213 MySQL 分片服务器
    192.168.200.214 MySQL 分片服务器
  • 安装JDK与MyCat

    安装JDK

    1.上传JDK安装包到Linux服务器

    在这里插入图片描述

    2.将jdk-8u171-linux-x64.tar.gz安装包解压到/usr/local/目录下

    tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
    

    在这里插入图片描述

    3.查看/usr/local/目录下的解压后的jdk文件夹

    ll /usr/local/
    

    在这里插入图片描述

    4.配置JDK环境变量

    #1.编辑profile文件
    vim /etc/profile
    #2.配置环境变量
    JAVA_HOME=/usr/local/jdk1.8.0_171
    PATH=$JAVA_HOME/bin:$PATH
    #3.重新加载profile配置文件(全局变量刷新)
    source /etc/profile
    #4.查看jdk版本(安装完成)
    java -version
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    安装MyCat

    1.上传MyCat安装包到Linux服务器

    在这里插入图片描述

    2.将Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz安装包解压到/usr/local/目录下

    在这里插入代码片
    

    在这里插入图片描述

    3.查看/usr/local/目录下的解压后的MyCat文件夹

    ll /usr/local/
    

    在这里插入图片描述

  • MyCat目录结构

    在这里插入图片描述

    目录名 存放内容
    bin 存放可执行文件,用于启动停止MyCat
    conf 存放MyCat的配置文件
    lib 存放MyCat的项目依赖包(jar)
    logs 存放MyCat的日志文件

    更换MySQL数据库连接驱动包

    数据库连接驱动包网盘下载链接:https://pan.baidu.com/s/191zIAN1N7ZTFNLxuanfqjw?pwd=xjv5
    提取码:xjv5

    #1.查看/usr/local/mycat/lib/目录下的jar包
    ll /usr/local/mycat/lib/
    #2.删除/usr/local/mycat/lib/目录下的mysql-connector-java-5.1.35.jar包
    rm -rf /usr/local/mycat/lib/mysql-connector-java-5.1.35.jar
    #3.上传新的mysql数据库连接驱动包
    #4.查看/usr/local/mycat/lib/目录下的jar包
    ll /usr/local/mycat/lib/
    #5.给新的mysql数据库连接驱动包授权
    chmod 777 /usr/local/mycat/lib/mysql-connector-java-8.0.22.jar
    #6.查看/usr/local/mycat/lib/目录下的jar包
    ll /usr/local/mycat/lib/
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.2.分库分表-MyCat概述-核心概念

  • 核心概念
    在这里插入图片描述

3.分库分表-MyCat入门

3.1分库分表-MyCat入门

  • MyCat入门

    需求

    由于tb_order 表中数据量很大,磁盘IO及容量都到达了瓶颈,现在需要对tb_order 表进行数据分片,分为三个数据节点,每一个节点主机位于不同的服务器上,具体的结构,参考下图:

    在这里插入图片描述
    环境准备
    在这里插入图片描述

    一.关闭防火墙

    1.查看防火墙是否开启

    #active (running)代表防火墙处于开启状态
    systemctl status firewalld
    

    在这里插入图片描述

    2.关闭防火墙

    systemctl stop firewalld
    

    在这里插入图片描述

    3.查看防火墙是否开启

    #inactive (dead)代表防火墙处于关闭状态
    systemctl status firewalld
    

    在这里插入图片描述

    4.分别在三台服务器上创建一个名为db01的数据库

    create database db01;
    

确保三台服务器防火墙都处于关闭状态,如果不想关闭防火墙,可以开放所有对应的端口号。

  • 分片配置(schema.xml)

    二.schema.xml配置文件信息修改

    在这里插入图片描述

    查看/usr/local/mycat/conf/目录下的文件

    ll /usr/local/mycat/conf/
    

    在这里插入图片描述

    便于方便修改配置文件我这边使用了Notepad++中的NppFTP插件

    关于Notepad++下载安装NppFTP插件可以参考下面连接:https://blog.csdn.net/weixin_44904239/article/details/130551833 点击前往

  • 使用Notepad++中的NppFTP插件修改配置文件
    NppFTP插件使用

    1.打开Notepad++,显示NppFTP窗口

    在这里插入图片描述

    2.设置配置文件

    在这里插入图片描述

    3.添加

    在这里插入图片描述
    在这里插入图片描述

    4.配置文件配置

    在这里插入图片描述
    在这里插入图片描述

    5.连接成功

    在这里插入图片描述

    6.连接上以后看不到目录点击下刷新按钮就行

    在这里插入图片描述

    7.点击/usr/local/mycat/conf/目录下的schema.xml文件

    在这里插入图片描述

    8.修改schema.xml配置文件信息如下:

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
    	<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
    		<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    	</schema>
    	
    	<dataNode name="dn1" dataHost="dhost1" database="db01" />
    	<dataNode name="dn2" dataHost="dhost2" database="db01" />
    	<dataNode name="dn3" dataHost="dhost3" database="db01" />
    	
    	<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.200.210:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    	
    	<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    	
    	<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    </mycat:schema>
    

    三.servse.xml配置文件信息修改

    在这里插入图片描述

    1.点击/usr/local/mycat/conf/目录下的servse.xml文件
    在这里插入图片描述

    2.修改servse.xml配置文件信息如下:(部分主要配置信息展示)

    <user name="root" defaultAccount="true">
    	<property name="password">123456</property>
    	<property name="schemas">DB01</property>
    	
    	<!-- 表级 DML 权限设置 -->
    	<!-- 		
    	<privileges check="false">
    		<schema name="TESTDB" dml="0110" >
    			<table name="tb01" dml="0000"></table>
    			<table name="tb02" dml="1111"></table>
    		</schema>
    	</privileges>		
    	 -->
    </user>
    
    <user name="user">
    	<property name="password">123456</property>
    	<property name="schemas">DB01</property>
    	<property name="readOnly">true</property>
    </user>
    

3.2.分库分表-MyCat入门-测试

  • 测试

    切换到MyCat的安装目录,执行如下指令,启动MyCat:

    #启动MyCat
    bin/mycat start
    #停止MyCat
    bin/mycat stop
    

    MyCat启动之后,占用端口号8066。

    一、启动MyCat

    1.切换到/usr/local/mycat/目录

    cd /usr/local/mycat/
    

    在这里插入图片描述

    2.启动MyCat

    bin/mycat start
    

    在这里插入图片描述

    3.启动完毕后,可以查看logs目录下的启动日志,查看MyCat是否启动完成

    tail -f logs/wrapper.log	#如下图所示表示MyCat启动成功
    

    在这里插入图片描述

    通过如下指令,就可以连接并登录MyCat (这里的用户名和密码就是来自servse.xml配置文件里所配置的用户名和密码)

    在这里插入图片描述

    #登录连接MyCat
    mysql -h 192.168.200.210 -P 8066 -uroot -p123456
    

    在这里插入图片描述

    查看数据库 (这里只有一个数据库,这个数据库来自schema.xml配置文件)

    在这里插入图片描述

    show databases;
    

    在这里插入图片描述

    切换到DB01数据库

    use DB01;
    

    在这里插入图片描述
    查看表 (这个tb_order表MySQL数据库没有,只有MyCat有)

    show tables;
    

    在这里插入图片描述

    二、创建表结构

    创建表结构

    CREATE TABLE TB_ORDER(
        id BIGINT(20) NOT NULL ,
        titleVARCHAR(100) NOT NULL ,
        PRIMARY KEY(id)
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    

    在这里插入图片描述

    当在MyCat中创建了TB_ORDER逻辑表,则数据库表结构中对应的真实表TB_ORDER就已经创建了。此时三个数据库都都已经有了TB_ORDER表。

    三、插入数据

    往TB_ORDER表中插入数据

    insert into tb_order(id, titile) values (1,'goods1');
    insert into tb_order(id, titile) values (2,'goods2');
    insert into tb_order(id, titile) values (3,'goods3');
    

    在这里插入图片描述

    此时数据只会在真实数据库192.168.200.201中,而192.168.200.213和192.168.200.214数据中是没有的

    往MyCat的TB_ORDER表中插入数据的分布规则取决于schema.xml配置文件中的 rule="auto-sharding-long"分片规则

    在这里插入图片描述

    rule="auto-sharding-long"这个分片规则引用了MyCat中分片定义的rule.xml文件

    在这里插入图片描述
    在这里插入图片描述

    rang-long引用了auto-sharding-long.txt文件

    在这里插入图片描述
    在这里插入图片描述

    # range start-end ,data node index
    # K=1000,M=10000.
    0-500M=0			#表示id在0-500万的数据放在第一个节点
    500M-1000M=1		#表示id在500万-1000万的数据放在第二个节点
    1000M-1500M=2		#表示id在1000万-1500万的数据放在第三个节点
    

    例子

    往TB_ORDER表中插入id在500万-1000万的数据

    insert into tb_order(id, titile) values (5000001,'goods5000001');
    

    在这里插入图片描述

    此时数据会在192.168.200.213数据库上

    往TB_ORDER表中插入id在1000万-1500万的数据

    insert into tb_order(id, titile) values (10000001,'goods10000001');
    

    在这里插入图片描述

    此时数据会在192.168.200.214数据库上

    往TB_ORDER表中插入id大于1500万的数据

    insert into tb_order(id, titile) values (15000001,'goods15000001');
    

    在这里插入图片描述

    此时MyCat报错:不能找到一个有效的数据节点,如果超过id大于1500万的数据可以在auto-sharding-long.txt文件中进行配置

4.分库分表-MyCat配置

  • MyCat配置
    一、schema.xml

    schema.xml作为MyCat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。

    主要包含以下三组标签
    schema标签
    datanode标签
    datahost标签

    schema标签
    在这里插入图片描述

    schema 标签用于定义 MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过 schema 标签来划分不同的逻辑库。MyCat中的逻辑库的概念,等同于MySOL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。

    核心属性

    属性名 作用
    name 指定自定义的逻辑库库名
    checkSQLschema 在SQL语句操作时指定了数据库名称,执行时是否自动去除; true: 自动去除,false: 不自动除
    sqlMaxLimit 如果未指定limit进行查询,列表查询模式查询多少条记录

    schema标签(table)
    在这里插入图片描述

    table 标签定义了MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义。

    核心属性

    属性名 作用
    name 定义逻辑表表名,在该逻辑库下唯一
    dataNode 定义逻辑表所属的dataNode,该属性需要与dataNode标签中name对应; 多个dataNode逗号分隔
    rule 分片规则的名字,分片规则名字是在rule.xml中定义的
    primarykey 逻辑表对应真实表的主键
    type 逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为 global

    datanode标签
    在这里插入图片描述

    dataNode标签中定义了MyCat中的数据节点,也就是我们通常说的数据分片。一个dataNode标签就是一个独立的数据分片。

    核心属性

    属性名 作用
    name 定义数据节点名称
    dataHost 数据库实例主机名称,引用自 dataHost 标签中name属性
    database 定义分片所属数据库

    datahost标签
    在这里插入图片描述

    该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。

    核心属性

    属性名 作用
    name 唯一标识,供上层标签使用
    maxCon/minCon 最大连接数/最小连接数
    balance 负载均衡策略,取值 0,1,2,3
    writeType 写操作分发方式(0:写操作转发到第一个writeHost,第一个挂了,切换到第二个;1:写操作随机分发到配置的writeHost)
    dbDriver 数据库驱动,支持native、jdbc

    在这里插入图片描述
    二、rule.xml

    rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签: tableRule、Function。

    在这里插入图片描述
    三、server.xml

    server.xml配置问年包含了MyCat的系统配置信息,主要有两个重要的标签:system、user。

    system标签
    在这里插入图片描述

    <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
    <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
    

    在这里插入图片描述

    在这里插入图片描述

5.分库分表-MyCat分片

5.1.分库分表-MyCat分片-垂直分库

  • 垂直分库
    场景

    在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据
    库表进行拆分,原有的数据库表如下。

    在这里插入图片描述

    准备

    ①如图所示准备三台Linux服务器(ip为:192.168.200.210、192.168.200.213、192.168.200.214)可以根据自己的实际情况进行准备。
    ②三台服务器上都安装MySQL,在192.168.200.210服务器上安装MyCat。
    ③三台服务器关闭防火墙或者开放对应的端口。
    ④分别在三台MySQL中创建数据库 shopping。

    在这里插入图片描述

    schema.xml文件配置如下:

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
    	<schema name="SHOPPING" checkSQLschema="true" sqlMaxLimit="100">
    		<table name="tb_goods_base" dataNode="dn1" primaryKey="id" />
    		<table name="tb_goods_brand" dataNode="dn1" primaryKey="id" />
    		<table name="tb_goods_cat" dataNode="dn1" primaryKey="id" />
    		<table name="tb_goods_desc" dataNode="dn1" primaryKey="id" />
    		<table name="tb_goods_item" dataNode="dn1" primaryKey="goods_id" />
    		
    		<table name="tb_order_item" dataNode="dn2" primaryKey="id" />
    		<table name="tb_order_master" dataNode="dn2" primaryKey="order_id" />
    		<table name="tb_order_pay_log" dataNode="dn2" primaryKey="out_trade_no" />
    		
    		<table name="tb_user" dataNode="dn3" primaryKey="id" />
    		<table name="tb_user_address" dataNode="dn3" primaryKey="id" />
    		<table name="tb_areas_provinces" dataNode="dn3" primaryKey="id" />
    		<table name="tb_areas_city" dataNode="dn3" primaryKey="id" />
    		<table name="tb_areas_region" dataNode="dn3" primaryKey="id" />
    	</schema>
    	
    	<dataNode name="dn1" dataHost="dhost1" database="shopping" />
    	<dataNode name="dn2" dataHost="dhost2" database="shopping" />
    	<dataNode name="dn3" dataHost="dhost3" database="shopping" />
    	
    	<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.3.248:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    	<!-- -->
    	<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    	
    	<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    	
    </mycat:schema>
    

    server.xml文件配置如下:

    <user name="root" defaultAccount="true">
    	<property name="password">123456</property>
    	<property name="schemas">SHOPPING</property>
    	
    	<!-- 表级 DML 权限设置 -->
    	<!-- 		
    	<privileges check="false">
    		<schema name="TESTDB" dml="0110" >
    			<table name="tb01" dml="0000"></table>
    			<table name="tb02" dml="1111"></table>
    		</schema>
    	</privileges>		
    	 -->
    </user>
    
    <user name="user">
    	<property name="password">123456</property>
    	<property name="schemas">SHOPPING</property>
    	<property name="readOnly">true</property>
    </user>
    

5.2.分库分表-MyCat分片-垂直分库-测试

  • 垂直分库-测试

    1.切换到/usr/local/mycat/目录

    cd /usr/local/mycat/
    

    在这里插入图片描述

    2.停止MyCat

    bin/mycat stop
    

    在这里插入图片描述

    3.启动MyCat

    bin/mycat start
    

    在这里插入图片描述

    4.启动完毕后,可以查看logs目录下的启动日志,查看MyCat是否启动完成

    tail -f logs/wrapper.log	#如下图所示表示MyCat启动成功
    

    在这里插入图片描述

    5.登录MyCat

    mysql -h 192.168.200.210 -P 8066 -uroot -p123456
    

    在这里插入图片描述

    6.查看数据库、表信息

    #查看数据库
    show databases;
    

    在这里插入图片描述

    #切换到SHOPPING数据库
    use SHOPPING;
    

    在这里插入图片描述

    #查看表
    show tables;
    

    在这里插入图片描述
    7.上传shopping-table.sql表结构文件与shopping-insert.sql数据文件

    由于文件内容过多无法展示,需要自行下载:
    链接:https://pan.baidu.com/s/11Om-w1Oty0jO98GIL8dK3w?pwd=xjv5 点击前往
    提取码:xjv5

    上传文件到/root目录下

    在这里插入图片描述
    8.执行shopping-table.sql表结构文件与shopping-insert.sql数据文件

    #执行shopping-table.sql文件
    source /root/shopping-table.sql
    

    在这里插入图片描述
    在这里插入图片描述

    查看三个数据库可以发现(根据schema.xml配置文件的配置进行了实现)

    192.168.200.210的数据库中存放了 tb_goods_base、tb_goods_brand、tb_goods_cat、tb_goods_desc、tb_goods_item这五张表

    192.168.200.213的数据库中存放了 tb_order_item、tb_order_master、tb_order_pay_log这三张表;

    192.168.200.214的数据库中存放了 tb_user、tb_user_address、tb_areas_provinces、tb_areas_city、tb_areas_region这五张表

    #执行shopping-insert.sql文件
    source /root/shopping-insert.sql
    

    在这里插入图片描述

    查看三个数据库内的表可以发现有数据了

  • 全局表配置
    例子1

    查询用户的收件人及收件人地址信息(包含省、市、区)。

    查询成功

    select ua.user_id,ua.contact,p.province,c.city,r.area,ua.address from tb_user_address ua,tb_areas_city c,tb_areas_provinces p,tb_areas_region r where ua.province_id = p.provinceid and ua.city_id = c.cityid and ua.town_id = r.areaid;
    

    在这里插入图片描述

    此查询语句只涉及了一个分片所以查询成功

    例子2

    查询每一笔订单及订单的收件地址信息(包含省、市、区)。

    SELECT order_id,payment,receiver,province,city,area FROM tb_order_master o,tb_areas_provinces p,tb_areas_city c,tb_areas_region r WHERE o.receiver_province = p.provinceid AND o.receiver_city = c.cityid AND o.receiver_region = r.areaid;
    

    查询报错

    在这里插入图片描述

    此查询语句涉及多个分片所以查询报错,为了解决这个问题需要进行全局表配置

    全局表配置

    对于省、市、区/县表tb_areas_provinces,tb_areas_city,tb_areas_region,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。

    在这里插入图片描述

    1.修改MyCat—schema.xml文件配置

    schema.xml文件配置如下:

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
    	<schema name="SHOPPING" checkSQLschema="true" sqlMaxLimit="100">
    
    		<table name="tb_goods_base" dataNode="dn1" primaryKey="id" />
    		<table name="tb_goods_brand" dataNode="dn1" primaryKey="id" />
    		<table name="tb_goods_cat" dataNode="dn1" primaryKey="id" />
    		<table name="tb_goods_desc" dataNode="dn1" primaryKey="id" />
    		<table name="tb_goods_item" dataNode="dn1" primaryKey="goods_id" />
    		
    		<table name="tb_order_item" dataNode="dn2" primaryKey="id" />
    		<table name="tb_order_master" dataNode="dn2" primaryKey="order_id" />
    		<table name="tb_order_pay_log" dataNode="dn2" primaryKey="out_trade_no" />
    		
    		<table name="tb_user" dataNode="dn3" primaryKey="id" />
    		<table name="tb_user_address" dataNode="dn3" primaryKey="id" />
    		
    		<table name="tb_areas_provinces" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
    		<table name="tb_areas_city" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
    		<table name="tb_areas_region" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
    		
    	</schema>
    	
    	<dataNode name="dn1" dataHost="dhost1" database="shopping" />
    	<dataNode name="dn2" dataHost="dhost2" database="shopping" />
    	<dataNode name="dn3" dataHost="dhost3" database="shopping" />
    	
    	<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.3.248:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    	<!-- -->
    	<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    	
    	<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    	</dataHost>
    	
    </mycat:schema>
    

    2.测试

    ①停止MyCat
    ②清空三台数据库shopping数据库中的表
    ③启动MyCat
    ④重新导入表结构及数据

    查询用户的收件人及收件人地址信息(包含省、市、区)。

    查询成功

    在这里插入图片描述
    查询每一笔订单及订单的收件地址信息(包含省、市、区)。

    查询成功

    在这里插入图片描述

5.3.分库分表-MyCat分片-水平分表

  • 水平分表

    场景

    在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。

    在这里插入图片描述
    准备

    ①如图所示准备三台Linux服务器(ip为:192.168.200.210、192.168.200.213、192.168.200.214)可以根据自己的实际情况进行准备。
    ②三台服务器上都安装MySQL,在192.168.200.210服务器上安装MyCat。
    ③三台服务器关闭防火墙或者开放对应的端口。
    ④分别在三台MySQL中创建数据库 itcast。

    在这里插入图片描述

    1.MyCat—schema.xml文件配置

    schema.xml文件配置如下:(部分主要配置信息展示)

    <schema name="ITCAST" checkSQLschema="true" sqlMaxLimit="100">
    	<table name="tb_los" dataNode="dn4,dn5,dn6" primaryKey="id" rule="mod-long" />
    </schema>
    
    <dataNode name="dn4" dataHost="dhost1" database="itcast" />
    <dataNode name="dn5" dataHost="dhost2" database="itcast" />
    <dataNode name="dn6" dataHost="dhost3" database="itcast" />
    

    在这里插入图片描述

    2.MyCat—server.xml文件配置

    server.xml文件配置如下:(部分主要配置信息展示)

    <user name="root" defaultAccount="true">
    	<property name="password">123456</property>
    	<property name="schemas">SHOPPING,ITCAST</property>
    	
    	<!-- 表级 DML 权限设置 -->
    	<!-- 		
    	<privileges check="false">
    		<schema name="TESTDB" dml="0110" >
    			<table name="tb01" dml="0000"></table>
    			<table name="tb02" dml="1111"></table>
    		</schema>
    	</privileges>		
    	 -->
    </user>
    
    <user name="user">
    	<property name="password">123456</property>
    	<property name="schemas">SHOPPING</property>
    	<property name="readOnly">true</property>
    </user>
    

    在这里插入图片描述

    3.MyCat启动

    1.进入到MyCat的安装目录

    #切换到/usr/local/mycat/目录
    cd /usr/local/mycat/
    

    在这里插入图片描述

    2.启动MyCat(若MyCat处于启动状态需要停止MyCat在重新启动)

    #启动MyCat
    bin/mycat start
    #停止MyCat
    bin/mycat stop
    

    在这里插入图片描述

    3.查看logs目录下的启动日志,查看MyCat是否启动完成(如下图所示表示MyCat启动成功)

    #查看wrapper.log日志内容
    tail -f logs/wrapper.log
    

    在这里插入图片描述

    4.MyCat登录

    1.登录MyCat

    mysql -h 192.168.200.210 -P 8066 -uroot -p123456
    

    在这里插入图片描述

    2.查看数据库、表等相关信息

    #查看数据库(schema.xml配置文件中定义的数据库已存在)
    show databases;
    

    在这里插入图片描述

    #切换到SHOPPING数据库
    use ITCAST;
    

    在这里插入图片描述

    #查看表(schema.xml配置文件中定义的虚拟表已存在)
    show tables;
    

    在这里插入图片描述

    5.创建表结构及数据导入

    创建表结构

    CREATE TABLE tb_log (
      id bigint(20) NOT NULL COMMENT 'ID',
      model_name varchar(200) DEFAULT NULL COMMENT '模块名',
      model_value varchar(200) DEFAULT NULL COMMENT '模块值',
      return_value varchar(200) DEFAULT NULL COMMENT '返回值',
      return_class varchar(200) DEFAULT NULL COMMENT '返回值类型',
      operate_user varchar(20) DEFAULT NULL COMMENT '操作用户',
      operate_time varchar(20) DEFAULT NULL COMMENT '操作时间',
      param_and_value varchar(500) DEFAULT NULL COMMENT '请求参数名及参数值',
      operate_class varchar(200) DEFAULT NULL COMMENT '操作类',
      operate_method varchar(200) DEFAULT NULL COMMENT '操作方法',
      cost_time bigint(20) DEFAULT NULL COMMENT '执行方法耗时, 单位 ms',
      source int(1) DEFAULT NULL COMMENT '来源 : 1 PC , 2 Android , 3 IOS',
      PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    在这里插入图片描述

    查看三个数据库可以发现表和表结构都有了

    添加数据

    INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('1','user','insert','success','java.lang.String','10001','2022-01-06 18:12:28','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','10',1);
    INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('2','user','insert','success','java.lang.String','10001','2022-01-06 18:12:27','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','23',1);
    INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('3','user','update','success','java.lang.String','10001','2022-01-06 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','34',1);
    INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('4','user','update','success','java.lang.String','10001','2022-01-06 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','13',2);
    INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('5','user','insert','success','java.lang.String','10001','2022-01-06 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.controller.UserController','insert','29',3);
    INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('6','user','find','success','java.lang.String','10001','2022-01-06 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.controller.UserController','find','29',2);
    

    查看三个数据库内的tb_log表发现有数据了,数据的分布规则是 id模以3的结果为0的数据分布在第一个节点,id模以3的结果为1的数据分布在第二个节点,id模以3的结果为2的数据分布在第三个节点

6.分库分表-分片规则

6.1.分库分表-分片规则-范围分片

  • 范围分片

    根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。

    在这里插入图片描述

    在这里插入图片描述

    # range start-end ,data node index
    # K=1000,M=10000.
    0-500M=0			#表示id在0-500万的数据放在第一个节点
    500M-1000M=1		#表示id在500万-1000万的数据放在第二个节点
    1000M-1500M=2		#表示id在1000万-1500万的数据放在第三个节点
    

6.2.分库分表-分片规则-取模分片

  • 取模分片

    根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片。

    在这里插入图片描述
    在这里插入图片描述

6.3.分库分表-分片规则-一致性hash算法

  • 一致性hash算法

    所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。

    在这里插入图片描述
    在这里插入图片描述

6.4.分库分表-分片规则-枚举分片

  • 枚举分片

    通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。

    在这里插入图片描述
    在这里插入图片描述

    为了不影响默认的分片规则,这里创建了一个分片规则。默认节点是为了避免匹配规则中无法匹配的数据,默认放到第几个节点的数据库中,避免报错。

6.5.分库分表-分片规则-应用指定算法

  • 应用指定算法

    运行阶段由应用自主决定路由到哪个分片,直接根据字符子串(必须是数字)计算分片号。

    在这里插入图片描述
    在这里插入图片描述

6.6.分库分表-分片规则-固定hash算法

  • 固定hash算法

    该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位 与 1111111111 进行位 & 运算。
    在这里插入图片描述
    在这里插入图片描述

6.7.分库分表-分片规则-字符串hash解析

  • 字符串hash解析

    截取字符串中的指定位置的子字符串,进行hash算法,算出分片。

    在这里插入图片描述
    在这里插入图片描述

6.8.分库分表-分片规则-按天分片

  • 按天分片
    在这里插入图片描述
    在这里插入图片描述

6.9.分库分表-分片规则-按自然月分片

  • 按自然月分片

    使用场景为按照月份来分片,每个自然月为一个分片。

    在这里插入图片描述
    在这里插入图片描述

7.分库分表-MyCat管理与监控

7.1.分库分表-MyCat管理与监控-原理

  • 原理

    在这里插入图片描述

7.2.分库分表-MyCat管理工具

  • MyCat管理工具

    Mycat默认开通了2个端口,可以在server.xml中进行修改
    8066 数据访问端口,即进行DML和DDL 操作。
    9066 数据库管理端口,即Mycat 服务管理控制功能,用于管理Mycat的整个集群状态。

    #登录
    mysql -h 192.168.200.210 -P 9066 -uroot -p123456
    
    命令 含义
    show @@help 查看Mycat管理工具帮助文档
    show @@version 查看Mycat的版本
    reload @@config 重新加载Mycat的配置文件
    show @@datasource 查看Mycat的数据源信息
    show @@datanode 查看MyCat现有的分片节点信息
    show @@threadpool 查看Mvcat的线程池信息
    show @@sgl 查看执行的SQL
    show @@sgl.sum 查看执行的SQL统计

7.3.分库分表-MyCat监控1

  • MyCat监控

  • Mycat-eye

    Mycat-eye介绍

    Mycat-web(Mycat-eye)是对mycat-server提供监控服务,功能不局限于对mycat-server使用。他通过DBC连接对Mycat、 Mysql监控,监控远程服务器(目前仅限于linux系统)的cpu、内存、网络、磁盘。
    Mycat-eye运行过程中需要依赖zookeeper,因此需要先安装zookeeper。

  • Zookeeper与MyCat-web安装

    Zookeeper与MyCat-web安装包网盘下载地址:
    链接:https://pan.baidu.com/s/1t5YMeHzSExHcfKqse1kjag?pwd=xjv5 点击前往
    提取码:xjv5

    Zookeeper安装

    1.上传Zookeeper安装包

    在这里插入图片描述
    2.将Zookeeper安装包解压到/usr/local/目录下

    tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/
    

    在这里插入图片描述
    3.切换到/usr/local/zookeeper-3.4.6/目录下

    cd /usr/local/zookeeper-3.4.6/
    

    在这里插入图片描述
    4.创建一个名为data的文件夹

    #创建data文件夹
    mkdir data
    #进入到data目录下
    cd data
    #查看当前目录(复制目录)
    pwd
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5.切换到/usr/local/zookeeper-3.4.6/conf/目录下

    cd /usr/local/zookeeper-3.4.6/conf/
    

    在这里插入图片描述

    6.将zoo_sample.cfg文件重命名为zoo.cfg

    mv zoo_sample.cfg zoo.cfg
    

    在这里插入图片描述

    7.编辑zoo.cfg文件,修改dataDir=/usr/local/zookeeper-3.4.6/data

    #编辑zoo.cfg文件
    vim zoo.cfg
    #修改dataDir=/usr/local/zookeeper-3.4.6/data
    dataDir=/usr/local/zookeeper-3.4.6/data
    #保存退出
    

    在这里插入图片描述
    在这里插入图片描述

    8.启动zookeeper

    #切换到/usr/local/zookeeper-3.4.6/目录下(cd .. #返回上一级目录)
    cd /usr/local/zookeeper-3.4.6/
    #启动zookeeper
    bin/zkServer.sh start
    #查看zookeeper的启动状态(Mode: standalone 表示启动成功)
    bin/zkServer.sh status
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    MyCat-web安装

    1.上传MyCat-web安装包

    在这里插入图片描述
    2.将MyCat-web安装包解压到/usr/local/目录下

    tar -zxvf Mycat-web.tar.gz -C /usr/local/
    

    在这里插入图片描述
    3.启动MyCat-web

    #切换到/usr/local/mycat-web/目录下
    cd /usr/local/mycat-web/
    #启动MyCat-web(如图所示启动成功)
    sh start.sh
    

    在这里插入图片描述
    在这里插入图片描述

    注意

    如果zookeeper和MyCat-web没有安装在同一台服务器上,需要修改/usr/local/mycat-web/mycat-web/WEB-INF/classes/目录下的mycat.properties配置文件,将zookeeper=localhost:2181中的localhost修改为对应服务器的IP地址

    在这里插入图片描述

    4.访问MyCat-web

    #浏览器访问MyCat-web安装所在的服务器地址
    http://192.168.3.248:8082/mycat/
    

    在这里插入图片描述

    5.配置MyCat-web

    开启Mycat的实时统计功能(server.xml)
    在这里插入图片描述
    在Mycat监控界面配置服务地址

    在这里插入图片描述

    录入信息-保存

    在这里插入图片描述

    保存完成点击返回列表即可看到刚才配置好的信息

    在这里插入图片描述

  • Mycat-eye主要信息展示

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

四、读写分离

1.读写分离-介绍

  • 介绍

    读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。
    通过MyCat即可轻易实现上述功能,不仅可以支持MySOL,也可以支持Oracle和SQL Server。

    在这里插入图片描述

2.读写分离-一主一从准备

  • 一主一从准备

    原理

    MySQL的主从复制,是基于二进制日志(binlog)实现的。

    在这里插入图片描述
    环境准备

    主机 角色 用户名 密码
    192.168.3.211 master root 1234
    192.168.3.212 slave root 1234

    主从复制的搭建,可以参考前面讲解的步骤操作

    #登录从库
    mysql -uroot -p1234
    #查看当前从库的状态(Slave_IO_Running和Slave_SQL_Running为Yes说明当前主从复制是正常的)
    show slave status\G;
    

    在这里插入图片描述

3.读写分离-一主一从读写分离

  • 一主一从读写分离

    在这里插入图片描述
    在这里插入图片描述

    参数值 含义
    0 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
    1 全部的readHost与备用的writeHost 都参与select 语句的负载均衡(主要针对于双主双从模式)
    2 所有的读写操作都随机在writeHost,readHost上分发
    3 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力

    schema.xml配置文件(部分主要配置)

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    	<schema name="ITCAST_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
    	</schema>
    	<dataNode name="dn7" dataHost="dhost7" database="itcast" />
    	<dataHost name="dhost3" maxCon="1000" minCon="10" balance="3"
    		  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master" url="jdbc:mysql://192.168.200.211:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234">
    			<readHost host="slave" url="jdbc:mysql://192.168.200.212:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234">
    			</readHost>
    		</writeHost>
    	</dataHost>
    </mycat:schema>
    

    server.xml配置文件(部分主要配置)

    <user name="root" defaultAccount="true">
    	<property name="password">123456</property>
    	<property name="schemas">ITCAST_RW</property>
    </user>
    

    连接Mycat,并在Mycat中执行DML、DQL查看是否能够进行读写分离。

    问题:主节点Master宕机之后,业务系统就只能够读,而不能写入数据了

4.读写分离-双主双从介绍

  • 双主双从介绍

    一个主机 Master1 用于处理所有写请求,它的从机 Slave1 和另一台主机 Master2还有它的从机 Slave2 负责所有读请求。当Master1主机宕机后,Master2 主机负责写请求,Master1、Master2 互为备机。架构图如下:

    在这里插入图片描述

5.读写分离-双主双从搭建

  • 双主双从搭建

    主备工作

    我们需要准备5台服务器,具体的服务器及软件安装情况如下:

    编号 IP 预装软件 角色
    1 192.168.200.210 MyCat、MySQL MyCat中间件服务器
    2 192.168.200.211 MySQL Master1
    3 192.168.200.212 MySQL Slave1
    4 192.168.200.213 MySQL Master2
    5 192.168.200.214 MySQL Slave2

    关闭以上所有服务器的防火墙

    在这里插入图片描述

    双主双从搭建

    一、主库配置(Master1-192.168.200.211)

    1.修改配置文件 /etc/my.cnf

    #mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方-1,默认为1
    server-id=1
    #指定同步的数据库
    binlog-do-db=db01
    binlog-do-db=db02
    binlog-do-db=db03
    #在作为从数据库的时候,有写入操作也要更新二进制日志文件
    log-slave-updates
    

    2.重启MySQL服务

    systemctl restart mysqld
    

    二、主库配置(Master2-192.168.200.213)

    1.修改配置文件 /etc/my.cnf

    #mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方-1,默认为1
    server-id=3
    #指定同步的数据库
    binlog-do-db=db01
    binlog-do-db=db02
    binlog-do-db=db03
    #在作为从数据库的时候,有写入操作也要更新二进制日志文件
    log-slave-updates
    

    2.重启MySQL服务

    systemctl restart mysqld
    

    三、两台主库创建账户并授权

    1.创建账户并授权

    #创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
    CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
    #为itcast用户分配主从复制权限
    GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
    

    2.通过指令,查看两台主库的二进制日志坐标

    show master status;
    

    四、从库配置(Slave1-192.168.200.212)

    1.修改配置文件 /etc/my.cnf

    #mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方-1,默认为1
    server-id=2
    

    2.重启MySQL服务

    systemctl restart mysqld
    

    五、从库配置(Slave1-192.168.200.214)

    1.修改配置文件 /etc/my.cnf

    #mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方-1,默认为1
    server-id=4
    

    2.重启MySQL服务

    systemctl restart mysqld
    

    六、两台从库配置关联的主库

    CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='',MASTER_LOG_FILE='',MASTER_LOG_POS='';
    

    例子

    CHANGE MASTER TO MASTER_HOST='192.168.200.211',MASTER_USER='itcast',MASTER_PASSWORD='Root@123456',MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS='156';
    

    需要注意slave1对应的是master1,slave2对应的是master2。MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS='156'这两个参数可以通过主库执行show master status;命令进行查看

    启动两台从库主从复制,查看从库状态

    start slave;
    show slave status\G;
    

    七、两台主库相互复制

    Master2 复制 Master1,Master1 复制 Master2

    CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='',MASTER_LOG_FILE='',MASTER_LOG_POS='';
    

    启动两台从库主从复制,查看从库状态

    start slave;
    show slave status\G;
    

    八、测试

    分别在两台主库Master1、Master2上执行DDL、DML语句,查看涉及到的数据库服务器的数据同步情况。

6.读写分离-双主双从读写分离

  • 双主双从读写分离

    配置

    MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制,通过writeType及switchType来完成失败自动切换的。

    在这里插入图片描述
    在这里插入图片描述

    balance="1" 代表全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1, M2->S2,并 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡;

    writeType
    0:写操作都转发到第1台writeHost,writeHost1挂了,会切换到writeHost2上;
    1:所有的写操作都随机地发送到配置的writeHost上;

    switchType
    -1:不自动切换
    1:自动切换

    schema.xml配置文件(部分主要配置)

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    	<schema name="ITCAST_RW2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7"></schema>
    	<dataNode name="dn7" dataHost="dhost7" database="db01" />
    	<dataHost name="dhost3" maxCon="1000" minCon="10" balance="1"
    		  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="master1" url="jdbc:mysql://192.168.200.211:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234">
    			<readHost host="slave1" url="jdbc:mysql://192.168.200.212:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234"></readHost>
    		</writeHost>
    		<writeHost host="master2" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234">
    			<readHost host="slave2" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234"></readHost>
    		</writeHost>
    	</dataHost>
    </mycat:schema>
    

    server.xml配置文件(部分主要配置)

    <user name="root" defaultAccount="true">
    	<property name="password">123456</property>
    	<property name="schemas">ITCAST_RW2</property>
    </user>
    

    测试

    登录MyCat,测试查询及更新操作,判定是否能够进行读写分离,以及读写分离的策略是否正确。

    当主库挂掉一个之后,是否能够自动切换。

在这里插入图片描述

此文档来源于网络,如有侵权,请联系删除!

猜你喜欢

转载自blog.csdn.net/weixin_44904239/article/details/130379510