MySQL主从复制的原理和实现

  • 垂直扩展:
  • 横向扩展:

  • 复制:使每一个节点都有相同的数据集

  • MySQL复制的实现:使用二进制日志来实现

  • 提高性能(负载均衡)、 实现读写分离

  • 实现数据备份的功能(实时备份)
  • 高可用,故障切换

  • 一主一从:一个master,一个slave

  • 一主多从:一个master,多个slave

master:负责写操作
slave:负责读操作

  • 中继日志其实就是二进制日志,就是换了个说法,叫做中继日志
  • 没有开启主从复制之前,默认是没有这三个线程的
  • 查看线程的方法:show processlist

  • dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events

  • I/O Thread:向Master请求二进制日志事件,并保存于中继日志中

  • SQL Thread:从中继日志中读取日志事件,在本地完成重放

  • master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等

  • relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地relay log日志的对应关系
  • mysql-relay-bin.00000#: 中继日志,保存从主节点复制过来的二进制日志,本质就是二进制日志

注意:MySQL8.0取消了master.info和relay-log.info这两个文件.

  • 一主–一从
  • 一主–多从
  • 从服务器还可以再有从服务器
  • 主–主
  • 一从–多主:适用于多个不同数据库
  • 环状复制

注意:复制需要考虑二进制日志事件记录格式

  • 建议把二进制日志也开启,到时候主节点坏了,可以把从节点提升为一个新的主节点。
  • 建议把从节点设为只读,确保数据不能被误操作。
  • 从节点连接到主节点的命令:
    可以通过 help change mster这个命令来查看使用范例。
CHANGE MASTER TO MASTER_HOST='masterhost',  --- 从哪个主节点同步数据
MASTER_USER='repluser',  --- 用于复制的账号
MASTER_PASSWORD='replpass', --- 密码
MASTER_LOG_FILE='mariadb-bin.xxxxxx', --- 二进制日志
MASTER_LOG_POS=#; --- 二进制日志位置

复制的时候就是从这个指定的二进制日志文件的指定位置开始复制。
START SLAVE [IO_THREAD|SQL_THREAD];

SHOW SLAVE STATUS;  #查看slave上的两个复制线程的状态信息
1.将两台及其恢复至初始状态(删除所有数据文件就可恢复数据的初始状态)
[root@CentOS8 mysql]# rm -rf /var/lib/mysql/*

2.主节点(master)设置
(1)开启二进制日志并设置server_id
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

server_id=1 #指定serverid
log-bin=/data/logbin/mysql-logbin #开启二进制日志并指定二进制日志的存放位置和前缀名

(2)创建一个拥有复制权限的用户,用于slave连接到master
#mysql8.0不允许创建账号和授权一起做,必须分为两条命令执行。

#创建用户
mysql> create user repluser@'10.0.0.%';
Query OK, 0 rows affected (0.02 sec)
#授权
mysql> grant  replication slave on *.* to  'repluser'@'10.0.0.%';
Query OK, 0 rows affected (0.12 sec)

3.从节点设置:
(1)开启中继日志和设置serverid
[root@CentOS8 mysql]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

server_id=2 #设置serverid
relay-log=/data/relaylog/relay-log #开启中继日志并指定存放位置和名称前缀

(2)使用具有复制权限的用户账号连接到master
mysql> change master to
    -> MASTER_HOST='10.0.0.10',
    -> MASTER_USER='repluser',
    -> MASTER_LOG_FILE='mysql-logbin.000001',
    -> MASTER_LOG_POS=620;
Query OK, 0 rows affected, 2 warnings (0.15 sec)

4.在从节点上开启两个线程(io线程和sql线程)
mysql> start slave;
Query OK, 0 rows affected (0.04 sec)

