【SQL】主从复制

news2024/11/19 15:23:58

主从复制

  • 主从复制的作用
  • 主从复制的原理
  • 一主一从架构
    • 主从配置文件
      • 1.主机配置
      • 2.从机配置
      • 3.主机建立账户并授权
      • 4.从机:配置需要复制的主机
      • 5.测试
      • 6.停止主从同步
    • binlog_format三种格式
  • 双主双从架构

如何提升数据库并发能力:
在实际工作中,我们常常将 redis作为缓存与MySQL配合来使用,当有请求时,会首先从缓存中进行查找,如果存在就直接取出。不存在再访问数据库,这样就提升了读取效率,减少后端数据库的访问压力。redis的缓存架构是高并发架构中非常重要的一环。

此外,一般应用对数据库而言都是“ 读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是采用数据库集群的方案,做主从架构、进行读写分离,这样同样可以提升数据库的并发处理能力。但并不是所有的应用都需要对数据库进行主从架构的设置,毕竟设置架构本身是有成本的。
如果我们的目的在于提升数据库高并发访问的效率,那么首先考虑的是如何优化SQL和索引,这种方式简单有效;其次才是采用缓存的策略,比如使用 Redis将热点数据保存在内存数据库中,提升读取的效率;最后才是对数据库采用主从架构,进行读写分离。

在这里插入图片描述

主从复制的作用

  1. 读写分离
    在这里插入图片描述

  2. 数据备份 通过主从复制将主库上的数据复制到了从库上,相当于是一种热备份机制,也就是在主库正常运行的情况下进行备份,不会影响到服务。

  3. 高可用性 数据备份实际上是一种冗余机制,通过这种冗余方式可以换取数据库的高可用性,也就是当服务器出现故障或宕机的情况下,可以切换到从服务器上,保证服务的正常运行。

主从复制的原理

Slave 从Master 读取binlog 来进行数据同步。
在这里插入图片描述
在这里插入图片描述
在进行主从复制时,先检查服务器是否开启二进制日志备份。默认情况下从机会执行所有主机中保存的事件,也可以通过配置,使从服务器执行特定的事件。

复制三步骤:
步骤1: Master 将写操作记录到二进制日志( binlog )。
步骤2: Slave 将Master 的binary log events拷贝到它的中继日志( relay log );
步骤3: Slave 重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的,而且重启后从接入点开始复制。

复制的基本原则:
每个Slave 只有一个Master
每个Slave 只能有一个唯一的服务器ID
每个Master 可以有多个Slave

一主一从架构

在这里插入图片描述

主从配置文件

1.主机配置

建议mysql版本一致且后台以服务运行,主从所有配置项都配置在[mysqld] 节点下,且都是小写字母。
vim /etc/my.cnf
具体参数配置如下:

#[必须]主服务器唯一ID
server-id=1
#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
log-bin=mysql01-bin
#[可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=0
#设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds=6000
#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=200M
#[可选]设置不要复制的数据库
binlog-ignore-db=test
#[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=mysql01_master_slave
binlog-do-db=需要复制的主数据库名字
#[可选]设置binlog格式
binlog_format=STATEMENT

修改配置文件后重启mysql服务器。systemctl restart mysql

2.从机配置

要求主从所有配置项都配置在my.cnf 的[mysqld] 栏位下,且都是小写字母。

#[必须]从服务器唯一ID
server-id=2

#[可选]启用中继日志
relay-log=mysql-relay

修改配置文件后重启mysql服务器。systemctl restart mysql

注意:主从机都关闭防火墙
service iptables stop #CentOS 6
systemctl stop firewalld.service #CentOS 7

3.主机建立账户并授权

主机建立账户,进行主从复制权限的赋值,在从机中读取。

#在主机MySQL里执行授权主从复制的命令
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'从机器数据库IP' IDENTIFIED BY 'abc123';
#5.5,5.7

注意:如果使用的是MySQL8,需要如下的方式建立账户,并授权slave:

# 创建账户
CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
# 授予权限
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';

ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

查询Master的状态,并记录下File和Position的值。
show master status;
注意:执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化。

4.从机:配置需要复制的主机

  1. 从机上复制主机的命令:
CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;

举例:

CHANGE MASTER TO
MASTER_HOST='192.168.130.4',MASTER_USER='slave1',MASTER_PASSWORD='123456',MASTER_LOG_F
ILE='mysql01-bin.000003',MASTER_LOG_POS=154;
  1. 启动slave同步:start slave;
  2. 查看同步状态:show slave status\G;

在这里插入图片描述

5.测试

主机新建数据库、表,进行插入操作

