Day05 03-MySQL主从-主主原理与搭建详解
文章目录
- 第十六章 MySQL的系统架构(主从架构)
- 16.1 MySQL集群架构的介绍
- 16.1.1 主从架构介绍
- 16.1.2 主从复制的原理
- 16.2 MySQL主从复制的实现
- 16.2.1 环境说明
- 16.2.2 主库配置
- 16.2.3 从库配置
- 16.2.4 主从复制测试
- 16.3 MySQL主主复制的实现
- 16.3.1 主主复制介绍
- 16.3.2 主库1配置
- 16.3.3 主库2配置
- 16.3.4 设置同步
第十六章 MySQL的系统架构(主从架构)
16.1 MySQL集群架构的介绍
我们在前面使用到MySQL数据库的时候,只是一个单机的数据库服务。在实际的生产环境中,数据量可能会非常庞大,这样单机服务的MySQL在使用的时候,性能会受到影响影响。并且单机服务的MySQL的数据安全性也会受到影响。因此在生产环境中,我们通常搭建MySQL的集群架构,来提高庞大数据量的基础上的高性能读写的需求。
在常见的集群架构中,最常见的就是主从架构(Master-Slaves)
16.1.1 主从架构介绍
MySQL的主从架构,又有一些其他的名称:主从模式、主从复制等。所谓的主从架构指的是建立多个完全一样的数据库,其中一个数据库作为主库(主要是用的数据库),其他的作为从库(次要的数据库)。主从架构分为很多种:一主一从、双主架构、一主多从、多主多从等模式。通常主库可读可写,从库只读。
MySQL最常见也是最简单的主从架构的实现就是**主从复制(MySQL Replication)**模式,这也是MySQL自带的功能,无需借助第三方的工具,就可以实现一个主从架构的集群模式。
主从架构相比较于单机服务的MySQL来说,优势有很多,最常见的优势就是:写操作连接主库,读操作连接从库,实现读写分离。
16.1.2 主从复制的原理
主从复制是通过重演binlog来实现主库数据的异步复制。即在主库上打开binlog记录每一次的数据库操作,然后从库会有一个IO线程,负责跟主库建立TCP连接,请求主库将binlog传输到从库。此时主库上会有一个Log Dump线程,负责通过这个TCP连接吧binlog日志传输给从库的IO线程。接着从库的IO线程会把读取到的binlog日志数据写入自己的中继日志文件(Relay)中。然后从库上另外一个SQL线程会读取中继日志文件中的操作,进行操作重演,达到还原数据的目的。

