【香菇带你学Mysql】Mysql数据库主备搭建【建议收藏】

news2024/11/23 22:32:05

文章目录

    • 1. 概述
      • 1.1 为什么要搭建主备架构数据库?
      • 1.2 常见的Mysql数据库主备架构
    • 2. Mysql 数据库主备搭建原理
    • 3. Mysql数据库主备搭建实操
      • 3.1 环境准备
      • 3.2 主库操作
      • 3.3 从库操作
      • 3.4 主从同步验证
    • 4. 总结
    • 5. 参考文档

大家可能听过一个段子,当电脑遇到问题的时候,重启能解决99%的问题,重装能解决99.99%的问题。基本上没有问题不是重启不能解决的,有的话就再重启一下。

image-20240805190834331

当然,上面的段子说的情况是事实。重启,重装的确可以解决99.99%的问题。但是仍有一些情况是不能容忍任何重启操作的,对于个人电脑或者应用来说,重启也许没什么大不了,但是对于一些企业系统,重启造成的影响可能非常大(强制重启极有可能导致数据的丢失)。例如,电动汽车车机系统,铁路控制系统,银行或证券交易系统,否则产生的事故后果难以想象,几乎不可能也不允许出现停机可能。那么保证系统或数据的稳定性就变得至关重要。

今天就给大家在数据库层面讲解主备搭建的原理方法和过程。

1. 概述

1.1 为什么要搭建主备架构数据库?

为保证企业的稳定生产运营,一个高可用的数据库架构是不可或缺的。对于企业来说,如果数据库出现宕机、数据丢失或不可用等问题,将会产生重大的影响和经济损失。对于大型公司,其数据库必须 7*24 可用,不能容忍任何长时间的服务中断。通过主备架构,当主数据库因突发硬件故障无法工作时,备用数据库能立即接管服务,保证客户的交易和查询不受影响,维护了公司的信誉和业务正常运行。

1.2 常见的Mysql数据库主备架构

  1. 一主一从架构

    • 这是最简单的主备架构。一个主数据库负责处理写入操作,一个从数据库用于数据备份和读取操作。从库通过复制主库的二进制日志来保持数据同步。
    • 例如,在电商网站中,订单处理的写入操作在主库进行,而用户查询订单历史等读取操作可以在从库进行,减轻主库的负载。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    图片来源:阿里云官网

  2. 一主多从架构

    • 一个主库对应多个从库。主库承担写入任务,从库可以用于不同的用途,如读负载均衡、数据备份、数据分析等。
    • 比如,一个从库用于网站前端的读取请求,另一个从库用于数据仓库的定期数据抽取。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    图片来源:阿里云官网

  3. 双主架构

    • 两个数据库服务器都可以进行写入操作,数据通过双向复制保持同步。但这种架构需要解决冲突处理的问题。
    • 适用于对写入可用性要求高,且能有效处理冲突的场景,如分布式的金融交易系统。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    图片来源:MySQL双主(主主)架构方案

  4. 此外还有多主多从架构,不再展开叙述

2. Mysql 数据库主备搭建原理

此处介绍和后续部署原理均为一主一备架构

MySQL 数据库主备搭建的原理主要基于数据复制技术,以实现数据的冗余和高可用性。

image-20240805212021585

以下是其主要原理步骤:

  1. 主库(Master)记录二进制日志(Binary Log)
    • 主库在进行数据更改操作(如插入、更新、删除等)时,会将这些操作以事件的形式记录到二进制日志中。
    • 二进制日志包含了足够的信息,以便从库能够重现这些操作。
  2. 从库(Slave)连接到主库并请求二进制日志
    • 从库通过配置指定主库的相关信息,建立与主库的连接。
    • 从库向主库发送请求,获取需要的二进制日志。
  3. 主库推送二进制日志给从库
    • 主库接收到从库的请求后,将指定的二进制日志内容发送给从库。
  4. 从库读取并应用二进制日志
    • 从库接收到二进制日志后,将其存储在本地的中继日志(Relay Log)中。
    • 从库有一个专门的线程(SQL 线程)读取中继日志中的事件,并在本地数据库中重新执行这些操作,从而实现数据的同步。
  5. 一致性保证
    • 为了确保主从库数据的一致性,会使用一些机制,如主库在事务提交时等待二进制日志写入成功,从库在应用日志时按照相同的顺序执行操作等。
  6. 故障切换
    • 当主库出现故障时,可以将业务切换到从库继续提供服务,以保证数据库的可用性。

