Day05 03-MySQL主从-主主原理与搭建详解

news2024/12/24 21:23:53

文章目录

      • 第十六章 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线程会读取中继日志文件中的操作,进行操作重演,达到还原数据的目的。

MySQL主从复制原理图

  1. 主库的数据发生了变更,将日志写入到主库的binlog中。
  2. 主库的LogDump线程,将binlog文件传输到从库的IO线程。
  3. 从库的IO线程将接收到的binlog写入到relay log中。
  4. 从库的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 event
                  Master_Host: 192.168.10.101
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 916
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 1133
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

正常的结果是如上所示的结果,但是总有意外的时候:

有些同学可能会出现 Slave_IO_Running: Connecting 的状态,甚至是NO的状态,说明从库的IO线程启动失败。原因如下:

  1. 可能是主库设置错误,检查 master_host 和 master_port 的设置是否正确

  2. 可能是主库的用户名和密码错误,检查 master_user 和 master_password 是否正确

  3. 可能是主库防火墙未关闭,检查防火墙

  4. 可能是主库不能远程登录,检查主库用户的远程登录权限

  5. 可能是 master_log_file 文件设置出问题

  6. 可能是虚拟机克隆,导致的两个节点的uuid相同

    检查 /var/lib/mysql/auto.cnf 中记录的uuid,如果相同的话,随便修改一个,重启服务即可

上述几种错误情况在修改之后,都是需要重新启动slave服务的。先使用 stop slave 停止服务;再使用 start slave 开启

有些同学可能会出现 Slave_SQL_Running: No 的状态,说明从库的SQL线程启动失败,一般是因为执行主库同步过来的数据的时候失败了,例如需要创建的数据库、表已经存在导致。

解决方案:

  1. 删除从库中同名的库、表,从主库的日志中恢复数据。
  2. 如果想要保留从库中的库、表,先停止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

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

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

相关文章

移植好U8g2图形库的STM32F407标准库工程模板,0.96寸OLED驱动程序

移植好U8g2图形库的STM32F407标准库工程模板,用的0.96寸OLED屏(SSD1306),用硬件IIC驱动。 花了一晚上时间去移植。开发板主控MCU用的是STM32F407VET6,I2C接口用I2C1,SCL接PB6,SDA接PB7。 嵌入…

从分布式到微服务解密“架构”原理与实战笔记

分布式架构与微服务平台是当今IT界的关键技术,也是资深软件工程师和系统架构师必须掌握的核心技术。 微服务、云原生、Kubernetes、Service Mesh是分布式领域的热点技术,它们并不是凭空出现的,一定继承了某些“前辈”的优点。我们不仅要了解…

网络安全零基础之从原理看懂的XSS

01、XSS 的原理和分类 跨站脚本攻击 XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆 故将跨站脚本攻击缩写为 XSS,恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页面时&…

软件测试将会赢来陌路?

最近参加了某大厂总监做的一场测试培训,感触颇深,一句话萦绕在耳畔“测试乃至测开,大厂为了降本增效这些都要被优化掉”。去年由他操刀优化了一大批优秀的测试员! 实际小酋这几年已经有切身体会,测试野蛮增长的阶段已经…

cv学习--图像分类完结

深度学习面试题05:激活函数sigmod、tanh、ReLU、LeakyRelu、Relu6 - 黎明程序员 - 博客园 (cnblogs.com)

解惑:测试圈网红工具 Jmeter 到底难在哪里

同样的起点,同样的工作时间,为什么别人接那么多项目,你还是在点点点;为什么别人升职了,而你还在原地踏步? 同样的工作内容,为什么别人下班了,你还在加班? 在现在竞争激烈…

Unity入门4——重要组件与API

一、GameObject (一)成员变量 // 名字 print(this.gameObject.name); this.gameObject.name "Lesson4唐老狮改名"; print(this.gameOb…

手机号码应该如何选择呢?一文解决你的选择困难症!

哈喽大家好,我是搜卡之家葫芦弟。最近有一些小伙伴们私信葫芦弟,想办一个本地的手机号,想着长久一直使用的。既然是长久使用,那就想选一个不错的号码,手机靓号的话,好一点的号码价格又太贵。这不是要在平凡…

参与PK赢大奖!阿里云机器学习平台PAI助力开发者激发AIGC潜能

