摘要: 本文介绍了MySQL运维中的日志管理、主从复制、分库分表和读写分离四大核心内容,重点讲解了日志分类与配置方法。日志部分详细解析了错误日志、二进制日志、查询日志和慢查询日志的作用、查看方式及配置技巧,包括二进制日志的自动清理设置。主从复制章节阐述了其原理、优势及具体搭建步骤,涵盖服务器准备、主从库配置等关键操作。文章来源于黑马程序员MySQL教程的学习笔记,内容注重实用性,适合数据库运维人员参考学习。

一、日志

日志分为错误日志、二进制日志、查询日志、慢查询日志四类。

1、错误日志:

是mysql中最重要的日志之一,记录当mysqld启动与停止、以及服务器在运行中发生的任何严重错误时的相关信息。该日志默认是开启的,默认存储的目录是:/var/log/,其默认的日志文件名为:mysqld.log。当启动失败或语句执行报错时,建议优先查看错误日志进行排查!
查看日志文件位置的语句:

show variables like '%log_error%'

2、二进制日志:

记录了所有的DDL(数据定义语言)和DML(数据操作语言),但不包括查询语句(select、show)。日志默认是开启的。
作用:

  • 灾难时的数据恢复
  • mysql的主从复值
    查询日志文件位置的语句:
show variables like '%log_bin%'

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

show variables like '%binlog_expire_logs_seconds%';

在这里插入图片描述
为了让配置在服务器重启后依然有效,你需要将其写入 MySQL 的配置文件(Linux 系统通常是 /etc/my.cnf 或 /etc/mysql/my.cnf)

1、编辑配置文件:

sudo vim /etc/my.cnf

2、在 [mysqld] 这一栏下面添加或修改以下参数:

[mysqld]
# 设置 binlog 自动过期时间为 7 天(单位:秒)
binlog_expire_logs_seconds = 604800

# 确保开启自动清理(默认为 ON,建议显式写上以防冲突)
binlog_expire_logs_auto_purge = ON

3、保存退出后,重启 MySQL 服务使配置生效:

SHOW GLOBAL VARIABLES LIKE 'binlog_expire_logs_seconds';

3、查询日志

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

show varialbles like '%general%'

在这里插入图片描述
开启查询日志:修改mysql的配置文件 /etc/my.cnf文件,添加如下内容

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

修改完成后重启mysql服务:systemctl restart mysqld
切换到/var/lib/mysql/查看是否存在设置的日志文件名.log文件
在这里插入图片描述

4、慢查询日志

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

开启慢查询日志:修改mysql的配置文件 /etc/my.cnf文件,添加如下内容

#开启慢查询日志
slow_query_log=1
#执行时间参数,例如:超过5秒视为慢查询
long_query_time=5

添加完成后需重启数据库服务:systemctl restart mysqld,当一条sql语句执行的时间超过设置的参数(5秒)时,在文件目录/var/lib/mysql/中会生成一个localhost-slow.log的文件。
默认情况下,不会记录管理语句,也不会记录不适用索引进行查找的查询。可以使用log_slow_admin_statements和更改此行为log_queries_not_using_indexes,如下所诉。

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

二、主从复制

1、概述

主从复制是指将主数据库(master)的DDL和DML操作通过二进制日志传到从库(slave)服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库与主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制,从库同事也可以作为其他从服务器的主库,实现链状复制。
在这里插入图片描述
MySQL复制的优点主要包含以下三个方面:

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

2、原理

MySQL的主从复制原理如下:
在这里插入图片描述
从上图来看,复制分为三步:

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

3、搭建

搭建主从复制结构分三步:服务器准备、主库配置、从库配置
1. 服务器准备
准备两台服务器,一台master(示例IP:192.168.200.200),一台slave(示例IP:192.168.200.201),需在两台服务器中安装mysql服务,需在防火墙当中的开启3306端口号或者直接关闭防火墙。

  • 开放指定的3306端口号(生产环境推荐):
