MySQL全解[集群篇]

news2025/7/22 22:59:56

目录

  • 日志
    • 错误日志
    • 二进制日志
      • 格式
      • 查看
      • 删除
    • 查询日志
    • 慢查询日志
  • 主从复制
    • 原理
    • docker搭建
  • 分库分表
    • 拆分策略
    • 垂直拆分
      • 垂直分库
      • 垂直分表
    • 水平拆分
      • 水平分库
      • 水平分表
    • 实现技术
  • MyCat2
    • mysql2对比mycat1.x
    • docker运行mycat2

日志

错误日志

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

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

show variables like '%log_error%';

二进制日志

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

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

在MySQL8版本中,默认二进制日志是开启着的,涉及到的参数如下:

show variables like '%log_bin%';

在这里插入图片描述
参数说明:

  1. log_bin_basename:当前数据库服务器的binlog日志的基础名称(前缀),具体的binlog文件名需要再该basename的基础上加上编号(编号从000001开始)。

  2. log_bin_index:binlog的索引文件,里面记录了当前服务器关联的binlog文件有哪些。

格式

MySQL服务器中提供了多种格式来记录二进制日志,具体格式及特点如下:
在这里插入图片描述

show variables like '%binlog_format%';

如果需要配置二进制日志的格式,只需要在 /etc/my.cnf 中配置 binlog_format 参数即可。

查看

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

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

删除

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

在这里插入图片描述
也可以在mysql的配置文件中配置二进制日志的过期时间,设置了之后,二进制日志过期会自动删除。

show variables like '%binlog_expire_logs_seconds%';

查询日志

查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的SQL语句。默认情况下,查询日志是未开启的。

如果需要开启查询日志,可以修改MySQL的配置文件 /etc/my.cnf 文件,添加如下内容:

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

开启了查询日志之后,在MySQL的数据存放目录,也就是 /var/lib/mysql/ 目录下就会出现mysql_query.log 文件。之后所有的客户端的增删改查操作都会记录在该日志文件之中,长时间运行后,该日志文件将会非常大。

慢查询日志

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

如果需要开启慢查询日志,需要在MySQL的配置文件 /etc/my.cnf 中配置如下参数:

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

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

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

主从复制

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

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

在这里插入图片描述

MySQL 复制的优点主要包含以下三个方面:

  1. 主库出现问题,可以快速切换到从库提供服务。
  2. 实现读写分离,降低主库的访问压力。
  3. 可以在从库中执行备份,以避免备份期间影响主库服务。

原理

MySQL主从复制的核心就是 二进制日志,具体的过程如下:
在这里插入图片描述
复制分成三步:

  1. Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
  2. 从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log 。
  3. slave重做中继日志中的事件,将改变反映它自己的数据。

docker搭建

  1. 主库配置
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=1
#是否只读,1 代表只读, 0 代表读写
read-only=0
#忽略的数据, 指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
  1. 重启MySQL服务器docker restart mysql8
  2. 登录mysql,创建远程连接的账号,并授予主从复制权限
#创建itcast用户,并设置密码为`Root@123456`,该用户可在任意主机连接该MySQL服务
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';

#为 'itcast'@'%' 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
  1. 通过指令,查看二进制日志坐标

    show master status ;
    

    在这里插入图片描述

    字段含义说明:

    1. file : 从哪个日志文件开始推送日志文件
    2. position : 从哪个位置开始推送日志
    3. binlog_ignore_db : 指定不需要同步的数据库
  2. 从库配置

#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=2
#是否只读,1 代表只读, 0 代表读写
read-only=1
  1. 登录mysql,设置主库配置
# 8.0.23
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.200.200', SOURCE_USER='itcast',
SOURCE_PASSWORD='Root@123456', SOURCE_LOG_FILE='binlog.000004',
SOURCE_LOG_POS=663;

# 8.0.23之前
CHANGE MASTER TO MASTER_HOST='192.168.200.200', MASTER_USER='itcast',
MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000004',
MASTER_LOG_POS=663;

在这里插入图片描述

  1. 开启同步操作
start replica ; #8.0.22之后
start slave ; #8.0.22之前
  1. 查看主从同步状态

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

    在这里插入图片描述

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