CREATE DATABASE mysql01_master_slave;
CREATE TABLE mytbl(id INT,NAME VARCHAR(16));
INSERT INTO mytbl VALUES(1, 'zhang3');
INSERT INTO mytbl VALUES(2,@@hostname);

6.停止主从同步

stop slave;
重启:start slave;
如果报错,可使用如下操作重新配置:

mysql> reset slave; 	#删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件
mysql> reset master; 		#删除Master中所有的binglog文件,并将日志索引文件清空,重新开始所有新的日志文件(慎用)

binlog_format三种格式

  1. STATEMENT模式(基于SQL语句的复制(statement-based replication, SBR))
    默认格式,记录每一条修改的sql语句

优点:

  • 不需要记录每一行的变化,减少了binlog日志量,文件较小
  • binlog中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
  • binlog可以用于实时的还原,而不仅仅用于复制
  • 主从版本可以不一样,从服务器版本可以比主服务器版本高

缺点:

  • 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候
    使用以下函数的语句也无法被复制:LOAD_FILE()、UUID()、USER()、FOUND_ROWS()、SYSDATE()(除非启动时启用了 --sysdate-is-now 选项)
    INSERT … SELECT 会产生比 RBR 更多的行级锁
    复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
    对于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 语句会阻塞其他 INSERT 语句
    对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响
    执行复杂语句如果出错的话,会消耗更多资源
    数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
  1. ROW模式(基于行的复制(row-based replication, RBR))
    假如执行了一个update操作,有100条记录发生变化,statement模式只会记录这一条sql语句,而row模式则记录了这100条记录的变化,具体用哪条sql语句写的,就不得而知。
    不记录每条sql语句的上下文信息,仅记录哪条数据被修改了,修改成什么样了

优点:

  • 任何情况都可以被复制,这对复制来说是最安全可靠的。(比如:不会出现某些特定情况下的存储过程、function、trigger的调用和触发无法被正确复制的问题)
  • 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多复制以下几种语句时的行锁更少:INSERT … SELECT、包含AUTO_INCREMENT 字段的 INSERT、
  • 没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句
  • 执行 INSERT,UPDATE,DELETE 语句时锁更少
  • 从服务器上采用多线程来执行复制成为可能

缺点:

  • binlog 大了很多
  • 复杂的回滚时 binlog 中会包含大量的数据
  • 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
  • 无法从 binlog 中看到都复制了些什么语句
  1. MIXED模式(混合模式复制(mixed-based replication, MBR))
    Mixed格式,实际上就是Statement与Row的结合。
    在Mixed模式下,一般的语句修改使用statment格式保存binlog。如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog。
    MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

双主双从架构

在这里插入图片描述

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

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

相关文章

B站运营,B站游戏数据如何分析?

B站聚集了大部分年轻人,用户量和黏性一直持续增长,在B站,游戏也是重点发展的一个分区,而对于运营者想做好游戏运营也并非易事,想做好运营掌握游戏数据必不可少,那么应该如何查看游戏数据呢? 一…

童年 高尔基

每周读一本经典,大概从2022年11月开始了,目前已经读了4本,csdn平台更适合技术分享,知乎比较适合书籍分享 《童年》是高尔基三部曲中的第一部。坐在柳东图书馆像海水浸过的沙子般座椅,周末的下午沉浸在高尔基先生奇特的…

线程池应用(四)

线程池应用线程池线程池应用多线程应用同步和异步1. 需要等待结果1. join 实现(同步)2. Future 实现(同步)3.CompletableFuture 实现(异步)4. BlockingQueue 实现(异步)2. 不需等待结…

5分钟搞定,实现 定时任务 的五种方案!

我们在实际开发中,多多少少都会用到定时任务来处理一些问题。 比如金融项目中的对账,每天定时对昨天的账务进行核对,每个月初对上个月的账务进行核对等。 还比如,我们需要处理一些老数据迁移,修复一些新项目和老项目…

基于java+springboot+mybatis+vue+mysql的财务管理系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时…

CI24R1/SI24R1 2.4G无线传输技术--无线门铃

无线门铃是一种基于2.4G无线传输技术的智能家居产品,主要用于亲朋好友探访的语音提醒功能。此次方案采用2.4G无线通信设计,室内和室外子母机组网,在智能家居及办公场所等方面得到广泛的应用。 一、应用场景 适用于居民社区、家庭、公寓、酒店…

2-2-3-5-5、Disruptor详解

目录简介juc包下的队列存在的问题设计方案RingBuffer数据结构数据存取方案常用等待策略写数据流程单线程(一个生产者)多线程(多个生产者)多个消费者读数据多个生产者写数据核心概念使用构造器引入依赖单生产者单消费者模式创建Eve…

