浅谈MySQL主从复制

news2024/11/23 16:28:03

目录

1.MySQL主从复制是什么

2.MySQL主从复制的意义

3.MySQL主从复制原理

4.数据同步一致性问题

5.实现方式


1.MySQL主从复制是什么

MySQL主从复制就是指数据可以从一台MySQL的主节点复制到一个或多个从节点。

MySQL默认采用异步复制方式,这样从节点不用一直访问主服务器来更新数据,数据更新可以仅复制特点的数据库、表等。

2.MySQL主从复制的意义

1)为了实现读写分离,让主服务器负责写,从服务器负责读。这样可以保证当主库更新数据进行锁表时也可以读取数据。主从复制是读写分离的前提。

2)做数据的热备。可以备份数据。当主节点挂掉了,还可以访问从节点的数据。

3)降低磁盘的I/O访问频率,提高单个机器的I/O性能。

3.MySQL主从复制原理

简单来说,MySQL主从复制主要依靠两个二进制文件:Binary Log和Relay log,还有两个进程:I/O Thread和SQL Thread实现。

如下图所示:

当主服务器(master)发生数据更新时,会将其(data changes)写入Binary log的日志文件中;从服务器(slave)会定时对Binary log进行探测,判断其是否发送改变:如果改变,则启动从服务器中的 I/O Thread线程,读取Binary log文件中的内容,并将其写入至自己的Relay log日志文件中;然后使用SQL thread读取Relay log中的内容,最后进行replay,逐一解析为sql语句执行,复制数据库数据。过程完成后,I/O Thread和SQL thread进入休眠,直至下一次唤起。

关于Binary log记录的data changes,有以下两种类型选择:

  • statement:每一条数据更新都会记录到binary log中。(即记录sql语句)
  • row:基于行的复制,仅记录哪条记录被修改了,修改成什么样。(即记录数据的修改行为)

4.数据同步一致性问题

由于网络传输中会存在主从延迟,可能会导致用户从从服务器上读取的数据不是主服务器上最新的数据的问题,即主从同步中的数据不一致性问题。从数据一致性弱到强,有以下三种方式:

  • 异步复制:主服务器执行事务后直接提交,不等待从服务器的确认通知。(数据一致性较弱,主服务器提交时刻t1到从服务器复制完成时刻t2之间读取数据,就会存在一致性问题)
  • 半同步复制:主服务器执行事务后等待至少一个从服务器接收到了binary log并写入中继日志后后,得到确认通知(ack)后认为写操作完了,再返回给客户端。
  • 组复制:基于Paxos协议的状态机复制。即将多个节点组成一个复制组。在执行读写事务时,需要一致性协议层的同意(即同意的节点数>N/2 +1),才可以提交;在执行只读事务时则不需要经过组内同意。

5.实现方式

本次案例以linux操作系统为例:

首先,需要准备两个ip地址,分别安装同一版本的MySQL。否则,进行数据复制时可能会导致错误。

服务器ip地址mysq版本
master192.168.0.200:33065.7
slave192.168.0.201:33065.7

(1)进入主数据库,创建用户,并且给该用户(seven)授予REPLICATION SLAVE权限

GRANT REPLICATION SLAVE ON *.* to 'seven'@'%' identified by 'Root@123456';

修改配置文件(在/conf/my.cnf文件):

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
## 设置server_id, 同一个局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

(请注意server_id唯一;修改完成后重启mysql)

进入Mysql master,记录以下数据:

 (2)进入从服务器,修改配置:

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
## 设置server_id, 同一个局域网内需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置只读(具有super权限的用户除外)
read_only=1

(server_id必须不一致,同理,配置完成后重启mysql)

然后,在从服务器中设置主库地址及同步位置:

change master to master_host='masterd的ip',master_user='刚刚创建的用户名',master_password='Root@123456',master_log_file='masterd的file(show master status中查得)',master_log_pos=154;

参数说明:

  • master_host : 主数据库的IP地址
  • master_user : 访问主库进行主从复制的用户名(上面创建并赋予slave权限的)
  • master_password : 访问主库进行主从复制的用户名对应的密码(请注意密码对应)
  • master_log_file : 从哪个日志文件开始同步
  • master_log_pos : 从指定日志文件的哪个位置开始同步

(注意:master_log_file和master_log_pos的值都为刚刚截图记录的值)

最后,在从服务器开启主从复制:

 start slave;

主从复制即成功。

(3)我们可以在从机查看主从复制状态:

show slave status \G

 Slave_IO_Running和Slave_SQL_Running两个参数都为yes,即成功。

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

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

相关文章

【博学谷学习记录】超强总结,用心分享丨人工智能 Python基础 个人学习总结之列表排序

目录前言简述list.sort()语法返回值实例无参参数key参数reversesorted()语法返回值实例无参参数key参数reverseoperator.itemgetter功能简述实例List.sort与sored区别sorted原理:Timsort算法扩展list原理数据结构心得前言 经过一周的学习,对Python基础部…

嵌入式入门必看!调试工具安装——基于 AM64x核心板

本章节内容是为评估板串口安装USB转串口驱动程序。驱动适用于CH340、CH341等USB转串口芯片。 USB转串口驱动安装 适用安装环境:Windows 7 64bit、Windows 10 64bit。 本文测试板卡为创龙科技SOM-TL64x核心板,它是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cort…

DP(4)--区间DP

将n(1≤n≤200)堆石子绕圆形操场摆放,现要将石子有次序地合并成一堆。 规定每次只能选相邻的两堆石子合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 (1)选择一种合并石子的方案,使得做n-1次合并,得分的总…