firewall-cmd --zone=public --add-port=3306/tcp -permanent
firewall-cmd -reload
  • 对两台服务器的防火墙进行处理(测试阶段推荐):
systemctl stop firewalld
systemctl disable firewalld

2. 主库配置
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.2、重启mysql服务
systemctl restart mysqld
2.3、登录MySQL,创建远程连接的账号,并授予主从复制权限

#创建xiaomi用户,并设置密码,该用户可在任意主机连接该MySQL服务
create user 'xiaomi'@'%' identified with mysql_native_password by 'Root@123456';
#为'xiaomi'@'%'用户分配主从复制权限
grant replication slave on *.* to 'xiaomi'@'%';

当设置的密码过于简单时,可能会触发mysql的密码校验提醒,导致密码设置失败,此时我们只需更改mysql系统的配置,降低校验等级后再执行更改密码的语句即可。

-- 1. 将密码强度等级设置为 LOW(只检查密码长度)
SET GLOBAL validate_password.policy = LOW;

-- 2. 将密码最小长度限制改为 6 位
SET GLOBAL validate_password.length = 6;

2.4、 通过指定,查看二进制日志坐标

show master status; #MySQL 8.0+ 废弃了
#或
SHOW BINARY LOG STATUS;

在这里插入图片描述

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

3. 从库配置
参照主库配置的2.1、2.2步骤进行设置从库,但在设置从库的server-id时请注意ID值不能重复,read-only需设置为1(只读)。

3.1、登录 MySQL,设置主库配置

  • MySQL 8.0.23 及之后版本的语法
CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx', SOURCE_USER='xxx', SOURCE_PASSWORD='xxx', SOURCE_LOG_FILE='xxx', SOURCE_LOG_POS=xxx;
  • MySQL 8.0.23 之前版本的语法
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

3.2、开启同步操作

start replica; #MySQL8.2.22之后执行该命令
start slave; #MySQL8.0.22版本之前执行此命令

3.3、查看主从同步状态

show replica status; #MySQL8.2.22之后执行该命令
show slave status; #MySQL8.0.22版本之前执行此命令

在这里插入图片描述
IO线程与SQL线程显示yes则代表同步状态正常。IO_running是负责将主库中的二进制日志文件读取并写入到从库的中继日志中,SQL_running是负责读取中继日志文件中的SQL语句进行执行,将操作数据反映到本身数据库中。

测试

  1. 在主库上创建数据库、表,并插入数据
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瓶颈。

  • CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会消耗大量的CPU资源,请求书太多,CPU出现瓶颈。
    在这里插入图片描述
    分库分表的核心思想是通过将数据分散存储到多个数据库或数据表中,从而减少单个数据库或单张表的数据量。这种方式旨在缓解单一数据库在数据量过大时面临的性能瓶颈,最终达到提升数据库整体性能的目的。

  • 拆分策略
    在这里插入图片描述

    • 垂直拆分

      • 垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
        特点:
        1、每个库的表结构都不一样
        2、每个库的数据也不一样
        3、所有库的并集是全量数据
      • 垂直分表:以表字段为依据,根据字段属性将不同字段拆分到不同表中。
        特点:
        1、每个表的结构都不一样
        2、每个表的数据也不一样,一般通过一列(组件/外键)关联。
        3、所有表的并集是全量数据。
    • 水平拆分

      • 水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。
        特点:
        1、每个库的表结构都一样。
        2、每个库的数据都不一样。
        3、所有库的并集是全量数据。
      • 水平分表:以字段为依据,按照一定策略,将一个表的数据拆分到多个表中。
        特点:
        1、每个表的结构都一样。
        2、每个表的数据都不一样。
        3、所有表的并集是全量数据。
  • 实现技术

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

    • MyCat:数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。
      在这里插入图片描述

2、Mycat概述

