Mysql数据库--实现主从复制搭建与同步

news2024/10/8 22:59:06

Mysql数据库--实现主从复制搭建与同步

  • 🔻 一、mysql 同步复制有关概述
    • ⛳ 前言、何为主从复制
    • ⛳ 1.1 mysql支持的复制方式
    • ⛳ 1.2 mysql支持的复制类型
      • 1.2.1🍁异步复制
      • 1.2.2🍁同步复制
      • 1.2.3🍁半同步复制
      • 1.2.4🍁[图解]-异步复制 / 同步复制 / 半同步复制
    • ⛳ 1.3 mysql复制解决的问题
    • ⛳ 1.4 mysql复制是如何工作的
  • 🔻 二、mysql 同步复制搭建
    • ⛳ 2.1 主从节点准备
    • ⛳ 2.2 主节点配置
      • 2.2.1 🍁 创建log-bin二进制日志存储路径
      • 2.2.2 🍁 修改my.cnf配置文件
      • 2.2.3 🍁 重启mysql服务,检查是否生效
      • 2.2.4 🍁 主节点创建主从复制账号
      • 2.2.5 🍁 查看主节点的二进制日志的名称
    • ⛳ 2.3 从节点配置
      • 2.3.1 🍁 修改my.cnf配置文件
      • 2.3.2 🍁 在从节点配置需要复制的主机
      • 2.3.3 🍁 在从节点开启slave同步,查看同步状态
    • ⛳ 2.4 主节点创建数据库测试
    • ⛳ 2.5 从节点查看同步数据
      • 2.5.1 🍁 数据测试-主节点插入数据,从节点查看
      • 2.5.2 🍁 数据测试-主节点删除数据,从节点查看
    • ⛳ 2.6 主从同步关闭和开启
  • 🔻 三、mysql 同步复制延迟问题
    • ⛳ 3.1 从节点配置主从同步要求
    • ⛳ 3.2 如何解决【数据不一致性】问题
  • 🔻四、总结—温故知新

在这里插入图片描述

🔻 一、mysql 同步复制有关概述

⛳ 前言、何为主从复制

一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。

如生产环境中,使用redis数据库作为缓存数据库,用户访问业务数据时,先从缓存数据库查询,如果缓存数据库没有,再从业务数据库读取。
在这里插入图片描述

⛳ 1.1 mysql支持的复制方式

  • 基于语句的复制--Statement(Statement-Based Replication,SBR): 在主服务器上执行的sql语句,在从服务器上执行同样的语句。mysql默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选择基于行的复制,每一条会修改数据的sql都会记录在 binlog 中。

  • 基于行的复制--Row(Row-Based Replication,RBR):把改变的内容复制过去,仅保存哪条记录被修改。而不是把命令在从服务器上执行一遍, 从mysql5.0开始支持。

  • 混合类型的复制--Mixed(Mixed-Based Replication,MBR): 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制,Statement 和 Row 的混合体。

  • 通过alter user root identified by '新密码';

⛳ 1.2 mysql支持的复制类型

1.2.1🍁异步复制

  • mysql数据库默认的复制方式
  • 异步复制指主库以异步的方式同步数据到一个从库或多个从库中。
  • 主节点不会主动推送数据到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。
  • 主节点如果掉了,此时主节点上已经提交的事务可能并没有传到从节点上,如果此时,强行将从节点提升为主节点,可能导致新主节点上的数据不完整

1.2.2🍁同步复制

  • 同步复制是mysql主节点特有的复制方式,当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。

1.2.3🍁半同步复制

  • 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回成功信息给客户端
  • 只能保证主库的Binlog至少传输到了一个从节点上,否则需要等待直到超时时间,然后切换成异步模式再提交。

1.2.4🍁[图解]-异步复制 / 同步复制 / 半同步复制

在这里插入图片描述