比特数据结构与算法(第四章_下)二叉树的遍历

本章将会详细讲解二叉树遍历的四种方式,分别为前序遍历、中序遍历、后续遍历和层序遍历。在学习遍历之前,会先带大家回顾一下二叉树的基本概念。学习二叉树的基本操作前,需要先创建一颗二叉树,然后才能学习其相关的基本操作&#…

中国一直是亚马逊云科技在全球业务布局中最重要的国家之一

在走进经济筑底重启回升的2023年,我们该如何直面这场需要时间验证的修复之旅?亚马逊全球副总裁、亚马逊云科技大中华区执行董事张文翊与《经济观察报》App的“企业家说2023”栏目展开对谈,分享亚马逊云科技如何立于云端,帮助企业上…

Android ART dex2oat

一、什么是dex2oat Dex2oat (dalvik excutable file to optimized art file) ,是一个对 dex 文件进行编译优化的程序,在我们的 Android 手机中的位置是 /system/bin/dex2oat,对应的源码路径为 android/art/dex2oat/dex2oat.cc,通…

谷歌搜索技巧大全 | 谷歌高级搜索语法指令

谷歌搜索技巧是利用各种高级搜索语法或者搜索指令,让我们能够使用Google进行精确化的搜索,外贸找客户和学术文件查找都可以应用到这些搜索技巧。(大部分命令也适用百度搜索)。Google通过互联网收集数据,抓取有意义的信息,将其存储…

flask入门-4.项目实战

4. 项目实战1 1. 问答平台项目结构搭建 项目结构 config.py hostname "127.0.0.1" port 3306 username "root" password "root"database "flask_qa"# 在 app.config 中设置连接数据库的信息 SQLALCHEMY_DATABASE_URI f"…

【Redis】什么是缓存与数据库双写不一致?怎么解决?

1. 热点缓存重建 我们以热点缓存 key 重建来一步步引出什么是缓存与数据库双写不一致,及其解决办法。 1.1 什么是热点缓存重建 在实际开发中,开发人员使用 “缓存 过期时间” 的策略来实现加速数据读写和内存使用率,这种策略能满足大多数…

ECharts基础知识详细介绍

文章目录知识点ECharts 实例ECharts 基础配置组件seriesdataset用 option 描述图表titletooltiplegend 图例组件toolbox 工具栏坐标轴知识点 ECharts 实例series 与 datasetECharts 基础配置用 option 描述图表坐标系 ECharts 实例 一个网页中可以创建多个 ECharts 实例。每个…

JPA——Java.util.Date和Java.sql.Date

纵观整个项目的字段,最难搞的就是Date类型。今天我们就好好唠唠java中的两个Date类 一、Java.sql.Date 1. 构造方法 Date date new Date(System.currentTimeMillis());System.out.println(date);//2023-02-282. 常用方法: 方法作用void setTime(long…

【Java开发】JUC基础 04:Synchronized、死锁、Lock锁

1 概念介绍并发:同一个对象被多个线程同时操作📌 线程同步现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题,比如,食堂排队打饭,每个人都想吃饭,最天然的解决办法就是,排队…

强化学习RL 04: Actor-Critic Algorithm

actor: 是policy network,通过生成动作概率分布,用来控制agent运动,类似“运动员”。critic: 是value network,用来给动作进行打分,类似“裁判”。构造这两个网络,并通过environment奖励来学习这两个网络。…

AQS抽象队列同步器

aqs 抽象队列同步器,内部存储了一个valitail修饰的status 和内部类node ,来实现对共享变量并发同步队列机制,以reentrantLock为例,lock底层实际上调用的是sync的lock,会调用cas对status的状态进行修改,来确定是否获得锁…

学习 Python 之 Pygame 开发魂斗罗(七)

学习 Python 之 Pygame 开发魂斗罗(七)继续编写魂斗罗1. 载入水中图片并添加在水中的标志2. 修改玩家类函数3. 增加河的碰撞体4. 实现玩家在河中的样子继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(六)中&#…

csgo搬砖项目详细拆解,附选品+详细操作教程

项目实操 一:项目原理 csgo这款游戏不知道大家玩过没有,如果不了解的话,那你肯定知道穿越火线这款游戏吧,都是一个类型的射击游戏。 说到csgo,就得所以一下今天项目的平台steam,它是一个游戏平台&#x…

Redis面试问题总结

1. 什么是Redis?Redis 是一个使用 C 语言写成的,开源的高性能key-value非关系缓存数据库。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。…

【Redis】Redis主从同步中数据同步原理

【Redis】Redis主从同步中数据同步原理 文章目录【Redis】Redis主从同步中数据同步原理1. 全量同步1.1 判断是否第一次数据同步2. 增量同步3. 优化Redis主从集群4. 总结1. 全量同步 主从第一次同步是全量同步。 数据同步包括以下三个阶段: 在从节点执行slaveof命令…

技术分担产品之忧(上):挑选有业务专家潜力的人

你好,我是王植萌,去哪儿网的高级技术总监、TC主席。从2014年起,担任一个部门的技术负责人,有8年技术总监经验、5年TC主席的经验。这节课我会从去哪儿网产研融合的经验出发,和你聊一聊怎么让技术分担产品之忧。 技术分…

SSL证书与我们普通人之间有什么关系

对于很多普通人来说,SSL证书似乎会感到很陌生,总觉得离自己很遥远,从而并没有引起察觉。要是这么想的话那么就真的大错特错了,其实SSL证书与我们普通人之间还是很密密相关的,是我们应该都需要关注的,下面就…