Mycat是阿里巴巴旗下的开源的、活跃的、基于JAVA语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用mycat,对于开发人员来说根本感觉不到mycat的存在。
mycat下载地址:http://dl.mycat.io
mycat支持Windows和Linux运行环境,下面介绍在Linux中的搭建,需准备如下软件:MySQL、JDK、Mycat
mycat结构分为逻辑结构与物理结构,mycat是不存储数据的,只涉及逻辑上的分片以及其他的一些聚合操作,实际存储数据的还是在节点主机上,其结构如下图所示:
在这里插入图片描述

2.1、mysql下载&安装

首先确认你的系统架构:uname -m,根据架构去下载并安装,可以参照现网中(原文作者:多加点辣也没关系)Linux-安装MySQL(详细教程)

2.2、jdk下载&安装
# 2.2.1解压
tar -zxvf jdk-26_linux-aarch64_bin.tar.gz -C /usr/local/

2.2.2.修改/etc/profile配置文件:

vim /etc/profile

2.2.3.在文件末尾添加环境变量

JAVA_HOME
JAVA_HOME=/usr/local/jdk-26.0.1
PATH=$PATH:$JAVA_HOME/bin

2.2.4. 保存并退出profile文件后执行

source profile;

2.2.5 测试验证

java -version

出现版本信息即为安装成功

2.3、mycat下载&安装
  • 下载
wget https://github.com/MyCATApache/Mycat-Server/releases/download/1.6.7.6/Mycat-server-1.6.7.6-release-20230728145607-linux.tar.gz
  • 解压到/usr/local/目录下
tar -zxvf Mycat-server-1.6.7.6-release-20210913163959-linux.tar.gz -C /usr/local/ ;
# 切换到 /usr/local/mycat/
cd /usr/local/mycat/

在这里插入图片描述
bin:存放可执行文件,用于启动停止mycat
catlet:多表联查时所涉及到的目录
conf:存放mycat的配置文件
lib:存放mycat的项目依赖包(jar)
logs:存放mycat的日志文件

  • 替换mycat中MySQL的驱动包
    由于mycat的lib中的mysql驱动包版本太低了,需替换为版本高一点儿的jar包,例如 mysql-connector-java-8.0.22.jar
#删掉mycat/lib/中mysql的jar包
rm -rf mysql-connector-java-5.1.35.jar 

重新上传jar包到 lib/ 目录下,如图所示:
在这里插入图片描述
上传完成后文件显示为红色,是代表无权限,我们需要对改文件授权:

chmod 777 mysql-connector-java-8.0.22.jar

3、Mycat入门

  • 3.1、分片配置(schema.xml)

切换到/usr/local/mycat/conf/,schema.xml内容结构如图:
在这里插入图片描述

  • 对schema.xml的内容进行编辑:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<!-- name替换为实际的数据库名 -->
	<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
		<!-- name替换为实际的数据表名 -->
		<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>
		<!-- URL替换为实际的数据库服务器IP地址 ,user&password替换为实际的链接数据库的账号与密码-->
		<writeHost host="hostS1" url="jdbc:mysql://10.211.55.8:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root"
				   password="123456" />
	</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="hostS1" url="jdbc:mysql://10.211.55.10:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root"
				   password="123456" />
	</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="hostS1" url="jdbc:mysql://10.211.55.11:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root"
				   password="123456" />
	</dataHost>
</mycat:schema>
  • 配置mycat的用户及用户的权限信息server.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:

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

mycat启动之后,占用端口号8066。
检查mycat是否启动成功,可通过查看/usr/local/mycat/logs/中的wrapper日志进行确定 tail -f wrapper.log,如出现 MyCAT Server startup successfully 字样,则说明成功,如图所示:
在这里插入图片描述

  • 3.3、 分片测试

通过如下指令,就可以链接并登陆mycat.

mysql -h [mycat服务所在的IP] -p 8066 -uroot -p123456

然后就可以在 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(1000000,'goods1000000 ');
INSERT INTO TB_ORDER(id,title) VALUES(10000000,'goods10000000');

4、Mycat配置

4.1、 schema.xml