⛳ 1.3 mysql复制解决的问题

  • 数据分布 (Data distribution )—提高数据操作自然并行度,以达到最优的执行效率的目的
  • 负载平衡(load balancing)—主服务器只负责写,而从服务器只负责读
  • 备份(Backups)—灾难恢复,对损坏的数据进行恢复和还原
  • 高可用性和容错行( High availability and failover)—确保 mysql 数据库在故障和异常情况下仍然能够提供可靠的服务

⛳ 1.4 mysql复制是如何工作的

复制整体来说有 3 个步骤:

  • master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
  • slavemaster的binary log events拷贝到它的中继日志(relay log)
  • slave重做中继日志中的事件,将改变反映它自己的数据
    在这里插入图片描述

🔻 二、mysql 同步复制搭建

⛳ 2.1 主从节点准备

克隆两台安装好mysql8.0的虚拟机,并修改复制的db-server02(从节点)mysql server的UUID。

[root@db-server ~]# vi /var/lib/mysql/auto.cnf

####修改UUID
[auto]
server-uuid=83822642-0030-11ee-a2cc-000c29c2e1ad

####重启mysql服务
[root@db-server ~]# systemctl restart mysqld
mysql服务器Ip
db-server(主节点)192.168.181.101
db-server02(从节点)192.168.181.102

⛳ 2.2 主节点配置

2.2.1 🍁 创建log-bin二进制日志存储路径

###创建二进制日志存储路径
[root@db-server /]# mkdir -p -v /var/log/mysql/mysql-bin
mkdir: created directory ‘/var/log/mysql/mysql-bin’

###赋权mysql用户组合mysql用户
[root@db-server ~]# chown -R mysql:mysql /var/log/mysql
[root@db-server ~]# chown -R mysql:mysql /var/log/mysql/mysql-bin

在这里插入图片描述

2.2.2 🍁 修改my.cnf配置文件

【必须参数】:

####添加内容
[mysqld]
#配置唯一的服务器ID,一般使用IP最后一位
server-id=1
# 设置需要复制的数据库,默认全部记录。比如: binlog-do-db=db_master_slave
binlog-do-db=db_master_slave

#开启log-bin二进制日志,指名路径。如: 本地的路/var/log/mysql/mysql-bin
log-bin=/var/log/mysql/mysql-bin
#设置binlog格式
binlog_format=STATEMENT

在这里插入图片描述

【可选参数】:

# 0表示读写 (主机),1表示只读(从机)
read-only=0

#设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds=6000

#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=20

#设置不要复制的数据库
binlog-ignore-db=test

#设置需要复制的数据库,默认全部记录。比如: binlog-do-db=dbtest01
binlog-do-db=需要复制的主数据库名字

#设置binlog格式
binlog_format=STATEMENT

2.2.3 🍁 重启mysql服务,检查是否生效

[root@db-server mysql]# systemctl restart mysqld
[root@db-server mysql]# systemctl status mysqld
[root@db-server mysql]# mysql -u root -p

mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.02 sec)

mysql> 

###开启log-bin二进制日志
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> 
##skip_networking--tcp/ip协议通信,默认是OFF关闭状态,启用后主从将无法通信
mysql> show variables like '%skip_networking%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> 

2.2.4 🍁 主节点创建主从复制账号

  • mysql5.7版本:
mysql> grant replication slave on *.*  to  'slave1'@'%'  identified by 'Zyl@123456';  ###用户地址可以指定从机IP192.168.181.102
  • mysql8.0版本:
mysql> create user 'slave1'@'%' identified by 'Zyl@123456'; 
Query OK, 0 rows affected (0.02 sec)

mysql>grant replication slave on *.*  to  'slave1'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql>alter user 'slave1'@'%' identified with mysql_native_password by 'Zyl@123456'; 
Query OK, 0 rows affected (0.02 sec)

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

在这里插入图片描述

2.2.5 🍁 查看主节点的二进制日志的名称

  • File和Position两个参数需要在从库配置中使用。