近年来,随着海量多模态数据在互联网的爆炸性增长和训练深度学习大模型的算力大幅提升,AI生成内容(AI Generated Content,AIGC)的应用呈现出爆发性增长趋势。为助力开发者能够一站式快速搭建文生图、对话等热门场景应用…

GPT问题摘录go中接口实现和继承

go如何实现接口 package mainimport "fmt"type Shape interface {Area() float64 }type Circle struct {Radius float64 }func (c Circle) Area() float64 {return 3.14 * c.Radius * c.Radius }func main() {c : Circle{Radius: 6.2}fmt.Println(c.Area()) } 首先我…

在线合并Excel文档的HTML网页工具

构建一个在线合并Excel文档的HTML网页工具 导语: 在本篇技术分享文章中,我将向您展示如何使用HTML、CSS和JavaScript构建一个功能强大的在线合并Excel文档的网页工具。这个工具可以帮助用户将多个Excel文件合并成一个文件,提高工作效率和方便…

GDT陶瓷气体放电管会不会烧坏?有没有方向?

首先第一个问题:GDT陶瓷气体放电管会不会烧坏?标准答案:会的。 GDT放电管是一种过压保护开关型元件,通常用在电路防护的前端,起泄放浪涌电流及脉冲过电压防护的效果,在遇到电路设计规划不合理以及选型不当时…

汇川H5U计数器轴编程应用(高速计数和测速应用)

H5U编码器轴和脉冲轴相关应用测试请参看下面文章: H5U PLC本地脉冲轴和本地编码器轴测试_RXXW_Dor的博客-CSDN博客H5U PLC如何通过EtherCAT总线控制伺服运动,请参看下面的博客汇川H5U PLC通过EtherCAT总线控制SV660N和X3E伺服_RXXW_Dor的博客-CSDN博客。https://blog.csdn.n…

IDEA安装教程2023

在本文中,我们将提供关于如何安装 IntelliJ IDEA 的详细步骤。如果您是初学者或只是想尝试一下 IDEA,我们建议您下载 Community 版。如果您需要更多高级功能,可以选择 Ultimate 版。 步骤一:下载 IntelliJ IDEA 首先,…

潮向新世界丨2023亚马逊云科技出海日精彩回顾

2023年6月9日,2023亚马逊云科技“潮向新世界”出海日活动在深圳及线上同步盛大开启。在这场出海盛会中,亚马逊云科技、中国出海企业代表和合作伙伴们分享了哪些精彩内容?他们又对中国企业出海提出了哪些真知灼见? 十年蓄势十年爆…

yolov8中的C2f层

在代码注释中看到C2f其实是 CSP Bottleneck with 2 convolutions 找来CSP的图 大致是把一个output按channel拆成2部分,其中一部分不动, 另一部分过conv,再拼回去, 因为是with 2 convolutions, 会有2个conv. 下面根据代码来走一…

P-One一站式性能测试平台如何安装在国产化操作系统上运行

PerformanceOne(简称:P-One)是泽众软件自主研发的一套一站式性能测试平台软件产品。 该产品采用 B/S 架构开发,实现了集管理、设计、压测、监控以及分析于一体的全方位性能测试解决方案。可有效提升性能测试技术能力,…

【unity】基础入门 编译错误排查与调试方法

基础入门 编译错误排查与调试方法 一、常见编译错误原因1、环境问题2、代码命名问题二、代码调试方法1、基础调试方法2、高级玩法3、unity调试工具插件一、常见编译错误原因 1、环境问题 1、Win11系统不兼容部分unity版本 考虑换系统吧! 2、可能是系统权限问题,访问不到部分…

经济学人特稿:你应该送孩子去私立学校吗? | 经济学人20230610版社论双语精翻

“升学季”特稿:2023年6月10日《经济学人》周报封面文章《送孩子去私立学校——值吗?》(Are private schools worth it?) International | Studying for success 为了成功而学习 Should you send your children to private school? 你应该…

跨境电商对于撸卡、撸货、采退都需要哪些技术要求

在当前跨境电商环境下,从事撸卡、撸货或者采退等业务的人员日益增多。然而,由于大部分人使用的环境系统相对简单,例如云手机、一键新机工具IP、指纹浏览器IP、虚拟机等,缺乏足够复杂的防护机制,因此,经常会…