MySQL高级篇复盘笔记(二)【日志、主从复制、分库分表、读写分离】

news2024/11/26 2:44:41

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

一、日志

1.1 错误日志

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

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

show variables like '%log_error%';

在这里插入图片描述


1.2 二进制日志

介绍

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

作用:

  • 灾难时的数据恢复;
  • MySQL的主从复制。

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

show variables like '%log_bin%';

在这里插入图片描述

在这里插入图片描述

参数说明:

  • log_bin_basename:当前数据库服务器的binlog日志的基础名称(前缀),具体的binlog文件名需要再该basename的基础上加上编号(编号从000001开始)。
  • log_bin_index:binlog的索引文件,里面记录了当前服务器关联的binlog文件有哪些。

格式

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

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

在这里插入图片描述
如果我们需要配置二进制日志的格式,只需要在 /etc/my.cnf 中配置 binlog_format 参数即可。


查看

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

mysqlbinlog [ 参数选项 ] logfilename

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

删除

对于比较繁忙的业务系统,每天生成的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的配置文件中配置二进制日志的过期时间,设置了之后,二进制日志过期会自动删除。

show variables like '%binlog_expire_logs_seconds%';

1.3 查询日志

查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的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 文件。之后所有的客户端的增删改查操作都会记录在该日志文件之中,长时间运行后,该日志文件将会非常大。


1.4 慢查询日志

慢查询日志记录了所有执行时间超过参数 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

注意: 上述所有的参数配置完成之后,都需要重新启动MySQL服务器才可以生效。


二、主从复制

2.1 概述

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

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

在这里插入图片描述

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

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

2.2 原理

MySQL主从复制的核心就是 二进制日志,具体的过程如下

在这里插入图片描述

从上图看,复制分成三步:

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

2.3 搭建

2.3.1 准备

在这里插入图片描述

准备好两台服务器之后,在上述的两台服务器中分别安装好MySQL,并完成基础的初始化准备(安装、密码配置等操作)工作。 其中:

  • 192.168.200.200 作为主服务器master
  • 192.168.200.201 作为从服务器slave

2.3.2 主库配置

  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,创建远程连接的账号,并授予主从复制权限

    #创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
    CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
    
    #为 'itcast'@'%' 用户分配主从复制权限
    GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
    
  4. 通过指令,查看二进制日志坐标

    show master status ;
    

在这里插入图片描述

字段含义说明:

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

2.3.3 从库配置

  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,设置主库配置

    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中的语法。如果mysql是 8.0.23 之前的版本,执行如下SQL:

    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之前
    
  2. 查看主从同步状态

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

在这里插入图片描述


2.3.4 测试

  1. 在主库 192.168.200.200 上创建数据库、表,并插入数据
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. 在从库 192.168.200.201 中查询数据,验证主从是否同步

在这里插入图片描述


三、分库分表

3.1 介绍

3.1.1 问题分析

在这里插入图片描述

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

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

为了解决上述问题,我们需要对数据库进行分库分表处理。

在这里插入图片描述

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


3.1.2 拆分策略

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

在这里插入图片描述


3.1.3 垂直拆分

  1. 垂直分库
    在这里插入图片描述

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

特点:

  • 每个库的表结构都不一样
  • 每个库的数据也不一样
  • 所有库的并集是全量数据
  1. 垂直分表
    在这里插入图片描述

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

特点:

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

3.1.4 水平拆分

  1. 水平分库

在这里插入图片描述

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

特点:

  • 每个库的表结构都一样
  • 每个库的数据都不一样
  • 所有库的并集是全量数据
  1. 水平分表
    在这里插入图片描述
    水平分表:以 字段 为依据,按照一定策略,将一个表的数据拆分到多个表中。

    特点:

    • 每个表的表结构都一样
    • 每个表的数据都不一样
    • 所有表的并集是全量数据

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


3.1.5 实现技术

  • shardingJDBC:基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。
  • MyCat:数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。

在这里插入图片描述
我们选择了是MyCat数据库中间件,通过MyCat中间件来完成分库分表操作。


3.2 MyCat概述

3.2.1 介绍

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

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

优势:

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

3.2.2 下载

下载地址:http://dl.mycat.org.cn/

在这里插入图片描述


3.2.3 安装

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

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

3.2.4 目录介绍

在这里插入图片描述

  • bin : 存放可执行文件,用于启动停止mycat
  • conf:存放mycat的配置文件
  • lib:存放mycat的项目依赖包(jar)
  • logs:存放mycat的日志文件

3.2.5 概念介绍

在MyCat的整体结构中,分为两个部分:上面的逻辑结构、下面的物理结构。