5.检查三个线程是否正常
#显示示slave线程的相关信息,从而分析主从复制的状态
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.10
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-logbin.000001
          Read_Master_Log_Pos: 620
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 327
        Relay_Master_Log_File: mysql-logbin.000001
             Slave_IO_Running: Yes #slave的io线程正常工作
            Slave_SQL_Running: Yes #slave的sql线程正常工作
        ......
         Seconds_Behind_Master: 0 #和主节点的数据差(例如1s:标识主节点还有1s的数据没有复制过来)
             Master_Server_Id: 1
                  Master_UUID: afeced8a-3903-11ed-b3b0-000c295a5cb9
             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
           .......

1 row in set (0.00 sec)

需要通过完全备份主服务器数据到从服务器,从服务器恢复数据。
master:

1.开启二进制日志和serverid
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

server_id=1 #一般使用自己ip地址的主机位来标识
log-bin=/data/logbin/mysql-logbin #二进制日志存放位置

2.创建一个具有replication和slave权限的账号,slave可以凭借这个账号连接到master
mysql> create user repli_user@'10.0.0.%' identified by 'redhat';
Query OK, 0 rows affected (0.01 sec)

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

3.使用mysqldump工具实现完全备份(创建用户以后再执行备份,slave还原备份文件后也会存在对应的账号)
[root@CentOS8 ~]# mysqldump -A -F -uroot --single-transaction --master-data=1 > fullback-date +%F_%T.sql

4.将备份文件传送给slave
[root@CentOS8 ~]# scp ./fullback-2022-09-23_10\:22\:43.sql  10.0.0.13:/root/

slave:

1.开启中继日志和serverid
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

server_id=2
relay-log=/data/relaylog/relay-log

2.只从master传送过来的脚本(因为master使用了--master-data=1参数,所以sql语句里面记录了change master需要的二进制日志和位置)
3.修改sql文件,修改内容如下:
-- Position to start replication or point-in-time recovery from
--
CHANGE MASTER TO
MASTER_HOST='10.0.0.10',
MASTER_USER='repli_user',
MASTER_PASSWORD='redhat',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-logbin.000006',
MASTER_LOG_POS=156;

4.执行脚本:
mysql < fullback-2022-09-23_10\:22\:43.sql

5.&#x5F00;&#x542F;sql&#x7EBF;&#x7A0B;&#x548C;io&#x7EBF;&#x7A0B;
mysql> start slave sql_thread;
Query OK, 0 rows affected (0.01 sec)
mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.01 sec)

&#x6216;&#x8005;start slave&#x4F1A;&#x540C;&#x65F6;&#x5F00;&#x542F;&#x4E24;&#x4E2A;&#x7EBF;&#x7A0B;

创建用户的时候授权(mysql8.0不支持)

grant replication slave on *.* to repluser@'10.0.0.%' identified by 'magedu';

mysql8.0:
create user user_name@'hostname' identified by 'passwoed'

grant privelege_type on db.tb to user_name@'host_name'
&#x67E5;&#x770B;&#x6307;&#x5B9A;&#x7528;&#x6237;&#x7684;&#x6743;&#x9650;&#xFF1A;

show grants from user@'hostname'

&#x67E5;&#x770B;grant&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#xFF1A;>help grant

&#x67E5;&#x770B;show grant&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#xFF1A;>help show grants

&#x5220;&#x9664;&#x7528;&#x6237;&#xFF1A;drop user user_name

set global innodb_flush_log_at_trx_commit=2

set global sync_binlog=0