3. Mysql数据库主备搭建实操

3.1 环境准备

关于msyql库的安装步骤,这里不再赘述。

详细操作步骤可以查看我的另外一篇文章:【香菇带你学数据库】mysql8.0编译安装图文教程

这里默认大家已经准备好了两个主备数据库

我的环境如下(仅供大家参考)

  • 主机和数据库规格

主机:BClinux for euler 21.10 2核心4G-100G存储(Vmware虚拟机)

ipHostname角色
172.168.120.149localhostMaster
172.168.120.150localhostSlave

数据库版本:Mysql 8.0.20(编译安装)

  • 网络要求

两个数据库可以相互访问,没有网络限制

3.2 主库操作

登录到数据库主库172.168.120.149

mysql -u root -p

image-20240805214052130

允许远程登录Mysql数据库

use mysql;
update user set Host='%' where User='%';
flush privileges;

image-20240805214211163

使用管理员权限,在主服务器上修改配置文件(my.cnf或my.ini)新增下面参数:

sudo vi /etc/my.cnf
# 此步骤需要输入密码

cat  >> /etc/my.cnf <<EOF 
#服务器 id,随意,但要唯一
server-id = 1  
#二进制文件存放路径
log-bin = mysql-bin 
#参数用于排除自带的数据库。  
binlog-ignore-db = mysql 
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
#二进制日志格式,建议使用ROW格式以获得更好的兼容性和可靠性。
binlog-format = ROW 
EOF

image-20240805214531080

重启从服务以使更改生效。

sudo systemctl restart mysqld

image-20240805214639858

主服务器的数据库中创建用于复制的账户并授予相应的权限。

#登录MySQL
mysql -uroot -p

image-20240805214854890

use mysql;
#创建用户
create user 'user_sync'@'%' identified by 'mypassword';
#授权账号复制权限
grant replication slave on *.* to 'user_sync'@'%';
#刷新配置
FLUSH PRIVILEGES;

image-20240805215401133

主服务器上执行以下命令获取当前二进制日志文件的名称和位置:

show master status;

记下输出中的 File 和 Position 值,后续在从库上使用。

mysql> show master status;
+------------------+----------+--------------+---------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            | Executed_Gtid_Set |
+------------------+----------+--------------+---------------------------------------------+-------------------+
| mysql-bin.000006 |      156 |              | mysql,information_schema,performance_schema |                   |
+------------------+----------+--------------+---------------------------------------------+-------------------+
1 row in set (0.00 sec)

image-20240805215820049

3.3 从库操作

登录从库主机,修改Mysql配置文件(my.cnf或my.ini)

cat >>/etc/my.cnf <<EOF

server-id = 2
#中继日志文件的名称,用于从主服务器接收二进制日志事件。
relay-log = mysql-relay-bin 
#从服务器的二进制日志文件的名称。
log_bin = mysql-bin 
#不同步相关的库
replicate-ignore-db = mysql 
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
EOF

image-20240805220126212

重启从库MySQL服务

systemctl restart mysqld

登录从服务器MySQL

mysql -uroot -p

image-20240805220352677

根据主服务器建立的账号和主数据库上执行sql命令show master status;显示的内容,修改以下命令配置主从复制:

以下内容均需要替换成你自己的数据