在这里插入图片描述
在MyCat的逻辑结构主要负责逻辑库、逻辑表、分片规则、分片节点等逻辑结构的处理,而具体的数据存储还是在物理结构,也就是数据库服务器中存储的。

在后面讲解MyCat入门以及MyCat分片时,还会讲到上面所提到的概念。


3.3 MyCat入门

3.3.1 需求

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


3.3.2 环境准备

准备3台服务器:

  • 192.168.200.210:MyCat中间件服务器,同时也是第一个分片服务器。
  • 192.168.200.213:第二个分片服务器
  • 192.168.200.214:第三个分片服务器

在这里插入图片描述

并且在上述3台数据库中创建数据库 db01 。


3.3.3 配置

  1. schema.xml
    在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>
    
  2. server.xml
    需要在server.xml中配置用户名、密码,以及用户的访问权限信息,具体的配置如下:

    <user name="root" defaultAccount="true">
        <property name="password">123456</property>
        <property name="schemas">DB01</property>
        <!-- 表级 DML 权限设置 -->
        <!--
        <privileges check="true">
        <schema name="DB01" dml="0110" >
        <table name="TB_ORDER" dml="1110"></table>
        </schema>
        </privileges>
        -->
    </user>
    <user name="user">
    <property name="password">123456</property>
    <property name="schemas">DB01</property>
    <property name="readOnly">true</property>
    </user>
    

上述的配置表示,定义了两个用户 root 和 user ,这两个用户都可以访问 DB01 这个逻辑库,访问密码都是123456,但是root用户访问DB01逻辑库,既可以读,又可以写,但是 user用户访问DB01逻辑库是只读的。


3.3.4 测试

  1. 连接MyCat
    通过如下指令,就可以连接并登陆MyCat。

    mysql -h 192.168.200.210 -P 8066 -uroot -p123456
    

    我们看到我们是通过MySQL的指令来连接的MyCat,因为MyCat在底层实际上是模拟了MySQL的协议。

  2. 数据测试
    然后就可以在MyCat中来创建表,并往表结构中插入数据,查看数据在MySQL中的分布情况。

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

INSERT INTO TB_ORDER(id,title) VALUES(1,'goods1');
INSERT INTO TB_ORDER(id,title) VALUES(2,'goods2');
INSERT INTO TB_ORDER(id,title) VALUES(3,'goods3');
INSERT INTO TB_ORDER(id,title) VALUES(1,'goods1');
INSERT INTO TB_ORDER(id,title) VALUES(2,'goods2');
INSERT INTO TB_ORDER(id,title) VALUES(3,'goods3');
INSERT INTO TB_ORDER(id,title) VALUES(5000000,'goods5000000');
INSERT INTO TB_ORDER(id,title) VALUES(10000000,'goods10000000');
INSERT INTO TB_ORDER(id,title) VALUES(10000001,'goods10000001');
INSERT INTO TB_ORDER(id,title) VALUES(15000000,'goods15000000');
INSERT INTO TB_ORDER(id,title) VALUES(15000001,'goods15000001');

经过测试,我们发现,在往 TB_ORDER 表中插入数据时:

  • 如果id的值在1-500w之间,数据将会存储在第一个分片数据库中。
  • 如果id的值在500w-1000w之间,数据将会存储在第二个分片数据库中。
  • 如果id的值在1000w-1500w之间,数据将会存储在第三个分片数据库中。
  • 如果id的值超出1500w,在插入数据时,将会报错。

为什么会出现这种现象,数据到底落在哪一个分片服务器到底是如何决定的呢? 这是由逻辑表配置时的一个参数 rule 决定的,而这个参数配置的就是分片规则,关于分片规则的配置,在后面的课程中会详细讲解。


四、读写分离

4.1 介绍

读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。

通过MyCat即可轻易实现上述功能,不仅可以支持MySQL,也可以支持Oracle和SQL Server。
在这里插入图片描述


4.2 一主一从

4.2.1 原理

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

在这里插入图片描述


4.2.2 准备

主机角色用户名密码
192.168.200.211masterroot1234
192.168.200.212slaveroot1234

4.3 一主一从读写分离

MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。

4.3.1 schema.xml配置

<!-- 配置逻辑库 -->
<schema name="ITCAST_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
</schema>

<dataNode name="dn7" dataHost="dhost7" database="itcast" />

<dataHost name="dhost7" 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:3306useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8"
           user="root" password="1234" >
    <readHost host="slave1" url="jdbc:mysql://192.168.200.212:3306useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8"
              user="root" password="1234" />
</writeHost>
</dataHost>