微信公众号开发——接收用户消息(图文、语言、上报位置、关注、取消关注)及自动回复

😊 作者: 一恍过去💖 主页: https://blog.csdn.net/zhuocailing3390🎊 社区: Java技术栈交流🎉 主题: 微信公众号开发——接收用户消息(图文、语言、上报位置、关注、取消关注)及…

推动MRO工业品数字化基建升级,数商云采购系统赋能企业采购数字化管理

MRO工业品是工业生产中的重要组成部分,经历了十余年的发展成长,市场规模持续增长,然而据数据显示,MRO工业品市场的线上渗透率仍停留在个位数,这意味着MRO工业品数字化采购仍有巨大的发展空间。 MRO工业品行业发展受困…

非零基础自学Golang 第1章 走进Go 1.1 Go编程语言概述 1.1.1 Go 的历史

非零基础自学Golang 文章目录非零基础自学Golang第1章 走进Go1.1 Go编程语言概述1.1.1 Go 的历史第1章 走进Go 1.1 Go编程语言概述 Go语言也叫Golang,是由谷歌(Google)公司在2007年推出的一款静态编译型语言。Go语言高效、简洁、容易上手&a…

上海诺基亚贝尔-S-010W-AV2B卡刷固件包

上海诺基亚贝尔-S-010W-AV2B卡刷固件包 固件特点: 1、修改dns,三网通用; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、无开机广告,无系统更新,不在被强制升级; 4、大量精简内置的没用的…

最新版Crack:MailBee.NET 2022最后版

MailBee.NET Items Package 包括 SMTP、POP3、IMAP、EWS、Security、Antispam、Outlook Converter、Address Validator、PDF 部件,以及作为免费功能的 BounceMail、HTML、MIME、ICalVCard 部件。MailBee.NET Objects是一组功能强大且功能丰富的 .NET 元素&#xff0…

基于nodejs如何爬取csdn上自己的文章

当你想把自己在csdn上写的文章转为hexo上可以发布的文章或是将文章写入自己的数据库时,可以用到 将所有博客数据写入数据库 获取你的文章的分页接口: 在浏览自己的所有文章时,我们不难发现,文章的数据是往下滑动到底时,才会刷新出新的数据, 那么此时肯定是发送了一个请求来获…

一篇文章教你实战Docker容器数据卷

在上一篇中,咱们对Docker中的容器数据卷做了介绍。已经知道了容器数据卷是什么?能干什么用。那么本篇咱们就来实战容器数据卷,Docker容器数据卷案例主要做以下三个案例 1:宿主机(也就是Docker所安装的机器)与容器之间的映射-让Do…

LeetCode 538. 把二叉搜索树转换为累加树(C++)

标签:二叉树搜索 深度优先遍历 二叉树 思路一:递归实现反向中序遍历,并累加递归过程中的根的值 思路二:使用迭代,给每个根节点添加一个反向中序遍历的前驱节点。 原题链接:https://leetcode.cn/problems/co…

数据分析业务场景 | CTR预估

一.概况 定义 是推荐中最核心的算法之一 对每次广告的点击情况做出预测,预测用户是点击还是不点击 就是预测点击与否的而分类算法,成功的关键之一就是样本的准确性 对于正样本,一般可发挥的空间不是很大,最多就是卡一个停留时…

LinkedList源码解析

LinkedList源码解析 简介 LinkedList 是一个双向链表(内部是 Node 节点)实现的 List,并且还实现了 Deque 接口,它除了作为 List 使用,还可以作为队列或者栈来使用。 这样看来,LinkedList 简直就是个全能…

【文字版】津津有味:感染新冠后没食欲,那咱也得吃饭啊!

点击文末“阅读原文”即可收听本期节目剪辑、音频 / 朱峰 编辑 / 姝琦 SandLiu监制 / 姝琦 文案 / 粒粒 产品统筹 / bobo你阳了吗?你嗓子疼吗?你的食欲还好吗?没有什么比好好吃饭更重要,生病的时候尤其是。营养对健康而言是预防…

浏览器上的Cookies有什么用?超级浏览器防关联如何实现?

Cookies是浏览器的指纹信息之一,它是一种文本文件,是网站为了辨别用户身份,对用户进行记录并由户客户端计算机进行暂时或永久保存的信息。一般情况下,网站对浏览器的指纹的记录主要是依靠Cookies来实现的。因为超级浏览器来可以生…

[附源码]JAVA毕业设计英语网站(系统+LW)

[附源码]JAVA毕业设计英语网站(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&#xf…