stop slave;
change master to
 master_host = '172.168.120.149',
 master_user = 'user_sync',
 master_password = 'mypassword',
  #主服务器数据库上的file值(不能有空格)
 master_log_file = 'mysql-bin.000006',
  #主服务器数据库的Position值
 master_log_pos = 156,
 get_master_public_key=1;

start slave;

image-20240805220543623

在在从服务器启动同步并查看状态

show slave status;
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.168.120.149
                  Master_User: user_sync
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 156
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 324
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql,information_schema,performance_schema
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 156
              Relay_Log_Space: 533
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 054b822c-5310-11ef-9b89-000c297dff4d
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 1
            Network_Namespace: 
1 row in set (0.00 sec)

mysql> 

Slave_IO_RunningSlave_SQL_Running均为Yes时,代表正在保持同步

image-20240805220820715

3.4 主从同步验证

在主库Mysql中新建数据库,数据表,并插入示例数据

# 创建新数据库
create database example_mydb;
# 使用新创建的数据库
use example_mydb;
# 创建表的SQL命令如下:
CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    birthdate DATE
);
# 插入示例数据
INSERT INTO employees (first_name, last_name, email, birthdate)
VALUES ('John', 'Doe', 'john.doe@example.com', '1985-01-01');

INSERT INTO employees (first_name, last_name, email, birthdate)
VALUES ('Jane', 'Smith', 'jane.smith@example.com', '1987-02-15');

INSERT INTO employees (first_name, last_name, email, birthdate)
VALUES ('Michael', 'Johnson', 'michael.johnson@example.com', '1990-03-20');
mysql> create database example_mydb;
Query OK, 1 row affected (0.00 sec)