上述配置的具体关联对应情况如下:

在这里插入图片描述

writeHost代表的是写操作对应的数据库,readHost代表的是读操作对应的数据库。 所以我们要想实现读写分离,就得配writeHost关联的是主库,readHost关联的是从库。而仅仅配置好了writeHost以及readHost还不能完成读写分离,还需要配置一个非常重要的负责均衡的参数 balance,取值有4种,具体含义如下:

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

所以,在一主一从模式的读写分离中,balance配置1或3都是可以完成读写分离的。


4.3.2 server.xml配置

配置root用户可以访问SHOPPING、ITCAST 以及 ITCAST_RW逻辑库。

<user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <property name="schemas">SHOPPING,ITCAST,ITCAST_RW</property>
    <!-- 表级 DML 权限设置 -->
    <!--
    <privileges check="true">
    <schema name="DB01" dml="0110" >
    <table name="TB_ORDER" dml="1110"></table>
    </schema>
    </privileges>
    -->
</user>

4.3.3 测试

配置完毕MyCat后,重新启动MyCat。

bin/mycat stop
bin/mycat start

然后观察,在执行增删改操作时,对应的主库及从库的数据变化。 在执行查询操作时,检查主库及从库对应的数据变化。

在测试中,我们可以发现当主节点Master宕机之后,业务系统就只能够读,而不能写入数据了。
在这里插入图片描述

那如何解决这个问题呢?这个时候我们就得通过另外一种主从复制结构来解决了,也就是我们接下来讲解的双主双从。


4.4 双主双从

4.4.1 介绍

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


4.4.2 准备

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

编号IP预装软件角色
1192.168.200.210MyCat、MySQLMyCat中间件服务器
2192.168.200.211MySQLM1
3192.168.200.212MySQLS1
4192.168.200.213MySQlM2
5192.168.200.214MySQLS2
关闭以上所有服务器的防火墙:

systemctl stop firewalld

systemctl disable firewalld

4.4.3 搭建

4.4.3.1 主库配置

(1) Slave1(192.168.200.212)
在这里插入图片描述

  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
    
  3. 创建账户并授权

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

    通过命令,查看两台主库的二进制日志坐标:

    show master status ;
    

在这里插入图片描述

(2)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
    
  3. 创建账户并授权

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

    通过命令,查看两台主库的二进制日志坐标:

    show master status ;
    

在这里插入图片描述


4.4.3.2 从库配置

(1)Slave1(192.168.200.212)
在这里插入图片描述

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

    #mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
    server-id=2
    
  2. 重新启动MySQL服务器

    systemctl restart mysqld
    

(2)Slave2(192.168.200.214)
在这里插入图片描述

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

    #mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
    server-id=4
    
  2. 重新启动MySQL服务器

    systemctl restart mysqld
    

4.4.3.3 从库关联主库

(1)两台从库配置关联的主库
在这里插入图片描述

需要注意slave1对应的是master1,slave2对应的是master2。

  1. 在 slave1(192.168.200.212)上执行

    CHANGE MASTER TO MASTER_HOST='192.168.200.211', MASTER_USER='itcast',
    MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000002',
    MASTER_LOG_POS=663;
    
  2. 在 slave2(192.168.200.214)上执行

    CHANGE MASTER TO MASTER_HOST='192.168.200.213', MASTER_USER='itcast',
    MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000002',
    MASTER_LOG_POS=663;
    
  3. 启动两台从库主从复制,查看从库状态

    start slave;
    show slave status \G;
    

在这里插入图片描述

(2)两台主库相互复制
在这里插入图片描述

Master2 复制 Master1,Master1 复制 Master2。

  1. 在 Master1(192.168.200.211)上执行

    CHANGE MASTER TO MASTER_HOST='192.168.200.213', MASTER_USER='itcast',
    MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000002',
    MASTER_LOG_POS=663;
    
  2. 在 Master2(192.168.200.213)上执行

    CHANGE MASTER TO MASTER_HOST='192.168.200.211', MASTER_USER='itcast',
    MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000002',
    MASTER_LOG_POS=663;
    
  3. 启动两台从库主从复制,查看从库状态

    start slave;
    
    show slave status \G;
    

在这里插入图片描述
经过上述的三步配置之后,双主双从的复制结构就已经搭建完成了。 接下来,我们可以来测试验证一下。


4.4.4 测试

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

create database db01;
	use db01;
	create table tb_user(
	id int(11) not null primary key ,
	name varchar(50) not null,
	sex varchar(1)
)engine=innodb default charset=utf8mb4;