Original: https://www.cnblogs.com/heyongshen/p/16711235.html
Author: 背对背依靠
Title: MySQL主从复制的原理和实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578578/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ansible -自动运维工具

    Ansible-自动运维工具 1.简介 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbe…

    Linux 2023年6月13日
    0114
  • 项目经验示例

    一,期中项目经验示例 1,根据现有结构部署工具(PXE+kickstart)2,结合应用系统需求定制部署模版3,制作系统优化等一键执行脚本4,自动化部署实施5,根据定制的优化内容对…

    Linux 2023年6月7日
    091
  • wsl2环境搭建

    我电脑配置不高,开虚拟机跑linux总觉得太卡。最近才了解到windows早就上了wsl2——一款较为轻量的虚拟机软件。所以本篇博客偏笔记向,存粹记录以便多次使用。 WSL2安装 …

    Linux 2023年6月7日
    097
  • Shell中判断文件,目录是否存在

    一. 具体每个选项对应的判断内容: 二.常用的例子: Original: https://www.cnblogs.com/DreamDrive/p/7706585.htmlAuth…

    Linux 2023年5月28日
    092
  • Base-64字符串无效,The input is not a valid Base-64 string as it contains a non-base 64 character

    base64规则: 字符串只可能包含A-Z,a-z,0-9,+,/,=字符 字符串长度是4的倍数 =只会出现在字符串最后,可能没有或者一个等号或者两个等号 首先,C# 做上传文件的…

    Linux 2023年6月7日
    0120
  • Linux常用命令

    Linux常用命令 在学习瑞吉外卖项目课程中自己做的一个linux常用命令的小笔记便于以后复习使用,仅供参考。 文件目录操作命令 pwd:显示该目录或者文件的路径 ls命令 ls:…

    Linux 2023年6月7日
    091
  • 聊聊.netcore采坑那一些事之系统时间and文件路径

    聊聊 .netcore 采坑那一些事之系统时间and 文件路径 Hi,小伙伴大家好,最近工作比较忙,很久没有和大家分享点东西了。这个周末都加了两天班。公司的新项目都是采用.netc…

    Linux 2023年6月14日
    079
  • VMware vSphere 7 Update 3 下载

    请访问原文链接:https://sysin.org/blog/vmware-vsphere-7-u3/,查看最新版。原创作品,转载请保留出处。 vSphere 7 Update 3…

    Linux 2023年5月27日
    0116
  • Oracle 恢复delete误删数据

    — 开启行移动功能 alter table 表名 enable row movement; — 查询删除前的数据 select * from 表名 as of timestam…

    Linux 2023年6月8日
    095
  • VMware ESXi 7.0 U2 SLIC 2.6 & Unlocker 集成 Intel NUC 网卡、USB 网卡和 NVMe 驱动

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    0103
  • Jmeter性能测试场景的创建和运行

    目录 性能测试场景的分析 项目背景 Jmeter指标 性能测试场景的设计以及准备 * 性能测试的总结 性能测试场景的分析 项目背景 ​ 实际工作中,我们拿到一个项目一般来说都会是项…

    Linux 2023年6月14日
    095
  • JAVA设计模式-适配器模式

    JAVA设计模式-适配器模式 介绍 适配器模式是一种结构型模式,它主要解决接口之间的兼容问题。当我们需要使用某个类的接口时,但是这个类的接口目前并不符合我们使用需求,不能直接使用,…

    Linux 2023年6月6日
    0113
  • django.template.exceptions.TemplateDoesNotExist: django_filters/rest_framework/form.html

    django.template.exceptions.TemplateDoesNotExist: django_filters/rest_framework/form.htmlER…

    Linux 2023年6月14日
    0157
  • linux root用户编辑文件提示没有权限

    linux root用户编辑文件提示没有权限 感觉很奇怪,因为是root用户。于是查看了一下文件的权限,结果如下: [root@localhost elasticsearch-5….

    Linux 2023年6月8日
    0107
  • 初识前后端

    初识前后端 在学习了解前后端的过程中,自己看到了这一篇好的文章,摘下了一些当下用的的内容,供复习参考。 什么是前端开发? 前端开发主要涉及网站和 App,用户能够从 App 屏幕或…

    Linux 2023年6月13日
    0115
  • Ubuntu安装盘的制作

    准备工作 Ubuntu系统镜像 win32diskimager U盘(4G以上),对重要文件提前备份 制作 下载系统镜像 进入官网 我们下载的版本是18.04,不是20.04 在页…

    Linux 2023年6月14日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球