MySQL主/从-主/主集群安装部署

news2024/11/13 10:47:46

MySQL集群架构的介绍

我们在使用到MySQL数据库的时候,只是一个单机的数据库服务。在实际的生产环境中,数据量可能会非常庞大,这样单机服务的MySQL在使用的时候,性能会受到影响影响。并且单机服务的MySQL的数据安全性也会受到影响。因此在生产环境中,我们通常搭建MySQL的集群架构,来提高庞大数据量的基础上的高性能读写的需求。
在常见的集群架构中,最常见的就是主从架构(Master-Slaves)

主从架构介绍

MySQL的主从架构,又有一些其他的名称:主从模式、主从复制等。所谓的主从架构指的是建立多个完全一样的数据库,其中一个数据库作为主库(主要是用的数据库),其他的作为从库(次要的数据库)。主从架构分为很多种:一主一从、双主架构、一主多从、多主多从等模式。通常主库可读可写,从库只读。

MySQL最常见也是最简单的主从架构的实现就是**主从复制(MySQL Replication)**模式,这也是MySQL自带的功能,无需借助第三方的工具,就可以实现一个主从架构的集群模式。
主从架构相比较于单机服务的MySQL来说,优势有很多,最常见的优势就是:写操作连接主库,读操作连接从库,实现读写分离。

主从复制的原理

主从复制是通过重演binlog来实现主库数据的异步复制。即在主库上打开binlog记录每一次的数据库操作,然后从库会有一个IO线程,负责跟主库建立TCP连接,请求主库将binlog传输到从库。此时主库上会有一个Log Dump线程,负责通过这个TCP连接吧binlog日志传输给从库的IO线程。接着从库的IO线程会把读取到的binlog日志数据写入自己的中继日志文件(Relay)中。然后从库上另外一个SQL线程会读取中继日志文件中的操作,进行操作重演,达到还原数据的目的。

在这里插入图片描述

  1. 主库的数据发生了变更,将日志写入到主库的binlog中。
  2. 主库的LogDump线程,将binlog文件传输到从库的IO线程。
  3. 从库的IO线程将接收到的binlog写入到relay log中。
  4. 从库的SQL线程读取relay log中的日志,并操作重演,将结果同步到从库中。

MySQL主从复制的实现

环境说明

要实现MySQL的主从架构的搭建,需要满足以下条件:

  • 所有节点的MySQL版本必须一致(本文使用MySQL 8.0.26)。
  • 所有节点的时间必须同步。
  • 所有节点需要启动binlog服务。
  • 本文基于Mac M1芯片架构进行实践。

主库配置

我们需要编辑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日志的库

从库配置

我们需要编辑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服务即可。

主从复制测试

我们在主库中创建数据库、创建表,可以在从库中看到有数据同步过来了。而且在从库中使用 show slave status \G 来查看从库的状态的时候,会发现记录的Pos位置已经更新。

MySQL主主复制的实现

主主复制介绍

MySQL的主从复制架构下,可以实现读写分离、业务分流,来降低单个数据库的压力。但是这种模式下会存在单点故障的问题,即如果主库节点宕机的情况下,对从库进行的操作并不会同步到主库中。这个数据库也就无效了。因此有的时候我们会搭建主主复制的架构,也叫做双主架构。
双主架构的实现,是在主从架构的基础之上的。将两台MySQL之间护卫彼此的主库,同时又互为对方的从库。这样的实施方案下,既能做到分流,也能解决单点故障的问题。因为任何的一台节点故障,另外的一台都可以继续提供服务。

主库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;

主库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;

设置同步

  • 查看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命令清除即可

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

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

相关文章

数字信号处理-09-串行FIR滤波器MATLAB与FPGA实现

前言 本文介绍了设计滤波器的FPGA实现步骤,并结合杜勇老师的书籍中的串行FIR滤波器部分进行一步步实现硬件设计,对书中的架构做了简单的优化,并进行了仿真验证。 FIR滤波器的FPGA实现步骤 从工程角度分析FIR滤波器的FPGA实现步骤如下&…

Vim简洁教程

Vim简洁教程Vim简介使用方法命令模式输入模式底线命令模式模式转换使用流程Vim键盘图Vim简介 在Linux系统中,Vim是一款自带的文本编辑器,因此Vim常用于Linux系统中。Vim是从 vi 发展出来的,包含代码补全、编译及错误跳转等方便编程的功能&am…

【LeetCode每日一题】——78.子集

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 78.子集 四【题目描述】 给你一个整数数组 nums &…

亚太C题详细版思路修改版(精)

