linux下搭建MySQL8.0.25一主一从

news/2024/9/19 23:20:02/ 标签: linux, mysql

一、主从复制概述

1.1、概述

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

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

image-20240819221120685

1.2、原理

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

image-20240819221812952

复制三步骤

步骤1: Master 将写操作记录到二进制日志( binlog )。

步骤2: Slave 将 Master 的binary log events拷贝到它的中继日志( relay log );

步骤3: Slave 重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的,而且重启后从 接入点 开始复制。

搭建主从复制的作用:

第1个作用:读写分离。

第2个作用就是数据备份。

第3个作用是具有高可用性。

复制的问题

复制的最大问题: 延时

1.3、二进制日志

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

作用:①. 灾难时的数据恢复;②. MySQL的主从复制。在MySQL8版本中,默认二进制日志是开启着的,涉及到的参数如下:

show variables like '%log_bin%';

image-20240819222217281

1.4、中继日志(relay log)

中继日志只在主从服务器架构的从服务器上存在。从服务器为了与主服务器保持一致,要从主服务器读取二进制日志的内容,并且把读取到的信息写入本地的日志文件中,这个从服务器本地的日志文件就叫中继日志。然后,从服务器读取中继日志,并根据中继日志的内容对从服务器的数据进行更新,完成主从服务器的数据同步。

搭建好主从服务器之后,中继日志默认会保存在从服务器的数据目录下。文件名的格式是: 从服务器名 -relay-bin.序号。中继日志还有一个索引文件: 从服务器名 -relaybin.index ,用来定位当前正在使用的中继日志。

1.5、关于MySQL中的日志

我们来看看官网:

https://dev.mysql.com/doc/refman/8.0/en/server-logs.html

image-20240819223258326

MySQL有不同类型的日志文件,用来存储不同类型的日志,分为二进制日志、错误日志、通用查询日志和慢查询日志,这也是常用的4种。MySQL 8又新增两种支持的日志: 中继日志和数据定义语句日志。使用这些日志文件,可以查看MySQL内部发生的事情。这6类日志分别为:

  1. 慢查询日志:记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。
  2. 通用查询日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对我们复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。
  3. 错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的状态,从而对服务器进行维护。
  4. 二进制日志:记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复。
  5. 中继日志:用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。
  6. 数据定义语句日志:记录数据定义语句执行的元数据操作。

除二进制日志外,其他日志都是文本文件。默认情况下,所有日志创建于MySQL数据目录中。

二、一主一从架构

2.1、环境准备

两台已经已经安装好MySQL:8.0.25的Linux服务器。注意,我们为了避免不必要的一些麻烦,请将主从服务器数据库的版本保持一致

image-20240819183133630

image-20240819183139610

修改UUID,不然在某一一些的场景下会报错:

vim /var/lib/mysql/auto.cnf

image-20240819184134255

image-20240819184206040

systemctl restart mysqld

image-20240819184452311

两台服务器都已经关闭掉了防火墙:

systemctl status firewalld.service

image-20240819183424147

image-20240819183436382

2.2、主机的配置文件

vim /etc/my.cnf

image-20240819185337963

主从所有配置项都配置在 [mysqld] 节点下,且都是小写字母。具体参数配置如下:

#[必须]主服务器唯一ID
server-id=1
#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
log-bin=master-bin

image-20240819185500521

image-20240819185543073

2.3、从机配置文件

vim /etc/my.cnf
server-id=2

image-20240819190907545

2.4、重启主从服务器

systemctl restart mysqld

image-20240819191059432

image-20240819191105644

2.5、主机:建立账户并授权

CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

image-20240819191434819

查询Master的状态,并记录下File和Position的值。

show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1139 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

image-20240819191509855

注意:执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化。

2.6、从机:配置需要复制的主机

步骤1:从机上复制主机的命令

CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;
CHANGE MASTER TO
MASTER_HOST='192.168.200.129',
MASTER_USER='slave1',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=1139;
CHANGE MASTER TO MASTER_HOST='192.168.200.129', MASTER_USER='slave1', MASTER_PASSWORD='123456', MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=1139;

image-20240819192301168

步骤2:启动slave同步

START SLAVE;

image-20240819192438908

查看同步状态:

SHOW SLAVE STATUS\G;

image-20240819194144289

上面两个参数都是Yes,则说明主从配置成功!

2.7、测试

主机新建库、新建表、insert记录,从机复制:

CREATE DATABASE master_slave;
use master_slave;
CREATE TABLE mytbl(id INT,NAME VARCHAR(16));
INSERT INTO mytbl VALUES(1, 'zhang3');
INSERT INTO mytbl VALUES(2,'lisi');

从机测试:

use master_slave;
select * from mytbl;

image-20240819195132557

三、读写分离

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

在主从架构的配置中,如果想要采取读写分离的策略,我们可以 自己编写程序 ,也可以通过 第三方的中间件