mysql> show master status;
+------------------+----------+-----------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB    | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+-----------------+------------------+-------------------+
| mysql-bin.000004 |      157 | db_master_slave |                  |                   |
+------------------+----------+-----------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> 

⛳ 2.3 从节点配置

2.3.1 🍁 修改my.cnf配置文件

【必须参数】:

[mysqld]
#配置唯一的服务器ID,一般使用IP最后一位
server-id=2

###开启中继日志,从主服务器上同步日志文件记录到本地
relay-log=relay-log-bin

【可选参数】:

[mysqld]
###定义中继日志文件的位置和名称
relay-log-index=slave-relay-bin.index

2.3.2 🍁 在从节点配置需要复制的主机

####语法##
change master to 
master_host='主节点IP',
master_user='主节点用户名',
master_password='用户密码',
master_log_file='mysql-bin.具体数字',
master_log_pos=具体值;

####本环境配置##

mysql> change master to master_host='192.168.181.101',master_user='slave1',master_password='Zyl@123456',master_log_file='mysql-bin.000004',master_log_pos=157 ;
Query OK, 0 rows affected, 8 warnings (0.06 sec)

mysql> 

在这里插入图片描述

2.3.3 🍁 在从节点开启slave同步,查看同步状态

####开启slave同步
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.05 sec)

####查看同步状态
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.181.101
                  Master_User: slave1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 157
               Relay_Log_File: relay-log-bin.000006
                Relay_Log_Pos: 373
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 

mysql> 

在这里插入图片描述

⛳ 主要看这两个参数,两个参数的值都为Yes,即主从配置搭建成功:

  • Slave_IO_Running:IO线程,负责与主机的io通信
  • Slave_SQL_Running:SQL线程,责自己的slave MySQL进程

如果报错Slave failed to initialize relay_log info structure from the repository,需要清理之前的relay_log,重新启用新的relay_log即可。

reset slave;

⛳ 2.4 主节点创建数据库测试

  • 主节点配置的db_master_slave
####主节点创建数据库db_master_slave
mysql> create database db_master_slave;
Query OK, 1 row affected (0.01 sec)

mysql> use db_master_slave
Database changed
mysql> 

