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)

大家都在看

  • WEB自动化-12-Cypress 调试

    12 调试 Cypress的测试代码和被测试程序在同一生命周期中的浏览器中,也就是意味着,可以使用浏览器的开发者工具直接参与调试。Cypress提供了几种调试方法,分别为: deb…

    Linux 2023年6月7日
    087
  • 软件定义网络第一次作业

    配置结果 如何pip解决下载过慢问题 实验环境配置 环境安装截图如下 安装环境过程中一些问题的解决 github连接不上 在hosts文件中加上以下语句 140.82.114.3 …

    Linux 2023年6月7日
    0112
  • Common LISP 命令大全

    书籍下载地址: Ansi Common Lisp 中文版|百度网盘 实用Common.Lisp编程 .pdf|百度网盘 LISP指令速查网站推荐: Simplified Commo…

    Linux 2023年6月6日
    0125
  • [极客大挑战 2019]Secret File

    0x01 寻找做题信息 打开环境,查看源代码,发现可疑链接,/Archive_room.php,action.php打开action.php会发生302跳转,查找302跳转无果,百…

    Linux 2023年6月8日
    0104
  • 【转】高并发下秒杀商品,你必须知道的9个细节

    0.前言 高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。 秒杀一般出现在商城的促销活动中,指定…

    Linux 2023年6月13日
    090
  • redis高可用

    Redis-高可用(主从复制、哨兵模式、集群) 1.主从复制 1.1 主从复制简介 在 Redis 复制的基础上,使用和配置主从复制非常简单,能使得从 Redis 从服务器(下文称…

    Linux 2023年6月13日
    098
  • 如何逃离框架孤井?

    前言 前面我发过一篇文章,脱离了Spring询问大家能不能继续开发,结果文章下面的评论和回复都告诉我大家伙的基础打得很牢固,该咋写还是咋写。看得我在这内卷的时代瞬间躺平。 那么今天…

    Linux 2023年6月13日
    0100
  • ssh远程连接服务(二)三台虚拟机之间的免密登录

    创建三台虚拟机主机名分别为node01、node02、node03 在node01虚拟机上生成密钥对 然后将生成的公钥分别复制到node02、node03的虚拟机上(前提三台虚拟机…

    Linux 2023年6月7日
    0101
  • 安装win10和ubuntu双系统

    2019-06-22 ​ 最近找了一份新的工作,要用到linux,由于之前基本上没有接触过这方面的东西,所以今天捣鼓一下,安装win10和linux双系统,办公研发双不误。如果在安…

    Linux 2023年6月14日
    0114
  • 搭建Nginx七层反向代理

    基于https://www.cnblogs.com/Dfengshuo/p/11911406.html这个基础上,在来补充下七层代理的配置方式。简单理解下四层和七层协议负载的区别吧…

    Linux 2023年6月8日
    0125
  • MySQL的主从复制+双主模式

    部署环境: MySQL master 192.168.40.21 MySQL slave 192.168.40.22 思路: I/O线程是对主MySQL上二进制日志文件进行读取,读…

    Linux 2023年6月8日
    0110
  • Linux专项之Apache

    1.&#x865A;&#x62DF;&#x673A;&#x4E0A;&#x7F51; 1.安装软件(httpd) yum search ht…

    Linux 2023年5月27日
    098
  • 前端奇奇怪怪的CSS样式

    使用inline-block相当于将元素介于块级元素与行内元素之间,将换行符转换成了空格,因此各个元素之间会有空隙 各个元素没有间隙,且元素自身大小不会改变,若一行容不下,则会换行…

    Linux 2023年6月13日
    093
  • [20220104]in list 几种写法性能测试.txt

    [20220104]in list 几种写法性能测试.txt –//以前写过几种in list的写法,从来没有测试过这几种方法的性能测试看看. 1.环境:SCOTT@b…

    Linux 2023年6月13日
    060
  • QLabel图片自适应

    故事背景:由于要做终端定制的需求,在服务端上传一张128像素的图片,下发给客户端,适配所有图标(界面左上角、任务栏、快捷方式、托盘等),但是由于每个位置的图标大小不一样,代码要根据…

    Linux 2023年6月13日
    089
  • python装饰器(新年第一写)

    祭奠碌碌无为的2018,想想其实也不算碌碌无为,至少我还搞懂了装饰器,写了一堆有用没用的玩意 原来觉得装饰器挺难的,直到2018年的最后几天,突然就明白了,难道这就是传说中的开天聪…

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