- 主库的数据发生了变更,将日志写入到主库的binlog中。
- 主库的LogDump线程,将binlog文件传输到从库的IO线程。
- 从库的IO线程将接收到的binlog写入到relay log中。
- 从库的SQL线程读取relay log中的日志,并操作重演,将结果同步到从库中。
16.2 MySQL主从复制的实现
16.2.1 环境说明
要实现MySQL的主从架构的搭建,需要满足以下条件:
- 所有节点的MySQL版本必须一致。
- 所有节点的时间必须同步。
- 所有节点需要启动binlog服务。
16.2.2 主库配置
我们需要编辑MySQL配置文件,这个配置文件在不同的操作系统中的位置和名字都不同,需要根据自己的操作系统来查找这个文件:
- Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
- Linux: /etc/my.cnf
- macOS:
- dmg安装: /etc/my.cnf
- homebrew安装:
- Intel CPU: /usr/local/homebrew/etc/my.cnf
- AppleSilicon CPU: /opt/homebrew/etc/my.cnf
# 在[mysqld]的下方添加或修改如下属性:
# 服务节点的唯一标识,需要给集群中的每个服务分配一个单独的ID
server-id=101
# 打开binlog日志,并指定文件名
log_bin=master-bin
# binlog日志文件
log_bin-index=master-bin.index
修改完成之后,需要重启MySQL服务。
为root用户分配replication slave的权限:
# 登录到主库
mysql -uroot -p# 为root用户分配权限
# MySQL8中,需要先添加 'root'@'%' 这个用户
# create user 'root'@'%' identified by '123456'
mysql> grant replication slave on *.* to 'root'@'%';
mysql> flush privileges;
# 查看主节点同步状态
mysql> show master status;
# +-------------------+----------+--------------+------------------+-------------------+
# | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
# +-------------------+----------+--------------+------------------+-------------------+
# | master-bin.000001 | 543 | | | |
# +-------------------+----------+--------------+------------------+-------------------+
# 1 row in set (0.00 sec)
在上述输出结果中:
File: 当前日志文件
Position: 日志文件中的索引
Binlog_Do_DB: 需要记录binlog日志的库,不设置表示全部的库
Binlog_Ignore_DB: 不需要记录binlog日志的库
16.2.3 从库配置
我们需要编辑MySQL配置文件,这个配置文件在不同的操作系统中的位置和名字都不同,需要根据自己的操作系统来查找这个文件:
- Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
- Linux: /etc/my.cnf
- macOS:
- dmg安装: /etc/my.cnf
- homebrew安装:
- Intel CPU: /usr/local/homebrew/etc/my.cnf
- AppleSilicon CPU: /opt/homebrew/etc/my.cnf
# 在[mysqld]的下方添加或修改如下属性:
# 服务节点的唯一标识,需要给集群中的每个服务分配一个单独的ID
# 一定要注意,不能和其他节点重复
server-id=102
# 打开binlog日志,并指定文件名
log_bin=slave-bin
# 打开relaylog日志
relay_log=slave-relay-bin
relay_log-index=slave-relay-bin.index
skip-slave-start
修改完成之后,需要重启MySQL服务。
然后登录到其他从库,设置从主库同步状态:
# 登录从库
mysql -uroot -p
# 设置同步主节点
change master to
master_host='192.168.10.101', # 设置主库的地址
master_port=3306, # 设置主库使用的端口号
master_user='root', # 设置主库的用户名
master_password='123456', # 设置主库的密码
master_log_file='master-bin.000001', # 设置主库正在使用的binlog文件,可以在主库使用 show master status 查询
master_log_pos=543; # 设置从什么位置同步
# 开启slave
start slave;
# 查看主从同步状态
show slave status;
# 也可以使用 show slave status \G
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.10.101Master_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: master-bin.000001Read_Master_Log_Pos: 916Relay_Log_File: slave-relay-bin.000002Relay_Log_Pos: 1133Relay_Master_Log_File: master-bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes
正常的结果是如上所示的结果,但是总有意外的时候:
有些同学可能会出现 Slave_IO_Running: Connecting 的状态,甚至是NO的状态,说明从库的IO线程启动失败。原因如下:
可能是主库设置错误,检查 master_host 和 master_port 的设置是否正确
可能是主库的用户名和密码错误,检查 master_user 和 master_password 是否正确
可能是主库防火墙未关闭,检查防火墙
可能是主库不能远程登录,检查主库用户的远程登录权限
可能是 master_log_file 文件设置出问题
可能是虚拟机克隆,导致的两个节点的uuid相同
检查 /var/lib/mysql/auto.cnf 中记录的uuid,如果相同的话,随便修改一个,重启服务即可
上述几种错误情况在修改之后,都是需要重新启动slave服务的。先使用 stop slave 停止服务;再使用 start slave 开启
有些同学可能会出现 Slave_SQL_Running: No 的状态,说明从库的SQL线程启动失败,一般是因为执行主库同步过来的数据的时候失败了,例如需要创建的数据库、表已经存在导致。
解决方案:
- 删除从库中同名的库、表,从主库的日志中恢复数据。
- 如果想要保留从库中的库、表,先停止slave服务,设置 set global sql_slave_skip_counter = 1; 来设置需要跳过的错误的个数。1是可以修改的,想要跳过几个错误,就设置为多少。然后启动slave服务即可。
16.2.4 主从复制测试
我们在主库中创建数据库、创建表,可以在从库中看到有数据同步过来了。而且在从库中使用 show slave status \G 来查看从库的状态的时候,会发现记录的Pos位置已经更新。
16.3 MySQL主主复制的实现
16.3.1 主主复制介绍
MySQL的主从复制架构下,可以实现读写分离、业务分流,来降低单个数据库的压力。但是这种模式下会存在单点故障的问题,即如果主库节点宕机的情况下,对从库进行的操作并不会同步到主库中。这个数据库也就无效了。因此有的时候我们会搭建主主复制的架构,也叫做双主架构。
双主架构的实现,是在主从架构的基础之上的。将两台MySQL之间互为彼此的主库,同时又互为对方的从库。这样的实施方案下,既能做到分流,也能解决单点故障的问题。因为任何的一台节点故障,另外的一台都可以继续提供服务。
16.3.2 主库1配置
我们需要编辑MySQL配置文件,这个配置文件在不同的操作系统中的位置和名字都不同,需要根据自己的操作系统来查找这个文件:
- Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
- Linux: /etc/my.cnf
- macOS:
- dmg安装: /etc/my.cnf
- homebrew安装:
- Intel CPU: /usr/local/homebrew/etc/my.cnf
- AppleSilicon CPU: /opt/homebrew/etc/my.cnf
# 在[mysqld]的下方添加或修改如下属性:
# 服务节点的唯一标识,需要给集群中的每个服务分配一个单独的ID
server-id=101
# 打开binlog日志,并指定文件名
log_bin=master-101-bin
# binlog日志文件
log_bin-index=master-101-bin.index
# 打开relaylog日志
relay_log=master-101-relay-bin
relay_log-index=master-101-relay-bin.index
skip-slave-start
# 防止两个主库中同时操作自增的字段导致字段冲突
auto_increment_increment=2 # 自增步长,一般有几个MySQL就设置为几
auto_increment_offset=1 # 自增起始值
修改完成之后,需要重启MySQL服务。
为root用户分配replication slave的权限:
# 登录到主库
mysql -uroot -p# 为root用户分配权限
# MySQL8中,需要先添加 'root'@'%' 这个用户
# create user 'root'@'%' identified by '123456'
mysql> grant replication slave on *.* to 'root'@'%';
mysql> flush privileges;
16.3.3 主库2配置
我们需要编辑MySQL配置文件,这个配置文件在不同的操作系统中的位置和名字都不同,需要根据自己的操作系统来查找这个文件:
- Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
- Linux: /etc/my.cnf
- macOS:
- dmg安装: /etc/my.cnf
- homebrew安装:
- Intel CPU: /usr/local/homebrew/etc/my.cnf
- AppleSilicon CPU: /opt/homebrew/etc/my.cnf
# 在[mysqld]的下方添加或修改如下属性:
# 服务节点的唯一标识,需要给集群中的每个服务分配一个单独的ID
server-id=102
# 打开binlog日志,并指定文件名
log_bin=master-102-bin
# binlog日志文件
log_bin-index=master-102-bin.index
# 打开relaylog日志
relay_log=master-102-relay-bin
relay_log-index=master-102-relay-bin.index
skip-slave-start
# 防止两个主库中同时操作自增的字段导致字段冲突
auto_increment_increment=2 # 自增步长,一般有几个MySQL就设置为几
auto_increment_offset=2 # 自增起始值
修改完成之后,需要重启MySQL服务。
为root用户分配replication slave的权限:
# 登录到主库
mysql -uroot -p# 为root用户分配权限
# MySQL8中,需要先添加 'root'@'%' 这个用户
# create user 'root'@'%' identified by '123456'
mysql> grant replication slave on *.* to 'root'@'%';
mysql> flush privileges;
16.3.4 设置同步
-
查看master1的binlog
+-----------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------------+----------+--------------+------------------+-------------------+ | master-101-bin.000001 | 156 | | | | +-----------------------+----------+--------------+------------------+-------------------+ -
设置master2同步master1
# 登录从库 mysql -uroot -p # 设置同步主节点 change master to master_host='192.168.10.101', master_port=3306, master_user='root', master_password='123456', master_log_file='master-101-bin.000001', master_log_pos=156; -
查看master2的binlog
+-----------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------------+----------+--------------+------------------+-------------------+ | master-102-bin.000001 | 553 | | | | +-----------------------+----------+--------------+------------------+-------------------+ -
设置master1同步master2
# 登录从库 mysql -uroot -p # 设置同步主节点 change master to master_host='192.168.10.102', master_port=3306, master_user='root', master_password='123456', master_log_file='master-102-bin.000001', master_log_pos=553; -
开启同步
# 分别启动两个数据库的slave start slave# 如果出现错误:Slave failed to initialize relay log info structure from the repository # 说明之前存在主从模式下的relay log,使用reset slave命令清除即可
参考链接:https://blog.csdn.net/u010839779/article/details/128012245?spm=1001.2014.3001.5501
相关文章:
Day05 03-MySQL主从-主主原理与搭建详解
文章目录 第十六章 MySQL的系统架构(主从架构)16.1 MySQL集群架构的介绍16.1.1 主从架构介绍16.1.2 主从复制的原理 16.2 MySQL主从复制的实现16.2.1 环境说明16.2.2 主库配置16.2.3 从库配置16.2.4 主从复制测试 16.3 MySQL主主复制的实现16.3.1 主主复…...
STL之vector
目录 vector模拟实现一. vector的基本框架二. 常用方法及实现1.初始化和清理a. 默认构造函数b. 析构函数 2. 迭代器a. beginb. end 3.数据访问a. sizeb. capacityc. operator[]d. frontc. back 4.增删查改操作a. reserveb. resizec. insertd. push_backe. erasef. pop_back 5.构…...
2020年CSP-J认证 CCF非专业级别软件能力认证第一轮真题-单项选择题解析
2020 CCF认证第一轮(CSP-J)真题 一、单项选择题 (共15题,每2分,共30分;每题有且有一个正确选项) 1、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 答案:C…...
vscode Delete `␍⏎·····`
在公司拉取代码报错 Delete ␍⏎,首先问题的关键是换行导致,相信你看别的博客也知道为什么了,但是我使用别的博客的解决办法,没搞定,无论是配置 auto 还是命令行执行,都不行 下面介绍我的解决办法 我使用…...
读书笔记-《ON JAVA 中文版》-摘要16[第十六章 代码校验]
文章目录 第十六章 代码校验1. 测试1.1 单元测试1.2 JUnit1.3 测试覆盖率的幻觉 2. 前置条件2.1 断言(Assertions)2.2 Java 断言语法2.3 Guava 断言2.4 使用断言进行契约式设计2.4.1 检查指令2.4.2 前置条件2.4.3 后置条件2.4.4 不变性2.4.5 放松 DbC 检…...
SQL Server:打造高效数据管理系统的利器
使用SQL Server进行数据管理 简介 SQL Server是由Microsoft开发的一款关系型数据库管理系统,它可以用于存储和管理大量结构化数据。本篇博客将介绍如何使用SQL Server进行数据管理。 数据库连接 在开始使用SQL Server之前,需要先建立与数据库的连接。…...
代码随想录二刷day20 | 二叉树之 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
day20 654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654.最大二叉树 题目链接 解题思路: 本题属于构造二叉树,需要使用前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。 确定递归函数的参数…...
python基础知识(十三):numpy库的基本用法
目录 1. numpy的介绍2. numpy库产生矩阵2.1 numpy将列表转换成矩阵2.2 numpy创建矩阵 3. numpy的基础运算4. numpy的基础运算25. 索引 1. numpy的介绍 numpy库是numpy是python中基于数组对象的科学计算库。 2. numpy库产生矩阵 2.1 numpy将列表转换成矩阵 import numpy as …...
【SA8295P 源码分析】16 - TouchScreen Panel (TP)线程函数 tp_recv_thread() 源码分析
【【SA8295P 源码分析】16 - TouchScreen Panel (TP)线程函数 tp_recv_thread 源码分析 一、TP 线程函数:tp_recv_thread()二、处理&上报 坐标数据 cypress_read_touch_data()系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接:《【SA8295P 源码…...
Python3数据分析与挖掘建模(13)复合分析-因子关分析与小结
1.因子分析 1.1 探索性因子分析 探索性因子分析(Exploratory Factor Analysis,EFA)是一种统计方法,用于分析观测变量之间的潜在结构和关联性。它旨在确定多个观测变量是否可以归结为较少数量的潜在因子,从而帮助简化…...
【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型
参考: B站教学视频【:AI绘画】新手向!Lora训练!训练集准备、tag心得、批量编辑、正则化准备】官方教程:https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_README-en.md#automatic-captioning 一、…...
TCP可靠数据传输
TCP的可靠数据传输 1.TCP保证可靠数据传输的方法 TCP主要提供了检验和、序号/确认号、超时重传、最大报文段长度、流量控制等方法实现了可靠数据传输。 检验和 通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢失该TC…...
Python 私有变量和私有方法介绍
Python 私有变量和私有方法介绍 关于 Python 私有变量和私有方法,通常情况下,开发者可以在方法或属性名称前加上单下划线(_),以表示该方法或属性仅供内部使用,但这只是一种约定,并没有强制执行禁…...
Kotlin Lambda表达式和匿名函数的组合简直太强了
Kotlin Lambda表达式和匿名函数的组合简直太强了 简介 首先,在 Kotlin 中,函数是“第一公民”(First Class Citizen)。因此,它们可以被分配为变量的值,作为其他函数的参数传递或者函数的返回值。同样&…...
uniapp 小程序 获取手机号---通过前段获取
<template><!-- 获取手机号,登录内容 --><view><!-- 首先需要先登录获取code码,然后才可以获取用户唯一标识openid以及会话密钥及用于解密获取手机的加密信息 --><view click"login">登录</view><view…...
面板安全能力持续增强,新增日志审计功能,1Panel开源面板v1.3.0发布
2023年6月12日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.3.0版本。 在这一版本中,1Panel进一步增强了安全方面的能力,包括新增SSH配置管理、域名绑定和IP授权支持,以及启用网站防盗链功能。此外,该版本…...
k8s学习-CKS考试必过宝典
目录 CKS考纲集群安装:10%集群强化:15%系统强化:15%微服务漏洞最小化:20%供应链安全:20%监控、日志记录和运行时安全:20% 报名模拟考试考试注意事项考前考中考后 参考 CKS考纲 集群安装:10% 使…...
jmeter如何将上一个请求的结果作为下一个请求的参数
目录 1、简介 2、用途 3、下载、简单应用 4、如何将上一个请求的结果作为下一个请求的参数 1、简介 在JMeter中,可以通过使用变量来将上一个请求的结果作为下一个请求的参数传递。 ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测…...
JAVA如何学习爬虫呢?
学习Java爬虫需要掌握以下几个方面: Java基础知识:包括Java语法、面向对象编程、集合框架等。 网络编程:了解HTTP协议、Socket编程等。 HTML、CSS、JavaScript基础:了解网页的基本结构和样式,以及JavaScript的基本语…...
距离保护原理
距离保护是反映故障点至保护安装处的距离,并根据距离的远近确定动作时间的一种保护。故障点距保护安装处越近,保护的动作时间就越短,反之就越长,从而保证动作的选择性。测量故障点至保护安装处的距离,实际上就是用阻抗…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