来实现。

  • 自己编写程序的好处就在于比较自主,我们可以自己判断哪些查询在从库上来执行,针对实时性要求高的需求,我们还可以考虑哪些查询可以在主库上执行。同时,程序直接连接数据库,减少了中间件层,相当于减少了性能损耗。

  • 采用中间件的方法有很明显的优势, 功能强大 , 使用简单 。但因为在客户端和数据库之间增加了中间件层会有一些 性能损耗 ,同时商业中间件也是有使用成本的。我们也可以考虑采取一些优秀的开源工具。

四、实现一主一从读写分离

CREATE TABLE `t_user` (`user_id` int NOT NULL COMMENT '用户id',`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户名称',PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

创建实体类:

package cn.rwdemo.entity;import lombok.Data;@Data
public class UserEntity {private Integer userId;private String userName;}

创建Mapper类:

package cn.rwdemo.mapper;import cn.rwdemo.entity.UserEntity;
import org.apache.ibatis.annotations.*;@Mapper
public interface UserMapper {@Insert("insert into t_user(user_id,user_name) values(#{userId},#{userName})")void insertUserInfo(UserEntity userEntity);@Select("select * from t_user where user_id=#{userId}")@Results({@Result(property = "userId", column = "user_id"),@Result(property = "userName", column = "user_name")})UserEntity getUserInfo(Integer userId);}

创建配置文件:

spring:application:name: rw_demoshardingsphere:datasource:master:driver-class-name: com.mysql.cj.jdbc.Driverpassword: 123456@roottype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://192.168.200.129:3306/master_slave?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=falseusername: rootnames: master,slaveslave:driver-class-name: com.mysql.cj.jdbc.Driverpassword: 123456@roottype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://192.168.200.130:3306/master_slave?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=falseusername: rootmasterslave:master-data-source-name: mastername: msslave-data-source-names: slaveprops:sql:show: true

测试:

package cn.rwdemo;import cn.rwdemo.entity.UserEntity;
import cn.rwdemo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;@SpringBootTest
public class UserTests {@Resourceprivate UserMapper userMapper;@Testpublic void insertUserInfo() {for (int i = 1; i <= 10; i++) {UserEntity userEntity = new UserEntity();userEntity.setUserId(i);userEntity.setUserName("user" + i);userMapper.insertUserInfo(userEntity);}}@Testpublic void getUserInfo() {System.out.println(userMapper.getUserInfo(1));}
}

image-20240819220409796

五、开发环境说明

VM虚拟机:

image-20240819134329080

 cat /etc/redhat-release

image-20240819134447365

cat /proc/version

image-20240819134546245

查看防火墙状态:

systemctl status firewalld.service

image-20240819134745185

关闭命令:

systemctl stop firewalld.service

开机禁用防火墙自启命令 :

systemctl disable firewalld.service

是否有mysql残留

rpm -qa | grep -i mysql 
systemctl status mysqld.service

image-20240821084635013

代码:

https://github.com/shixiaochuangjob/markdownfile/tree/main/20240821

image-20240821085040387


http://www.ppmy.cn/news/1514345.html

相关文章

AI大模型开发——7.百度千帆大模型调用

本节旨在为读者提供一个实用指南&#xff0c;探讨如何有效地利用百度千帆大模型平台的强大功能。从基础的账号注册和密钥申请入手&#xff0c;逐步引领用户通过案例&#xff0c; 理解并掌握如何调用文本和图像处理的大模型 API&#xff0c; 包括但不限于 NLP、对话生成、文本续…

windows bash获取一个目录下所有的文件

在Windows系统中&#xff0c;我们可以使用命令行工具来获取文件夹下的所有文件名。具体操作如下&#xff1a; 1. 打开命令提示符&#xff08;WinR&#xff0c;输入cmd&#xff0c;回车&#xff09;&#xff1b; 2. 进入需要提取文件名的文件夹&#xff08;使用cd命令&#xf…

sqlilabs less16-20关手工注入

第16关 一.判断闭合方式 闭合方式点“&#xff09; admin")and11# 二.判断数据库长度 admin") and if(length(database())>7, 0, sleep(5))# 页面无延迟 admin") and if(length(database())>8, 0, sleep(5))# 页面有延迟说明数据库长度为8 三.判断数…

spark全面个人总结(20个面试点)非网文

1. 请简述Spark的工作原理和架构&#xff1f; 基于RDD&#xff0c;一种数据结构&#xff0c;含数据项、处理函数、血缘。spark解析任务&#xff0c;生成rdd&#xff0c;并将系列rdd转换成一系列物理计划&#xff0c;然后发送到集群上的各个节点执行。spark负责管理这些任务&a…

UV LED供电为什么要选择使用恒流驱动电源

LED为何一定要恒流供电? 在讨论此议题之前&#xff0c;什么是电源的恒流恒压&#xff1f; 什么是电源的恒流恒压   恒流&#xff0c;就是输出电流是恒定的&#xff0c;但电源电流却不是固定的&#xff0c;标称的电压只是安全上限&#xff1b;恒压&#xff0c;就是输出电压是…

Mysql varchar的最大值到底有多少

MySQL中varchar类型的最大值受到多个因素的影响&#xff0c;包括MySQL的版本、字符集以及行的其他字段配置。以下是对varchar最大值的一个详细解析&#xff1a; 1. MySQL版本差异 MySQL 4.1及以前版本&#xff1a;varchar的最大长度限制为255字节。MySQL 5.0及以后版本&#…

Ps:首选项 - 图像处理

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“图像处理” Image Processing选项卡让用户可以根据当前工作任务的需要&#xff0c;在处理速度和结果的精细度之间找到平衡。这些设置可以帮助优化 Photoshop 的处理性能&…

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(2)

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(2) 简介 实验 2&#xff1a;在单片机搭建好 tcp 服务器后&#xff0c;编写传送文件的上位机。 整体实现 - 利用qt的tcpsocket简单封装 - 每次发送512字节&#xff0c;这样小的tcp包就不会自动分包。保证每一个51…

无人驾驶,并非无人之地

图片&#xff5c;Photo by 萝卜快跑 ©自象限原创 作者丨罗辑 老司机又双叒叕被“抢”了&#xff1f; 随着武汉无人驾驶的Robotaxi在各社交媒体平台出圈&#xff0c;自动驾驶安全员的职业从幕后走向台前&#xff0c;近期&#xff0c;招聘平台信息也显示&#xff0c;萝卜…

React Native中好用的UI组件库

文章目录 前言1.React Native ElementsStar数超24K地址 2.React Native UI KittenStar数超20K地址 3.NativeBaseStar数超20K地址 前言 下面是React Native中一些常用的UI库 1.React Native Elements Star数超24K 官方介绍 React Native Elements 的目标是提供一套用于在 Rea…

wpf DataTemplate 和 ControlTemplate 区别,应用举例

在WPF中&#xff0c;模版&#xff08;ControlTemplate &#xff09; ControlTemplate用于定义控件的内部结构和外观&#xff0c;它决定了控件的“长成什么样子”&#xff0c;并允许开发者在控件原有的内部逻辑基础上扩展自己的逻辑。DataTemplate则专注于数据内容的展示方式&am…

Parallels Desktop 19 for Mac 安装虚拟机需要激活吗

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

【Docker】gitea的ssh容器直通

本文首发于 ❄️慕雪的寒舍 1.跟着文档走 gitea的安装比较简单&#xff0c;直接使用官方文档中的docker-compose文件即可。如果想实现ssh容器直通&#xff0c;需要对这个docker-compose文件做一定修改。 如果你还没有安装docker&#xff0c;参考本站教程 linux安装docker&…

手机麻将APP开发违法吗,有哪些注意的地方呢?

在我的职业生涯中&#xff0c;我处理过许多因开发或运营手机游戏而遭遇法律处罚的案例。游戏作为一种传统的娱乐形式&#xff0c;在中国拥有广泛的受众。然而&#xff0c;随着智能手机的普及&#xff0c;手机游戏的开发和运营逐渐成为热门领域&#xff0c;但其中也存在不少法律…

c++链表(list)

前言 链表作为一个常见的数据结构&#xff0c;在高频插入删除的场景下有独特的优势&#xff0c;在内存的使用上也极少有浪费可以按需申请。今天我们就来简单的学习一下这种数据结构&#xff0c;链表也有很多不同的实现&#xff0c;我们这里和标准库保持一致&#xff0c;实现带…

docker手动部署django项目Dockerfile编排-后端发布

1、首先创建一个桥接网络 docker network create auto 2、部署redis,提供celery的消息队列服务 docker run --name redis --restartalways -d --network auto -v redis:/data redis:alpine3、部署数据库 注意数据库账号密码 docker run --name mariadb --restartalways -d…

远程消息传递的艺术:NSDistantObject在Objective-C中的妙用

标题&#xff1a;远程消息传递的艺术&#xff1a;NSDistantObject在Objective-C中的妙用 引言 在Objective-C的丰富生态中&#xff0c;NSDistantObject扮演着至关重要的角色&#xff0c;特别是在处理分布式系统中的远程消息传递。它允许对象之间跨越不同地址空间进行通信&…

基于矢量控制器的PMSM永磁同步电机速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于矢量控制器的PMSM永磁同步电机速度控制系统simulink建模与仿真&#xff0c;仿真输出电机转速跟踪曲线&#xff0c;PID控制器输出曲线以及Te输出曲线。 2.系统仿真结果 &…

通过访存地址获取主存数据的过程

目录 1.根据访存地址在Cache中查找数据 2.如果在Cache中命中 3.如果没有命中 4.数据送CPU 5.做几道题&#xff1a; 主要厘清思路&#xff0c;中间细节需自行补充! 1.根据访存地址在Cache中查找数据 ① 访存地址的结构会根据Cache和主存之间的映射方式不同而改变。映射方式…

【C++ 面试 - 面向对象】每日 3 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…