MySQL篇之mysql主从集群搭建

一、MySQL集群架构的介绍

我们在使用MySQL数据库的时候,只是一个单机的数据库服务。在实际的生产环境中,数据量可能会非常庞大,这样单机服务的MySQL在使用的时候,性能会受到影响。并且单机的数据安全想也会受到影响。因此在生产黄静中,我们通常搭建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主从复制的实现

1、环境说明
要实现MySQL的主从架构的搭建,需要满足以下条件:

  • 所有节点的MySQL版本必须一致
  • 所有节点的时间必须同步
  • 所有节点需要启动binlog服务
    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

1、在[mysqld]的下方添加或修改如下属性:

// 服务节点的唯一标识,需要给集群中的每个服务分配一个单独的ID
server-id=101
// 打开binlog日志,并指定文件名
log_bin=master-bin
// binlog日志文件
log_bin-index=master-bin.index

2、修改完成之后,需要重启MySQL服务
为root用户分配replication slave的权限:

// 登录到主库
mysql -u root -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日志的库
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线程启动失败。原因如下:
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线程启动失败,一般是因为执行主库同步过来的数据的时候失败了,例如需要创建的数据库、表已经存在导致。
解决方案:
删除从库中同名的库、表,从主库的日志中恢复数据。
如果想要保留从库中的库、表,先停止slave服务,设置 set global sql_slave_skip_counter = 1; 来设置需要跳过的错误的个数。1是可以修改的,想要跳过几个错误,就设置为多少。然后启动slave服务即可。
三、主从复制测试
我们在主库中创建数据库、创建表,可以在从库中看到有数据同步过来了。而且在从库中使用 show slave status \G 来查看从库的状态的时候,会发现记录的Pos位置已经更新。
特点:
MySQL的主从复制架构下,可以实现读写分离、业务分流,来降低单个数据库的压力。

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

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

相关文章

制作一个模板三

您已经看到了Jinja2在呈现过程中如何用实际值替换占位符&#xff0c;但这只是Jinja2在模板文件中支持的众多强大操作之一。例如&#xff0c;模板还支持在{%…%}块。下一个版本的index.html模板增加了一个条件语句: app/templates/index.html: <!doctype html> <htm…

快速开发一个简单实用的MES系统?

题主在一个光伏组件工厂做生产管理&#xff0c;但工厂竟然没有MES系统&#xff0c;于是想自己开发一个简单的MES系统。那么我们来看看题主对于开发MES系统的要求—— 对系统&#xff1a;每一个产品都有一个条形码&#xff0c;希望系统可以追踪生产计划下的产品的生产状态&…

RPA在财务预测和分析中的应用

在现代企业管理中&#xff0c;财务数据分析是决策制定和战略规划的关键环节。大数据的兴起带来财务数据的复杂性和数量不断增加&#xff0c;企业为此消耗了大量人力和物力。随着当今数字化、智能化时代的到来&#xff0c;越来越多企业引进RPA技术来提高工作效率&#xff0c;实现…

LeetCode算法心得——全排列(回溯型排列)

大家好&#xff0c;我是晴天学长&#xff0c;排列型的回溯&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按…

JVM垃圾回收机制

JVM 可达性分析法 1. 垃圾回收器的基本概念 什么是垃圾回收器&#xff1a;JVM 为 Java 提供了垃圾回收机制&#xff0c;其实是一种偏自动的内存管理机制。简单来说&#xff0c;垃圾回收器会自动追踪所有正在使用的对象&#xff0c;并将其余未被使用的对象标记为垃圾&#xff…

【poi导出excel模板——通过建造者模式+策略模式+函数式接口实现】

poi导出excel模板——通过建造者模式策略模式函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例 首先我们现看一下poi如何导出excel&#xff0c;这里举个例子&#xff1a;目前想要导出一个Map<sex,List>信息&#xff0c;sex作为…

独立站运营和facebook投放怎么做

独立站运营和Facebook投放可以采取以下步骤&#xff1a; 制定投放目标&#xff1a;独立站卖家应该选择最适合与自己投放需求匹配的目标&#xff0c;比如需要提高内容参与度等。选择消费受众&#xff1a;根据年龄、性别、教育、地区、兴趣爱好、设备型号、过往购买等行为来判定…

idea2023如何查看被使用上下文关系

1.接口查看实现类&#xff0c;实现类查看接口 查看接口所有实现类 根据类里面的方法查看被覆盖的接口中的方法 2.查看方法、类被调用 3.查看类的继承关系