create database db01;
use db01;
create table tb_user(
id int(11) primary key not null auto_increment,
name varchar(50) not null,
sex varchar(1)
)engine=innodb default charset=utf8mb4;
insert into tb_user(id,name,sex) values(null,'Tom', '1'),(null,'Trigger','0'),
(null,'Dawn','1');
  1. 在从库中查询数据,验证主从是否同步
    在这里插入图片描述

分库分表

随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:

  1. IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。 请求数据太多,带宽不够,网络IO瓶颈。
  2. CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。

为了解决上述问题,我们需要对数据库进行分库分表处理。
在这里插入图片描述
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。

拆分策略

分库分表的形式,主要是两种:垂直拆分和水平拆分。而拆分的粒度,一般又分为分库和分表,所以组成的拆分策略最终如下:
在这里插入图片描述

垂直拆分

垂直分库

在这里插入图片描述
垂直分库:以表为依据,根据业务将不同表拆分到不同库中。

特点:

  1. 每个库的表结构都不一样。
  2. 每个库的数据也不一样。
  3. 所有库的并集是全量数据。

垂直分表

在这里插入图片描述
垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。

特点:

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

水平拆分

水平分库

在这里插入图片描述
水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。

特点:

  1. 每个库的表结构都一样。
  2. 每个库的数据都不一样。
  3. 所有库的并集是全量数据。

水平分表

在这里插入图片描述
水平分表:以字段为依据,按照一定策略,将一个表的数据拆分到多个表中。
特点:

  1. 每个表的表结构都一样。
  2. 每个表的数据都不一样。
  3. 所有表的并集是全量数据。

在业务系统中,为了缓解磁盘IO及CPU的性能瓶颈,到底是垂直拆分,还是水平拆分;具体是分库,还是分表,都需要根据具体的业务需求具体分析。

实现技术

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

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

We are go developers…通过MyCat中间件来完成分库分表操作。

在这里插入图片描述

MyCat2

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

  2. 开发人员只需要连接MyCat即可,而具体底层用到几台数据库,每一台数据库服务器里面存储了什么数据,都无需关心。 具体的分库分表的策略,只需要在MyCat中配置即可。

在这里插入图片描述
优势:

  1. 性能可靠稳定
  2. 强大的技术团队
  3. 体系完善
  4. 社区活跃

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

似乎,mycat1.6.x版本已经凉凉了,连官网都没了,有言论说mycat是伪集群,大厂在生产环境使用mycat的也寥寥无几。

偶然看到了mycat2,大佬说mycat2是另外一个产品,独立的,代码与mycat1没有关系,配置文件也变成了json,以官网为准,继续学习。

mysql2对比mycat1.x

功能
1.6
2
多语句
不支持
支持
blob值
支持一部分
支持
全局二级索引
不支持
支持
任意跨库join(包含复杂查询)
catlet支持
支持
分片表与分片表JOIN查询
ER表支持
支持
关联子查询
不支持
支持一部分
分库同时分表
不支持
支持
存储过程
支持固定形式的
支持更多
支持逻辑视图
不支持
支持
支持物理视图
支持
支持
批量插入
不支持
支持
执行计划管理
不支持
支持
路由注释
支持
支持
集群功能
支持
支持更多集群类型
自动hash分片算法
不支持
支持
支持第三方监控
支持mycat-web
支持普罗米斯,kafka日志等监控
流式合拼结果集
支持
支持
范围查询
支持
支持
单表映射物理表
不支持
支持
XA事务
弱XA
支持,事务自动恢复
支持MySQL8
需要更改mysql8的服务器配置支持
支持
虚拟表
不支持
支持
joinClustering
不支持
支持
union all语法
不支持
支持
BKAJoin
不支持
支持
优化器注释
不支持
支持
ER表
支持
支持
全局序列号
支持
支持
保存点
不支持
支持
离线迁移
支持
支持(实验)
增量迁移
CRC32算法支持
BINLOG追平(实验)
安全停机
不支持
支持(实验)
HAProxy协议
不支持
支持
会话粘滞
update后select会粘滞
update后select会粘滞且支持设置时间
全局表插入支持全局序列号
不支持
支持
全局表插入支持主表插入自增结果作为序列号
不支持
支持
外部调用的分片算法
不支持但可定制
支持

docker运行mycat2

  1. 编写Dockerfile
FROM docker.io/adoptopenjdk/openjdk8:latest

ENV AUTO_RUN_DIR ./mycat2
ENV DEPENDENCE_FILE mycat2-1.22-release-jar-with-dependencies-2022-5-12.jar
ENV TEMPLATE_FILE mycat2-install-template-1.21.zip