今年的亚太A、B题的感觉难度不低,其难度已经可以与电工妈杯这种比赛的赛题难度相提并论了。因此,这次预计选C题的人数可能不少,这对于大家来说也是个好消息。塞翁失马焉知非福,难对于大家来说都难,只要自己放平心态&am…

计算机组成原理习题课第一章-1(唐朔飞)

计算机组成原理习题课第一章-1(唐朔飞) ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:&…

【Pygame实战】这游戏有毒,刷爆朋友圈:小编已与病毒版贪吃蛇大战了三百回合,最高分339?

导语 Hello,大家好呀!我是木木子吖~ 一个集美貌幽默风趣善良可爱并努力码代码的程序媛一枚。 听说关注我的人会一夜暴富发大财哦~ (哇哇哇 这真的爱😍😍) 所有文章完整的素材源码都在&#…

Android中JVM七大垃圾收集器【解析】

概述 GC垃圾收集器的种类 新生代:年轻代用来存放最近创建的对象老年代:主要存放应用程序中生命周期长的内存对象永久代:内存的永久保存区域(类和元数据),GC不参与回收Serial收集器:串行收集器…

web网页设计—— 中国餐饮协会(HTML+CSS)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

CentOS8使用阿里云yum源异常问题及解决方法

镜像下载、域名解析、时间同步请点击 阿里云开源镜像站 Linux安装git时发生如下错误 [rootraoyuuuu maven]# dnf install git Repository extras is listed more than once in the configuration Repository epel is listed more than once in the configuration CentOS-8 - B…

关于windows的文件监控管理系统(Java)

目 录 摘 要 I Abstract II 1.绪论 1 1.1课题背景 1 1.2系统开发的目的和意义 2 1.3国内外概况 3 1.4研究主要内容 3 2.windows文件监控管理系统相关技术介绍 4 2.1 API 4 2.2 API HOOK 5 2.3 Java 5 2.4 DLL 6 2.4 Windows系统的Socket编程 6 2.4.1使用WinSock API 6 2.4.2 使…

【 C++ 】IO流

目录 1、C语言的输入输出 2、流是什么 3、CIO流 3.1、C标准IO流 3.2、C文件IO流 文件操作步骤 以二进制的形式操作文件 以文本的形式操作文件 4、stringstream的介绍 1、C语言的输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf()和printf()。 scanf()&#xff1a…

[前端基础] JavaScript 基础篇(下)

DOM 和 BOM DOM 指的是文档对象模型,它指的是把文档当做一个对象来对待,这个对象主要定义了处理网页内容的方法和接口。BOM 指的是浏览器对象模型,它指的是把浏览器当做一个对象来对待,这个对象主要定义了与浏览器进行交互的法和…

Node核心模块之Stream

Node.js诞生之初就是为了提高IO性能,文件操作系统和网络模块实现了流接口,Node.js中流就是处理流式数据的抽象接口。 那么应用程序为什么使用流来处理数据? 常见问题 同步读取资源文件,用户需要等待数据读取完成资源文件最终一次…

【Windows】windows10时间显示秒数

一般情况下windows10的电脑时间只显示小时和分钟,但是有的用户想要时间显示更加精细,那么windows10时间怎么显示秒呢?大家可以通过修改注册表的方式进行设置:打开注册表编辑器,定位到Advanced,右键新建DWOR…

【第十四篇】Camunda系列-多人会签【多实例】

多人会签 Multiple Instance 也叫多实例任务。 1.会签说明 多实例活动是为业务流程中的某个步骤定义重复的一种方式。在编程概念中,多实例与 for each 结构相匹配:它允许对给定集合中的每个项目按顺序或并行地执行某个步骤或甚至一个完整的子流程。 多实例是一个有额外属性…

注解(Annotation)

注解 注解也被称为元数据(MateDate),用于修饰或解释包,类,方法,属性,构造器,局部变量等数据信息和注释一样,注解不会影响程序逻辑,但是注解可以被编译或者运行&#xff…

如何定义需求优先级?

本文将围绕以下问题展开:1、什么是需求优先级排序,目的是什么?2、优先级排序的8大依据;3、需求优先级排序面临的挑战;4、一些优秀的需求优先级排序工具。 一、什么是需求优先级排序,目的是什么?…

Mybatis-plus 用法

本文主要介绍 mybatis-plus 这款插件,针对 springboot 用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。 关于 mybatis-plus 是什么,不多做介绍了,看…

大一作业HTML网页作业:简单的旅游 1页 (旅游主题)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&…

94-98-Hadoop-MapReduce工作流程(重要)

Hadoop-MapReduce工作流程(重要): 上面的流程是整个 MapReduce 最全工作流程,但是 Shuffle 过程只是从第 7 步开始到第 16 步结束,具体 Shuffle 过程详解,如下: (1)Map…