mysql> use example_mydb;
Database changed
mysql> CREATE TABLE employees (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     first_name VARCHAR(50) NOT NULL,
    ->     last_name VARCHAR(50) NOT NULL,
    ->     email VARCHAR(100) UNIQUE NOT NULL,
    ->     birthdate DATE
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO employees (first_name, last_name, email, birthdate)
    -> VALUES ('John', 'Doe', 'john.doe@example.com', '1985-01-01');
Query OK, 1 row affected (0.01 sec)

mysql> 
mysql> INSERT INTO employees (first_name, last_name, email, birthdate)
    -> VALUES ('Jane', 'Smith', 'jane.smith@example.com', '1987-02-15');
Query OK, 1 row affected (0.01 sec)

mysql> 
mysql> INSERT INTO employees (first_name, last_name, email, birthdate)
    -> VALUES ('Michael', 'Johnson', 'michael.johnson@example.com', '1990-03-20');
Query OK, 1 row affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

在主库查看信息

SELECT * FROM employees;

image-20240805223609583

登录到从库,查看信息是否对应。

use example_mydb;
SELECT * FROM employees;

image-20240805223849831

4. 总结

通过本文的介绍,我们了解了搭建MySQL数据库主备架构的重要性以及常见的架构类型,包括一主一从、一主多从和双主架构等。同时,我们详细阐述了MySQL数据库主备搭建的原理,基于数据复制技术,通过主库记录二进制日志、从库请求和应用日志等步骤来实现数据的同步和高可用性。

在实操部分,我们按照环境准备、主库操作、从库操作和主从同步验证的步骤,详细说明了如何搭建MySQL数据库主备架构。在主库和从库上进行了相应的配置和操作,包括允许远程登录、修改配置文件、创建复制账户、授予权限、获取二进制日志信息等。最后,通过在主库创建数据库、表和插入数据,并在从库进行验证,确保了主从同步的有效性。

总的来说,搭建MySQL数据库主备架构可以提高数据库的可用性和稳定性,对于企业的稳定生产运营至关重要。在实际应用中,需要根据具体需求选择合适的架构类型,并严格按照操作步骤进行搭建和配置,以确保主备数据库能够正常工作,保障业务的连续性。

5. 参考文档

  1. 阿里云官网
  2. MySQL双主(主主)架构方案.
  3. MySQL8.0主从部署配置详细步骤
  4. 【香菇带你学数据库】mysql8.0编译安装图文教程

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

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

相关文章

java 关键字

Java的关键字是语言中保留的标识符&#xff0c;它们具有特定的含义和用途&#xff0c;并且不能用作变量名、方法名或类名等。Java 17&#xff08;最新的LTS版本之一&#xff09;中有53个关键字。 下面是每个关键字的含义及其实例 1. 控制结构关键字 这些关键字用于控制程序流…

第十六节、实装攻击判定

一、实现原理 人物三段式攻击的剑气增加一帧伤害即可 二、步骤 创建玩家下面的子物体 1、多边形碰撞体 给第一段攻击添加多边形碰撞体 2、帧触发 在这一帧添加动画&#xff0c;是触发器由失活状态转为使用状态 在这一帧勾选物体状态 3、计算攻击伤害 每一个挂载代码&…

大型语言模型微调的规模效应研究

人工智能咨询培训老师叶梓 转载标明出处 为了解锁大模型在特定下游应用中的全部潜力&#xff0c;通常需要通过微调&#xff08;finetuning&#xff09;来适配任务。尽管微调已成为一种常规做法&#xff0c;但关于不同微调方法的归纳偏差&#xff0c;尤其是规模特性的理解仍然有…

CRC16循环冗余校验

代码&#xff1a; #include<stdio.h> #include <stdint.h>#define uchar unsigned char #define uint unsigned int static const uint8_t auchCRCHi[] { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x0…

33.x86游戏实战-喊话CALL

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

CTFHUB—XSS—DOM反射

开启题目 输入以下语句测试一下&#xff0c;发现页面没有弹出窗口显示“flag” <script>alert("flag")</script> 查看页面源代码&#xff0c; 尝试闭合标签 使用下面代码闭合&#xff0c;然后发现闭合成功了 </script><script>alert("…

【Python机器学习】利用AdaBoost元算法提高分类性能——基于AdaBoost的分类

一旦拥有了多个弱分类以及其对应的alpha值&#xff0c;进行测试就变得非常容易了。现在&#xff0c;要将弱分类器的训练过程从程序中抽出来&#xff0c;然后应用在某个具体的实例上。每个弱分类器的结果以其对应的alpha值作为权重。所有这些弱分类器的结果加权求和就得到了最后…

ElementUI元件库在Axure中使用

一、ElementUI元件库介绍 ElementUI 是一套为开发者、UI/UX设计师和产品经理准备的基于Vue 2.0的桌面端组件库。它以其优雅的设计和丰富的组件&#xff0c;极大地提升了Web应用的开发效率与用户体验。ElementUI的组件设计精致且符合现代UI规范&#xff0c;包括按钮、表单、弹窗…

判断用户是否在pwa环境中打开运行?(已安装的 PWA 与未安装的 PWA 网站之间有什么区别?)

前言&#xff1a; &#x1f449;vue3tsvite项目中使用vite-plugin-pwa搭建 PWA 项目&#xff0c;以及如何处理pwa安装图标的显示隐藏 &#x1f449;pwa在iframe下能否显示&#xff0c;以及在iframe下相关问题解析 如何判断用户是否在pwa环境中运行? 根据pwa配置的display-mo…

Captive Portal验证原理

物联网开发系列&#xff1a;物联网开发之旅① WiFi to Ethernet: 树莓派共享无线连接至有线网口&#xff0c;自动通过Captive Poartal验证物联网开发番外篇之 Captive Portal验证原理 文章目录 工作原理技术细节登录页面的实现自动化登录 登录界面的原理主要涉及到Web认证&…

想用matlab画一个3Y轴x-y图,如何实现??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Windows 7和Windows10系统如何关闭重复进入Windows启动管理器的现象?

目录 背景: 方法一:使用命令提示符关闭Windows管理器 方法二:通过系统属性来关闭WIndows启动管理器 两种方法的总结: 背景: Windows 启动管理器&#xff08;Windows Boot Manager&#xff09;是 Windows 操作系统中的一个关键组件&#xff0c;它负责在系统启动时管理和引导…

千字解读《2024年前瞻中国AI大模型场景应用趋势蓝皮书》!直击大模型应用五大挑战:最大痛点在于技术面临“卡脖子”风险

7月30日&#xff0c;由前瞻产业研究院携手华为云、首钢基金、深圳上市公司协会联合发起&#xff0c;深圳市政府指导的“深圳产业会客厅——2024人工智能产业对接活动”圆满举办。 会上&#xff0c;前瞻产业研究院院长徐文强以“中国AI发展的必然与挑战”为题&#xff0c;深度剖…

《python语言程序设计》2018版第6章第25(反素数逆向拼写素数)是指一个将其逆向拼写,我不懂反素数公式看不懂。放弃了。

首先使用之前的确认素数的函数is_prime来进行素数的识别 我在网上看到来一个反素数的公式。在这个公式中我还是不能理解&#xff0c;这些数学问题。 我先把对数学的理解放到一边。 之前的版本我是采用对整数化的素数分成二个或三个的位数。然后经过倒序来显示。 I del before …

GooLeNet原理

一、GooLeNet网络结构 1*1卷积的作用&#xff1a; 实现跨通道的交互和信息整合、卷积核通道数的降维和升维&#xff0c;减少网络参数 全局平均池化层(GAP) 优点&#xff1a;抑制过拟合、GAP使特征图输入尺寸更加灵活 缺点&#xff1a;信息丢失、特征丰富性、梯度信息、复杂…

小米澎湃OS 天气-通用版 V15.0.11.0 丨适配大部分 机型

小米澎湃OS 天气-通用版 APP &#xff0c;版本号 V15.0.11.0&#xff0c;基于最新版本提取&#xff0c;纯 64 位架构。非常纯净&#xff01; 「小米天气通用版 V15.0.11.0.apk」 链接&#xff1a;https://pan.quark.cn/s/e16548df0567

如何实现pxe安装部署

此实验环境&#xff1a;rhel7主机 一、kickstart自动化安装脚本 1、安装可视化图形 [rootlocalhost ~]# yum group install "Server with GUI" 2、关闭vmware dhcp功能&#xff08;编辑-虚拟网络编辑器&#xff09; 3、httpd 1、安装httpd服务 [rootlocalhost …

【YOLOv5/v7改进系列】引入卷积块注意力模块CBAM注意力机制

一、导言 CBAM&#xff08;Convolutional Block Attention Module&#xff09;是一种简单而有效的注意力机制模块&#xff0c;旨在增强卷积神经网络&#xff08;CNN&#xff09;的表现力。该模块通过引入两个独立的注意力机制——通道注意力和空间注意力——来适应性地精炼特征…

大模型学习笔记 - LLM 参数高效微调技术

LLM 参数高效微调技术 LLM 高效微调技术 Adapter Tuning (2019 google,在Transformer 结构中嵌入adapter,tuning on BERT)Prefix Tuning (2021.01 斯坦福&#xff0c;通过virtual token构造连续型隐式prompt)Prompt Tuning&#xff08;2021.04&#xff0c;google&#xff09;P…

CSS学习 02 利用鼠标悬停制造按钮边框的渐变方向变化

效果 页面背景为深灰色&#xff0c;使用Karla字体。容器内的按钮居中显示&#xff0c;按钮有一个彩色渐变的边框。按钮的背景为黑色&#xff0c;文字为浅灰色。当鼠标悬停在按钮边框上时&#xff0c;边框的渐变方向变化&#xff0c;按钮文字变为白色&#xff0c;并且按钮内边距…