RUN sed -i "s@http://.*archive.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN sed -i "s@http://.*security.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list

RUN buildDeps='procps wget unzip' \
    && apt-get update \
    && apt-get install -y $buildDeps

RUN wget -P  $AUTO_RUN_DIR/ http://dl.mycat.org.cn/2.0/1.22-release/$DEPENDENCE_FILE \
   &&  wget -P  $AUTO_RUN_DIR/ http://dl.mycat.org.cn/2.0/install-template/$TEMPLATE_FILE  


RUN cd $AUTO_RUN_DIR/ \
    && unzip $TEMPLATE_FILE \
    && ls -al . \
    && mv  $DEPENDENCE_FILE mycat/lib/ \
    && chmod +x  mycat/bin/* \
    && chmod 755  mycat/lib/* \
    && mv mycat /usr/local
#copy mycat /usr/local/mycat/
VOLUME /usr/local/mycat/conf
VOLUME /usr/local/mycat/logs

EXPOSE 8066 1984
CMD ["/usr/local/mycat/bin/mycat", "console"]
  1. 创建images
docker build -t mycat.org.cn/mycat2:20220513 .
  1. 创建配置文件conf
wget http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
unzip mycat2-install-template-1.21.zip
mv mycat/conf/ ./conf && rm -rf mycat
  1. 修改mycat的conf下prototype的配置,修改其中对应的user(用户),password(密码),url中的ip
{
    "dbType":"mysql",
    "idleTimeout":60000,
    "initSqls":[],
    "initSqlsGetConnection":true,
    "instanceType":"READ_WRITE",
    "maxCon":1000,
    "maxConnectTimeout":3000,
    "maxRetryCount":5,
    "minCon":1,
    "name":"prototypeDs",
    "password":"123456",
    "type":"JDBC",
    "url":"jdbc:mysql://169.254.212.3:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
    "user":"mycat",
    "weight":0
}
  1. 启动镜像
docker run --name mycat8 --restart=always \
  -p 8066:8066 \
  -p 1984:1984 \
  -v /data/mycat2/conf:/usr/local/mycat/conf \
  -v /data/mycat2/logs:/usr/local/mycat/logs \
  -d --privileged=true \
  mycat.org.cn/mycat2:20220513
  1. 测试连接
# 没错,就是用mysql客户端连接
mysql -uroot -p123456 -h 192.168.71.130 -P 8066

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NYUv2生成边界GT(2)

由NYUv2生成边界GT(1)可知,我们每张GT图片都生成一个对应的.bin文件。存放在D:\datasets\data_proc\train\edge_labels_40文件夹下,下一步我们需要生成.png文件,即需要使用convert_bin_to_png.py。 # -*- coding: utf-8 -*- import numpy as…

【Azure 架构师学习笔记】-Azure Storage Account(1)- Queue Storage

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account(1)-类型简介 前言 Azure Storage Queues 是一个专门用来处理基于云环境队列的Azure 服务。每个队列都维护着…

Netty之ChannelHandler初解

目录 目标 Netty版本 Netty官方API 实战 Netty服务器 入栈ChannelHandler读入数据顺序案例 出栈ChannelHandler写出数据顺序案例 ChannelHandlerContext和NioSocketChannel写入数据时有什么不同 Pipeline添加多个ChannelHandler有什么意义 目标 掌握ChannelHandler基…

海康工业相机使用教程

工业相机使用一、硬件连接1、准备材料2、相机供电(1)区分电源适配器正负极(2)连接相机电源线缆(3)连接完成后,相机蓝色灯常亮则成功3、软件连接(1)MVS客户端下载地址&…

你真的会在阳光下拍照片么?

你好,我是小麥。 上节课我们讲了如何通过影子判断光的质量,也就是光的软硬,这节课我们来接着说一说光的方向和环境光的实际运用。 虽然在现实生活里,我们可能没有从软硬的角度观察过光线,但我相信你在拍照片的时候一…

第九章:Java集合

第九章:Java集合 9.1:Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面,不涉及持久化)操作的结构,简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后,其长度就确定了。数组一旦定义好&#xff…

计算机操作系统:实验三存储管理程序设计

一、目的和要求 目的 存储管理的主要功能之一是合理地分配主存空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,来了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 要求…

数字工厂管理系统的应用案例

数字工厂管理系统是制造企业应用数字化工厂技术实现研发设计数字化、生产准备数字化、 生产制造数字化、运营管理数字化和营销服务数字化的重要手段,即通过应用数字相关技术提升产品全生命周期数字化水平,从而提升企业经营的可靠性、安全性和经济性。 任…

C++回顾(十)—— 多态

10.1 问题引出 10.1.1 如果子类定义了与父类中原型相同的函数会发生什么? 函数重写 在子类中定义与父类中原型相同的函数,函数重写只发生在父类与子类之间 重载与重写区别: (1)重载:同一个作用域&#xf…

A、力扣刷题——数组

提示:这是力扣上数组类题目里的简单题,按顺序做下来的23道题。 第一题: 关键词:原地修改,有序数组 我的答案: (for循环) (1)有序数组 class Solution{pu…

平安大视野前瞻2023投资策略:资产格局“危中有机”,关注科技、绿色、安全领域

3月3日,平安私人银行全新云端沙龙《平安大视野》第一站在杭州举办,活动聚焦2023年宏观经济展望,邀请中国首席经济学家论坛理事、鹏扬基金首席经济学家陈洪斌,平安私人银行首席策略分析师彭伟伟就国内外宏观经济变化和资产配置策略…

干货系列:高通量测序后的下游实验验证方法——m6A RNA甲基化篇|易基因

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。此前,我们分享了m6A RNA甲基化研究的数据挖掘思路(点击查看详情),进而筛选出m6A修饰目标基因。做完MeRIP-seq测序后,如果需要对分…

【JavaWeb】Servlet详解

文章目录1. 前置知识2.servlet生命周期2.1 默认情况下,服务器启动时,servlet对象并没有被创建2.2 用户执行一次请求2.3用户执行第二次请求2.4 3,4,5,6....次请求2.5 关闭服务器3.servlet方法解析4.适配器模式改造servlet4.1不使用servlet模式4.2使用适配…

【微服务】(十五)—— Seata 的部署和集成

文章目录1. 部署Seata的tc-server1.1 下载Seata1.2 解压1.3 修改配置1.4 在nacos添加配置1.5 创建数据库表1.6 启动TC服务2. 微服务集成seata2.1 引入依赖2.2 修改配置文件3. TC服务的高可用和异地容灾3.1 模拟异地容灾的TC集群3.2 将事务组映射配置到nacos3.3 微服务读取nacos…

软测入门(八)Selenium项目实战

自动化项目实战 项目计划设计 测试计划测试范围设定目标规划活动 实际项目中,需要根据项目的实际情况创建自己的项目计划,没有固定的格式和内容要求: 项目简介自动化实现网上购票项目启动前置条件1.购票网站工作正常 2.自动化测试环境准备…

JAVA的16 个实用代码优化小技巧

一、类成员与方法的可见性最小化 举例:如果是一个private的方法,想删除就删除。 如果一个public的service方法,或者一个public的成员变量,删除一下,不得思考很多。 二、使用位移操作替代乘除法 计算机是使用二进制…

垒骰子(爆搜/DP)

动态规划方格取数垒骰子方格取数 题目描述 设有 NNN \times NNN 的方格图 (N≤9)(N \le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 000。如下图所示(见样例): A0 0 0 0 0 0 0 00 0 13 0 …

ChatGPT助力校招----面试问题分享(一)

1 ChatGPT每日一题:期望薪资是多少 问题:面试官问期望薪资是多少,如何回答 ChatGPT:当面试官问及期望薪资时,以下是一些建议的回答方法: 1、调查市场行情:在回答之前,可以先调查一…

Python基础之while循环

一:while语法 while 条件:代码1 代码2 代码3....while的运行步骤: 步骤1:如果条件为真,那么依次执行:代码1、代码2、代码3、...... 步骤2:执行完毕后再次判断条件,如果条件为True则再次执行&#…

通用缓存存储设计实践

目录介绍 01.整体概述说明 1.1 项目背景介绍1.2 遇到问题记录1.3 基础概念介绍1.4 设计目标1.5 产生收益分析 02.市面存储方案 2.1 缓存存储有哪些2.2 缓存策略有哪些2.3 常见存储方案2.4 市面存储方案说明2.5 存储方案的不足 03.存储方案原理 3.1 Sp存储原理分析3.2 MMKV存储…