insert into tb_user(id,name,sex) values(1,'Tom','1');
insert into tb_user(id,name,sex) values(2,'Trigger','0');
insert into tb_user(id,name,sex) values(3,'Dawn','1');
insert into tb_user(id,name,sex) values(4,'Jack Ma','1');
insert into tb_user(id,name,sex) values(5,'Coco','0');
insert into tb_user(id,name,sex) values(6,'Jerry','1');
  • 在Master1中执行DML、DDL操作,看看数据是否可以同步到另外的三台数据库中。
  • 在Master2中执行DML、DDL操作,看看数据是否可以同步到另外的三台数据库中。

完成了上述双主双从的结构搭建之后,接下来,我们再来看看如何完成这种双主双从的读写分离。


4.5 双主双从读写分离

4.5.1 配置

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

  1. schema.xml
    配置逻辑库:
    <schema name="ITCAST_RW2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
    </schema>
    
    配置数据节点:
    <dataNode name="dn7" dataHost="dhost7" database="db01" />
    
    配置节点主机:
    <dataHost name="dhost7" 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" />
        </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" />
        </writeHost>
    </dataHost>
    

具体的对应情况如下:
在这里插入图片描述

属性说明:

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 : 自动切换
  1. user.xml
    配置root用户也可以访问到逻辑库 ITCAST_RW2。
    <user name="root" defaultAccount="true">
        <property name="password">123456</property>
        <property name="schemas">SHOPPING,ITCAST,ITCAST_RW2</property>
        <!-- 表级 DML 权限设置 -->
        <!--
        <privileges check="true">
        <schema name="DB01" dml="0110" >
        <table name="TB_ORDER" dml="1110"></table>
        </schema>
        </privileges>
        -->
    </user>
    

4.5.2 测试

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

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


 
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

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

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

相关文章

【Redis25】Redis进阶:分布式锁实现

Redis进阶&#xff1a;分布式锁实现 锁这个概念&#xff0c;不知道大家掌握的怎么样。我是先通过 Java &#xff0c;知道在编程语言中是如何使用锁的。一般 Java 的例子会是操作一个相同的文件&#xff0c;但其实我们知道&#xff0c;不管是文件&#xff0c;还是数据库中的一条…

Dapper存取Blob类型数据

&#x1f32e; Dapper存取Blob类型数据 前言&#xff1a; blob类型是数据库用于保存二进制文件的一种类型&#xff0c;可以将文件存储到数据库的表中。&#xff08;使用到的情况比较少&#xff0c;毕竟文件可以直接在服务器上保存并且访问为什么要放到数据库里。但如果你服务器…

1.MySQL安装与配置

1.MySQL安装与配置 &#x1f4e4;1 数据库介绍&#x1f4e4;&#x1f6aa;1.1关于MySQL主要要学啥&#x1f6aa; ✉️2 MySQL服务器安装✉️&#x1f4c4;2.1 Windows绿色安装&#x1f4c4;&#x1f4d1;2.2 Windows中重装MySQL&#x1f4d1; &#x1f4e8;3 Mac中常见的安装问…

多云环境中的微服务应用安全挑战

随着越来越多的组织将云策略扩展到私有云、公共云、本地数据中心和边缘站点&#xff0c;将多云作为数字转型倡议的一部分&#xff0c;新的安全挑战不断涌现&#xff0c;必须在安全倡议的每个阶段加以考虑。 在云中操作具有多个优势&#xff0c;任何组织&#xff0c;无论是公共…

在线答题小程序制作,这些坑你一定要避免

在线答题小程序制作&#xff0c;你需要知道以下几个关键点&#xff0c;才能避免一些常见的坑。这里&#xff0c;我会为你详细介绍如何制作一个高质量的在线答题小程序。 关键点一&#xff1a;确定目标用户群体 在制作在线答题小程序之前&#xff0c;你需要确定你的目标用户群…

行云创新受邀参加阿里云开发者技术沙龙,分享云原生技术实践案例

云原生IDE&#xff0c;定义开发新常态 2023年5月28日&#xff0c;由阿里举办的云原生技术实践营-阿里云开发者技术沙龙在深圳市南山区成功举办。本次沙龙活动主要围绕云原生话题开展实践案例经验分享&#xff0c;行云创新CEO马洪喜作为受邀嘉宾之一&#xff0c;参加了本次活动…

UITableView学习笔记

看TableView的资料其实已经蛮久了&#xff0c;一直想写点儿东西&#xff0c;却总是因为各种原因拖延&#xff0c;今天晚上有时间静下心来记录一些最近学习的TableView的知识。下面进入正题&#xff0c;UITableView堪称UIKit里面最复杂的一个控件了&#xff0c;使用起来不算难&a…

