mysql主从架构

mysql主从架构是一套非常基础的高可用架构,主要依赖复制技术来实现。

1.复制原理

mysql复制功能主要使用三个线程实现:

1.Binary log dump thread(二进制日志转储线程):当副本连接时发送二进制日志

2.Replication I/O receiver thread(复制 I/O 接收器线程): I/O(接收器)线程,连接到源服务器要求它发送其二进制日志中记录的更新,复制源服务器发送的二进制日志保存到中继日志(relay log)

3.Replication SQL applier thread (复制 SQL 应用程序线程):复制中继日志并执行其中包含的记录

 

  1. 主库执行DDL、DML更新binlog
  2. 二进制日志转储线程检测到binlog更新主动发送binlog给从库
  3. 从库I/O线程接收到binlog后写入到relaylog中
  4. 从库SQL线程检测到relaylog更新,复制relaylog到SQL线程并执行SQL。 

 

2.配置主从

1.主库建立唯一的服务器 ID 

mysql> SET GLOBAL server_id = 2; 

持久化修改:

在/etc/my.cnf添加server-id = 2

 

查看server_id变量 

mysql> show global variables like 'server_id'; 

2.主库开启二进制日志

查看二进制日志是否开启

mysql> SHOW VARIABLES LIKE 'log_bin';

除了使用mysqld命令启动mysql二进制日志是默认不开启的,其他情况都是二进制日志默认是开启的

如果不开启,需要修改/etc/my.cnf配置文件

在[mysqld]添加

log_bin=ON

重启mysql 

3.创建复制用户

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123456';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

查看用户

mysql> select Host,User from mysql.user; 

4.获取主库二进制日志坐标 

先锁表,阻止InnoDB进行Commit操作,待副本复制好后可以释放锁,保证主库和从库的数据一致性(会话退出也会自动释放锁)

 mysql> FLUSH TABLES WITH READ LOCK;

确定当前二进制日志文件名和位置 

 mysql> SHOW MASTER STATUS\G

 

5.对主库进行快照

可以选择物理备份、逻辑备份等方法。。。

我这里用的是docker,我直接对主库容器进行镜像,再用这个镜像开启容器作为mysql从库

查看容器

创建镜像

docker commit 10d74d587551 mysql8-slave 

查看镜像

 释放主库的read lock

mysql> UNLOCK TABLES;

 6.启动从库

docker run --name=mysql8-slave10  --restart on-failure -p 3310:3306 -d mysql8-slave:latest

连接上从库服务器

docker exec -it mysql8-slave10 bash 

修改从库的server_id

 SET GLOBAL server_id = 21;

持久化修改:

在/etc/my.cnf添加server-id = 21 

 

从库如果不需要binlog可以关闭该功能,毕竟开启需要消耗资源

如果这个从库是用作备份或者故障恢复等需要用到binlog可以开启binlog

 关闭从库binlog

在/etc/my.cnf添加

[mysqld]
# 关闭二进制日志
skip-log-bin

 7.在从库设置主库复制信息

MySQL 8.0.23之前使用这种格式:

mysql> CHANGE MASTER TO

-> MASTER_HOST='source_host_name',

-> MASTER_USER='replication_user_name',

-> MASTER_PASSWORD='replication_password',

-> MASTER_LOG_FILE='recorded_log_file_name',

-> MASTER_LOG_POS=recorded_log_position;

MySQL 8.0.23之后使用这种格式:

mysql> CHANGE REPLICATION SOURCE TO

-> SOURCE_HOST='source_host_name',

-> SOURCE_USER='replication_user_name',

-> SOURCE_PASSWORD='replication_password',

-> SOURCE_LOG_FILE='recorded_log_file_name',

-> SOURCE_LOG_POS=recorded_log_position

 我连接的是本机的3309端口

CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.0.12.12',SOURCE_USER='repl',SOURCE_PASSWORD='123456',master_port=3309,SOURCE_LOG_FILE='mysql-bin.000001',SOURCE_LOG_POS=1284;

 8.从库启动slave

mysql> start slave;

查看slave状态

mysql> SHOW SLAVE STATUS\G 

我第一次启动发现启动失败

报错:

Last_IO_Error: Error connecting to source 'repl@10.0.12.12:3309'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