####创建表
mysql> CREATE TABLE `tab1`  (
    ->   `id` int NOT NULL,
    ->   `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
    ->   `class` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
    ->   PRIMARY KEY (`id`) USING BTREE
    -> ) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
Query OK, 0 rows affected, 6 warnings (0.02 sec)

mysql> 

####插入测试数据
mysql> INSERT INTO `tab1` VALUES (1001, '曹操', '1班');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `tab1` VALUES (1002, '张飞', '1班');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `tab1` VALUES (1003, '项羽', '3班');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `tab1` VALUES (1004, '刘备', '2班');
Query OK, 1 row affected (0.00 sec)

mysql> 

⛳ 2.5 从节点查看同步数据

2.5.1 🍁 数据测试-主节点插入数据,从节点查看

mysql> show databases;

在这里插入图片描述

###查看tab1表数据
mysql> select * from tab1;
+------+--------+-------+
| id   | name   | class |
+------+--------+-------+
| 1001 | 曹操   | 1|
| 1002 | 张飞   | 1|
| 1003 | 项羽   | 3|
| 1004 | 刘备   | 2|
+------+--------+-------+
4 rows in set (0.00 sec)

mysql> 

2.5.2 🍁 数据测试-主节点删除数据,从节点查看

在这里插入图片描述
在这里插入图片描述

⛳ 2.6 主从同步关闭和开启

  • 🍁 停止主从服务复制的功能------从机执行
####开启slave同步
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.05 sec)


####关闭slave同步
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)

🔻 三、mysql 同步复制延迟问题

⛳ 3.1 从节点配置主从同步要求

  • 🍁 读库与写库数据一致(最终一致)
  • 🍁 写数据必须写到写库
  • 🍁 读数据不一定必须到读库

主从同步复制的内容是二进制文件,在传输过程中会存在主从延迟的情况,会导致用户在从库读取的数据不是最新数据----->即数据不一致性问题。

⛳ 3.2 如何解决【数据不一致性】问题

  • 🍁 异步复制—master执行操作后直接返回给client结果,不再等待slave反馈同步信息,但这种方式数据一致性最弱。
  • 🍁 半同步复制—只要有一个slave复制了该事务并成功执行完就返回成功信息给client,这种方式提高了数据一致性,但是增加了网络延迟时间,降低了主库写的效率。
  • 组复制(MGR)----mysql 5.7.17 推出的新的数据复制技术,基于Paxos协议复制,很好的弥补了前面两种复制的不足。

在这里插入图片描述

🔻四、总结—温故知新

❓ 了解何为主从复制
❓ mysql支持的复制类型之间区别,以及解决的问题
❓ mysql主从复制搭建
❓ mysql主从复制延迟及解决方案

👈【上一篇】
💖The End💖 点点关注,收藏不迷路💖
【下一篇】👉

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

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

相关文章

Spring高手之路2——深入理解注解驱动配置与XML配置的融合与区别

文章目录 1. 配置类的编写与Bean的注册2. 注解驱动IOC的依赖注入与XML依赖注入对比3. Spring中组件的概念4. 组件注册5. 组件扫描5.1 使用ComponentScan的组件扫描5.2 xml中启用component-scan组件扫描5.3 不使用ComponentScan的组件扫描 6. 组件注册的其他注解7. 将注解驱动的…

MySQL 5.7 主从集群搭建

IP功能Linux版本192.168.56.136MasterCentOS 7.9192.168.56.140SlaveCentOS 7.9 一、安装前的准备 1、卸载老版本 (1)查看是否安装mariadb(centos7默认安装) 命令: rpm -qa | grep mariadb (2&#xff…

嵌入式软件工程师培训:提升技能、实现卓越

如果您对嵌入式培训感兴趣,以下是一些建议和关键点,可以帮助您进行嵌入式培训: 培训目标:明确确定您的嵌入式培训目标。是为了提升员工的技能水平,使他们能够承担更高级别的嵌入式开发工作,还是为了向非嵌入…

16、DMA直接存储区访问

0x01、DMA简介 DMA(Direct Memory Access)一直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以于其他的事情,好像是多线程一样数据传输支持从…

2022 中国开源创新大赛,时序数据库 TDengine 榜上有名

近日,2022 中国互联网发展创新与投资大赛暨 2022 年中国开源创新大赛在北京落下帷幕,本次大赛由中央网信办信息化发展局指导,中国互联网发展基金会、中国网络空间研究院、中国互联网投资基金联合主办。非常荣幸的是,凭借着强大的开…

他们用卫星,让中国量子通信领跑全球

光子盒研究院 上周二(5月30日),中国宣布其神舟十六号飞船与天宫三号空间站成功对接,官方媒体称景海鹏、朱杨柱和桂海潮这三名中国宇航员将有机会研究“新的量子现象”。这意味着中国量子技术发展的一大突破:我们现在可…

IVD体外诊断已经发展成为医疗健康市场活跃领域之一

体外诊断领域的布局覆盖免疫诊断、血液诊断、尿液诊断、生化诊断、微生物诊断等。得益于自主研发驱动下的技术积累和产品创新 近年来,体外诊断已经发展成为医疗健康市场最活跃、增长最快的领域之一。 从全球体外诊断发展来看,据Kalorama Information的统…

接口测试 —— Requests库介绍

1、Requests库 Requests库是用Python语言编写,基于urllib3模块,采用Apache2 Licensed开源协议的 HTTP 库。 虽然Python的标准库中urllib3模块已经包含了平常我们使用的大多数功能,但是它的 API使用起来让人感觉不太友好。而Requests库使用的…

Vue+springboot果蔬有机蔬菜商城销售种植系统与设计

对于网站的前台设计,要保证主界面的整洁有序,能够抓住人的眼球,不会产生视觉疲劳,更重要的是,带给人容易操作的直观感受,这样才能留住用户去进行使用,增加三分热度的延续期。在系统的后台设计上…

2023预备金九银十,400道阿里必问软件测试高频面试考点详细解析

前言 临近秋招,又到了“金九银十”面试求职高峰期,在金九银十时也参与过不少面试,2023都说工作不好找,也是对开发人员的要求变高。前段时间自己有整理了一些软件测试面试常问的高频考点问题做成一份PDF文档(400道高频…

东软、联影、科曼在今届CMEF好猛, “挖挖”背后的共同点

走出三年疫情阴霾,医疗行业迎来爆发式的展会营销盛况。5月14-17日,为期4天的第87届中国国际医疗器械博览会(CMEF)在上海圆满落幕! 在这场32万平方米的全球医疗产业“航母级”盛会中,一众行业大咖、来自120…

优思学院|如何通过实验设计改善产品质量?

你的企业是否经常因为产品和服务不符合客户的期望而感到苦恼?你是否在想有没有一种方法可以在任何时候都可以帮助你解决问题? 那么,您需要一种突破性改进工具,它也是六西格玛项目中的”杀手锏",它称为实验设计&a…

玩转学生信息管理系统——【c++】

设计一个管理系统实现对学生的基本信息(至少包括姓名、学号、性别、出生日期、宿舍号年龄(通过计算得到)的管理;),具有数据的录入、显示、保存、查询(按学号查查询或姓名查询)、修改…

ASP.NET State Service服务无法启动解决方案

客户服务器ASP.NET State Service启动不起来,如下图所示: 在服务中右击属性查看基本信息,发现aspnet_state.exe在目录中不存在,如下图所示: 若想正常启动,需要重新指向有exe的目录中去,解决方案…

Linux之问件上传下载

目录 Linux之文件上传下载 sftp 定义 用法 常用操作 查看当前目的主机的路径 --- pwd 查看当前本地所在路径 --- lpwd 更改当前目的主机的路径 --- cd 更改当前本地所在路径 --- lcd 查看当前目的主机 --- ls ​编辑 查看当本地的主机目录 --- lls ​编辑 将Window…

08SQL基础知识

SQL知识点 1、SQL语言分类 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组…

耗时122天,终于把牛客网点赞飙升的Java面试题(含答案)整理出来了

2023年就业形势不算好,大厂缩招裁员导致优质岗位竞争变得更加激烈,除了对面试者技术的要求变高,面试的深度和难度较去年也有所加大。为了让大家能够在 2023 金九银十跳槽黄金期脱颖而出,想拿个好 offer 说实话,现在准备…

企业上云,你做对了吗?

数字化转型是国家战略,各位估计眼睛看这几个字都看出茧了。所以,今天不聊数字化转型,今天聊企业上云。 随着云计算技术的日益成熟和云计算服务商的不断涌现,越来越多的企业将业务应用迁移到云端。但是,企业上云“坑”…

2023大唐杯学习笔记——人工智能与机器学习—决策树

决策树知识点 这个表也是一个数据集 问题:以什么作为划分呢?第一次是以年龄,还是以 工作 房子 信贷情况… 这里的熵与中文里的其他东西没有实际对应,就是一个定义H(p)1最大时,p0.5,这…

串口助手(串口发送接收数据, 定时, 清空, hex显示)

文章目录 前言一、串口接收数据1. 默认接收,换行,hex显示2. 清空接收区数据3. 保存接受区数据 二、串口发送数据1. 默认发送2. 定时发送 三、串口助手优化1. 设置组合框当前内容。2. 未检测到串口,弹出警告。3. 载入文件 总结 前言 这篇文章…