本地Linux搭建web服务并发布公网访问 - 无需公网IP

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;在Ubunt…

代码随想录 栈与队列 Java

文章目录 &#xff08;简单&#xff09;232. 用栈实现队列&#xff08;简单&#xff09;225. 用队列实现栈&#xff08;简单&#xff09;20. 有效的括号&#xff08;简单&#xff09;1047. 删除字符串中的所有相邻重复项&#xff08;中等&#xff09;150. 逆波兰表达式求值&…

【红黑树 -- 理论与实现】

目录&#xff1a; 前言红黑树的概念红黑树的性质 插入过程遇到的情况情况1 -- 根节点情况2 -- parent为黑色情况3 -- parent为红色uncle为红色uncle为黑色uncle不存在 插入过程代码实现分析红黑树是否构建成功总结 前言 打怪升级&#xff1a;第88天 红黑树&#xff0c;可以说是…

Xubuntu16.04 系统偶发出现自动登出的问题

继上次发现的这个问题 xubuntu系统偶发自动登出&#xff0c;这次问题又浮现了&#xff0c;我第一时间拷贝了系统日志。 为了减少搜索量&#xff0c;可以先清除之前的系统日志&#xff0c;待问题出现 echo > /var/log/syslog echo > /var/log/kern.logMar 21 15:07:58 au…

面试:解决数字精度丢失

理论上用有限的空间来存储无限的小数是不可能保证精确的&#xff0c;但我们可以处理一下得到我们期望的结果 当你拿到 1.4000000000000001 这样的数据要展示时&#xff0c;建议使用 toPrecision 凑整并 parseFloat 转成数字后再显示&#xff0c;如下&#xff1a; parseFloat(…

为什么新产品没热度,流量分析

很多人反馈新产品上线之后却没有多少热度&#xff0c;这究竟是什么样原因呢?今天来为大家分享下为什么新产品没热度&#xff0c;流量分析。 新产品没有热度其实可以从两个主要方面进行探讨&#xff1a; 一、主观原因 1.缺乏吸引消费者的独特卖点 这个原因可能是新产品太过于普…

9个服务端提升debug效率的IDEA Debugger技巧

不可否认&#xff0c;未来的一到两年中&#xff0c;程序员的编码体验将会发生剧烈的变化。作为一名一线开发&#xff0c;要如何提前准备&#xff0c;来应对这种变化呢&#xff1f; 前言 在AIGC时代&#xff0c;虽然深度学习模型可以仅通过一段注释来生成我们想要的代码&#xf…

.net 混淆工具

obfuscation tools .net 社区有很多混淆工具, 比如这个清单: https://github.com/NotPrab/.NET-Obfuscator 比较有名的商业工具有 .NET REACTOR https://www.eziriz.com/, 开源软件中, 最受欢迎的有: obfuscar https://github.com/obfuscar/obfuscar老版 ConfuserEx https://gi…

代码危机!如何利用自定义异常应对复杂业务逻辑

大家好&#xff0c;我是小米&#xff0c;在这篇文章中&#xff0c;我将和大家分享关于自定义异常的使用场景以及一个实际的电商项目案例。自定义异常在软件开发中起到了重要的作用&#xff0c;能够帮助我们更好地管理和处理各种异常情况。让我们一起来看看各个场景下如何使用自…

85.建立主体页面-第一部分

记住我们之前画的草图&#xff0c;根据我们的草图来构建初始的页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta n…

202313读书笔记|《山居七年》——我只想在广袤璀璨的星河里享受生的鲜活,独自飞,游走

202313读书笔记|《山居七年》——我只想在广袤璀璨的星河里享受生的鲜活&#xff0c;独自飞&#xff0c;游走 《山居七年》 作者张二冬&#xff0c;选择隐士山居是一种很自由随性的生活态度&#xff0c;我觉得这不是普通人可以拥有的&#xff0c;比如我&#xff0c;并未入世也…

Nginx学习1--介绍和安装

文章目录 官方网站常用功能核心组成下载安装源码安装linux包安装ubuntu安装docker安装 官方网站 http://nginx.org/ 官方文档 常用功能 静态资源部署处理静态文件、处理索引文件以及支持自动索引&#xff1b; Rewrite地址重写正则表达式 反向代理提供反向代理服务器&#xf…

大数据:配置云服务器,主机名映射和SSH免密登录,创建Hadoop用户,复制免密登录

大数据&#xff1a;配置云服务器&#xff0c;主机名映射和SSH免密登录&#xff0c;创建Hadoop用户&#xff0c;复制免密登录 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 …