意思是连接失败 ,需要caching_sha2_password安全连接

从MySQL 8.0 中, 默认身份验证插件caching_sha2_password

解决办法:

重新设置主库复制信息,加上了主库公钥的位置获取公钥:

CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.0.12.12',SOURCE_USER='repl',SOURCE_PASSWORD='123456',master_port=3309,SOURCE_LOG_FILE='mysql-bin.000001',SOURCE_LOG_POS=1284,Master_public_key_path='/var/lib/mysql/public_key.pem',Get_master_public_key=1;

 

再次启动又出现错误:

 Last_IO_Error: Fatal error: The replica I/O thread stops because source and replica have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

 意思是主库和从库的MySQL服务器UUID相同了

解决办法:

删除从库的UUID,重启从库重新生成UUID

 rm -rf /var/lib/mysql/auto.cnf 

 

 这两个为yes表示启动成功

 

9.测试

主库操作 

mysql> create database mytest;
Query OK, 1 row affected (0.02 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytest             |
| performance_schema |
| sys                |
| test888            |
+--------------------+
6 rows in set (0.03 sec)

从库同步 

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytest             |
| performance_schema |
| sys                |
| test888            |
+--------------------+
6 rows in set (0.00 sec)

3.主从数据一致性

主从架构是对主库DDL、DML操作会同步到从库,但是对从库 DDL、DML操作不会同步到主库,这就会造成主从数据不一致了。

如果从库存在一条在主库没有的数据,那么主库插入相同的数据同步到从库时会报错。 

 怎么解决?

1.跳过错误继续同步

 如果这些不同步数据对业务没有影响可以选择跳过错误

(1)在主库锁表

FLUSH TABLES WITH READ LOCK;

(2) 停掉从库slave

stop slave;

(3)从库设置跳过命令 

set global sql_slave_skip_counter = 1;  # 跳过一次 

(4)从库启动slave 

start slave;

(5)主库释放锁 

 UNLOCK TABLES;

 

2.重做主从架构

重新保持主库一致性

(1)主库锁表

 FLUSH TABLES WITH READ LOCK;

(2)逻辑备份主库 

mysqldump -uroot -p123456 --all-databases -A >> all.sql 

(3)把主库数据全部导入从库中

mysql -uroot -p123456 < all.sql 

(4)主库释放锁 

UNLOCK TABLES;

 

 4.主从延迟

查看是否有延迟

 mysql> show slave status\G

 

Seconds_Behind_Master为0表示没有延迟,数值越高表示延迟越高。 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker与微服务实战——基础篇

Docker与微服务实战——基础篇 第一章 Docker 简介1.1 docker 理念1.2 容器与虚拟机比较 第二章 Docker 安装2.1 前提说明2.2 Docker的基本组成2.2.1 镜像&#xff08;image&#xff09;2.2.2 容器&#xff08;container&#xff09;2.2.3 仓库&#xff08;repository&#xff…

如何使用Node.js快速创建HTTP服务器并实现公网访问本地Server

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

Spark 基础知识点

Spark 基础 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 什么是Spark 什么是Spark 1.1 定义&#xff1a;Apache Spark是用于大规模数据&#xff08;large-scala data&#xff09;处理的统一&#xff08;unified&#xff09;分析引擎 Spark最早源于一篇论文 Re…

51单片机-串口通信

文章目录 前言1.基础介绍2.串口实战3.4. 前言 1.基础介绍 常见1&#xff0c;2&#xff0c;3,电源 常用方式1 fosc外部晶振 2.串口实战 3. 4.

AI:57-基于机器学习的番茄叶部病害图像识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

CSS默认宽度

所谓的默认宽度&#xff0c;就是不设置width属性时&#xff0c;元素所呈现出来的宽度 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}.box {/…

大厂面试题-innoDB如何解决幻读

从三个方面来回答&#xff1a; 1、Mysql的事务隔离级别 Mysql有四种事务隔离级别&#xff0c;这四种隔离级别代表当存在多个事务并发冲突时&#xff0c;可能出现的脏读、不可重复读、幻读的问题。 其中InnoDB在RR的隔离级别下&#xff0c;解决了幻读的问题。 2、什么是幻读&…

重磅!OpenAI发布GPT-4 Turbo,史上最强ChatGPT来了!

11月7日凌晨&#xff0c;OpenAI在美国旧金山举办首届开发者大会&#xff0c;与来自全球的开发者、企业、合作伙伴分享了最新产品。 微软首席执行官Satya Nadella作为特邀嘉宾出席了此次盛会。 会上&#xff0c;OpenAI发布了128K 上下文的GPT-4 Turbo、自定义GPT、DALLE 3 API…

jenkins展示html报告样式需要注意的要点

一、jenkins展示html报告样式需要注意的要点 最后&#xff1a;

【K-means聚类算法】实现鸢尾花聚类

文章目录 前言一、数据集介绍二、使用步骤1.导包1.2加载数据集1.3绘制二维数据分布图1.4实例化K-means类&#xff0c;并且定义训练函数1.5训练1.6可视化展示2.聚类算法2.1.可视化生成3其他聚类算法进行鸢尾花分类 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器…

老电脑升级内存、固态硬盘、重新装机过程记录

基础环境&#xff1a; 电脑型号&#xff1a;联想XiaoXin700-15ISK系统版本&#xff1a;Windows10 家庭中文版 版本22H2内存&#xff1a;硬盘&#xff1a; 升级想法&#xff1a; 内存升级&#xff0c;固态硬盘升级&#xff0c;系统重装&#xff08;干净一点&#xff09; 升级内存…

机器学习笔记:RNN值Teacher Forcing

1 基本介绍 Teacher forcing是一种在训练循环神经网络&#xff08;RNN&#xff09;时使用的技术&#xff0c;尤其是在序列生成任务中&#xff0c;如机器翻译、文本生成或语音合成。这种方法的目的是更有效地训练网络预测下一个输出&#xff0c;给定一系列先前的观察结果。 1.…

11.4-GPT4AllTools版本已开始对小部分GPT3.5用户内测推送

OpenAI已经开始小规模推送GPT4 AllTools功能&#xff0c;部分GPT博主已经第一时间体验了此功能&#xff0c;此功能特色是整合目前的多模态功能以及文件上传和联网模块&#xff0c;无需切换&#xff0c;更要全面综合 可上传包括 PDF、数据文件在内的任意文档&#xff0c;并进行分…

YOLOv8优化:block系列篇 | Neck系列篇 |可重参化EfficientRepBiPAN优化Neck

🚀🚀🚀本文改进: 可重参化EfficientRepBiPAN优化Neck 如何在YOLOv8下使用:1)结合neck; 🚀🚀🚀EfficientRepBiPAN在各个领域都有ying 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.原理…