xcorr函数的用法和程序举例

xcorr函数的用法和程序举例 xcorr函数返回两个离散时间序列的互相关。互相关测量向量 x 和移位&#xff08;滞后&#xff09;副本向量y 的之间的相似性&#xff0c;形式为滞后的函数。如果 x 和 y 的长度不同&#xff0c;函数会在较短向量的末尾添加零&#xff0c;使其长度与另…

Flutter:安装依赖报错doesn‘t support null safety

项目中需要引用http依赖&#xff0c;在pubspec.yaml文件中添加如下信息&#xff1a; 当同步时&#xff0c;报错信息如下&#xff1a; [myflutter] flutter pub upgrade Resolving dependencies... The current Dart SDK version is 3.1.3. Because myflutter depends on http &…

Harmony 应用开发的知识储备

Harmony 应用开发的知识储备 前言正文一、DevEco Studio版本二、手机版本① 环境变量 三、API版本四、开发语言五、运行调试 前言 这里先说明一点&#xff0c;如果你对Android应用开发很熟悉&#xff0c;那么做Harmony应用开发也可以驾轻就熟&#xff0c;只不过在此之前你需要知…

TensorFlow学习笔记--(2)张量的常用运算函数

张量的取值函数 求张量的平均值: tf.reduce.mean(%张量名%)求张量的最小值:tf.reduce_min(%张量名%)求张量的最大值:tf.reduce_max(%张量名%)求张量的和:tf.reduce_sum(%张量名%)其次,对于上述所有操作 都可在函数后添加一个新的参数 axis%维度% axis0 代表第一维度 axis1 代表…

无人机航迹规划:五种最新智能优化算法(COA、SWO、KOA、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;LSO、SWO、KOA、GRO、LO&#xff09;简介 1、小龙虾优化算法COA 小龙虾优化算法&#xff08;Crayfsh optimization algorithm&#xff0c;COA&#xff09;由Jia Heming 等人于2023年提出&#xff0c;该算法模拟小龙虾的避暑、竞争和觅食行为&#xf…

springboot整合ELK

ELK是一种强大的分布式日志管理解决方案&#xff0c;它由三个核心组件组成&#xff1a; Elasticsearch&#xff1a;作为分布式搜索和分析引擎&#xff0c;Elasticsearch能够快速地存储、搜索和分析大量的日志数据&#xff0c;帮助用户轻松地找到所需的信息。 Logstash&#xff…

Android 12.0 内置MTK平台音乐播放器

Android 12.0 内置MTK平台音乐播放器 Android 12.0 默认是无MTK平台自带音乐播放器的&#xff0c;系统内置MTK平台自带的音乐播放器的具体修改参照如下&#xff1a; /device/pj/common/device.mk PRODUCT_PACKAGES Music PRODUCT_PACKAGES OP01Music 重新编译验证&#x…

浅谈工厂电能管理系统改造与产品选型

叶根胜 安科瑞电气股份有限公司 上海嘉定202001 摘要&#xff1a;随着经济的快速发展&#xff0c;能源紧张和环境恶化引起了全世界的密切关注。电能在所有能源中消耗量大&#xff0c;但不可或缺&#xff0c;因此对电能的统一管理尤为重要。只有准确可靠的计量电能、分级管理和…

物奇平台耳机宕机恢复功能实现

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送语音信号处理降噪算法&#xff0c;蓝牙音频&#xff0c;DSP音频项目核心开发资料, 物奇平台耳机宕机恢复功能实现 一 需求与场景 1 使…

QWidget 实现九宫格图案解锁

前言 最近需要实现一个九宫格图案解锁功能,查看网上的方案,基于QWidget的方案全网搜来搜去就一篇 Qt编写自定义控件:图案密码锁, 都是炒来炒去的同一篇,代码还比较复杂,运行后在PC端还是可以的,但是运行在arm机器上,就卡顿,或者容易断开手势连接线,各种不友好,于是自…

设计模式类型

创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象&#xff0c;能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰&#xff0c;外界对于这些对象只需要知道它们共同的接口&#xff0c;而不清楚其具体的实现细节&#xff0c;使整个系…

vue乾坤微前端项目

1、主应用 安装乾坤 npm i qiankun -S 注册微应用并启动&#xff1a; import { registerMicroApps, start } from qiankun;//设置两个微应用 registerMicroApps([{name: vue1, //要跟package.json中的name保持一致entry: //localhost:8081, //本地就这么写container: #cont…