schema.xml 作为 MyCat 中最重要的配置文件之一,涵盖了 MyCat 的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。
主要包含以下三组标签:
➤ schema 标签
在这里插入图片描述

  • schema 标签(schema)
    用于定义 MyCat 实例中的逻辑库,一个 MyCat 实例中,可以有多个逻辑库,可以通过 schema 标签来划分不同的逻辑库。MyCat 中的逻辑库的概念,等同于 MySQL 中的 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
4.2、 rule.xml

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

4.3、 server.xml

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

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

5、Mycat分片

5.1、 垂直拆分(库)

在mycat配置中介绍的是水平分表案例,那么接下来介绍一下垂直拆分,同样的需要配置mycat的schema.xml文件,逻辑库:SHOPPING,案例配置如图所示:
在这里插入图片描述

5.2、 水平拆分(表)

在这里插入图片描述

5.3、 分片规则
  • 范围
    根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。
    在这里插入图片描述
    分片规则的实现逻辑如下图所示:
    在这里插入图片描述

  • 取模
    根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片。
    在这里插入图片描述
    实现逻辑如下图所示:
    在这里插入图片描述
    范围与取模仅适用于主键是数字类型的,对于非数字值的字段则可以采用字段hash值的方式进行分片。

  • 一致性hash
    所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。
    在这里插入图片描述
    实现逻辑如下图所示:
    在这里插入图片描述

  • 枚举
    通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。rule=“sharding-by-intfile-enumstatus”
    在这里插入图片描述

  • 应用指定
    运行阶段由应用自主决定路由到那个分片,直接根据字符串子串(必须是数字)计算分片号。
    在这里插入图片描述

  • 字符串hash解析
    截取字符串中的指定位置的子字符串,进行hash算法,算出分片。
    在这里插入图片描述

  • 按(天)日期分片
    在这里插入图片描述

  • 按自然月分片
    使用场景为按照月份来分片,每个自然月为一个分片。
    在这里插入图片描述

6、Mycat管理及监控

  • mycat原理
    在这里插入图片描述
  • mycat管理
    mycat默认开通开通2个端口,可以在Server.xml中进行修改。

8066数据访问端口,即进行DML和DDL操作。
9066数据库管理端口,即mycat服务管理控制功能,用于管理mycat的整个集群状态。

连接mycat的数据库管理命令:

mysql -h [mycat服务器IP] -P 9066 -uroot -p123456

常用的管理命令如下:

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

四、读写分离

简单来说就是把对数据库的读与写的操作分开,以应对不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效的减轻单台数据库的压力。通过MyCat即可轻易实现上述功能,不仅可以支持MySQL,也可以支持oracle和SQL Server。
在这里插入图片描述

1、 一主一从读写分离

  • 配置
    mycat控制后数据库的读写分离和负载均衡由shema.xml文件datahost标签的balance属性控制。
    在这里插入图片描述
    balance:负载均衡策略,目前取值有4种
参数值 含义
0 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
1 全部的readHost与备用的writeHost都参与select语句的负载均衡(主要针对双主双从模式)
2 所有的读写操作都随机在writeHost,readHost上分发
3 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力

2、 双主双从

一个主机master1用于处理所有的写请求,它的从机slave1和宁一台主机master2还有它的从机slave2负责所有的读请求。当master1主机宕机后,master2主机负责写请求,master1、master2互为备机。架构图如下:

在这里插入图片描述

  • 搭建
  1. 主库配置

m1与m2主机上修改配置文件/etc/my.cnf,m2的server-id设置为3,其余设置保持一致。

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

在这里插入图片描述

  1. 重启MySQL服务器
systemctl restart mysqld

两台主库的创建账户并授权,以及查看主库的二进制日志坐标的指令都与前面配置的一主一从的一致(主库创建账户并授权

3.从库配置
同样需要修改/etc/mycnf文件,不过只需要在文件中添加一行:server-id=从库编号,修改完成后同样需要进行重启mysqld服务。

4.主从关联配置

5.两台主库相互复制
master1复制master2,master2复制master1。配置操作与主从关联配置一致。

3、 双主双从读写分离

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: 自动切换
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