AI:63-基于Xception模型的服装分类

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

猫头虎分享从Python到JavaScript传参数:多面手的数据传递术

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

qt报错permission denied

写fk项目的时候&#xff0c;报这个错&#xff0c;然后网上查&#xff0c;说的是因为之前运行的qt进程没有关闭&#xff0c;然后我在任务管理器上查看&#xff0c;却没有看见有我正在运行的qt程序&#xff0c;我再出现清除 qmake也不可以&#xff0c;然后我再去删除out目录下的所…

【Linux】vim

文章目录 一、vim是什么&#xff1f;二 、命令模式三、插入模式四、底行模式五、vim配置 一、vim是什么&#xff1f; Vim是一个强大的文本编辑器&#xff0c;它是Vi的增强版&#xff0c;支持多种语法高亮、插件扩展、多模式操作等功能。Vim有三种基本的工作模式&#xff1a;命…

apachesolr启动带调试

这里solr.cmd报错&#xff0c;报错原因是java版本问题&#xff0c;后面发现这是因为多个java版本导致读取java_home失败&#xff0c; 那么我们修改solr.cmd中的JAVA_HOME为SOLR_JAVA_HOME IF DEFINED SOLR_JAVA_HOME set "JAVA_HOME%SOLR_JAVA_HOME%"环境变量将SOLR…

k8s提交spark应用消费kafka数据写入elasticsearch7

一、k8s集群环境 k8s 1.23版本&#xff0c;三个节点&#xff0c;容器运行时使用docker。 spark版本时3.3.3 k8s部署单节点的zookeeper、kafka、elasticsearch7 二、spark源码 https://download.csdn.net/download/TT1024167802/88509398 命令行提交方式 /opt/module/spark…