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)

大家都在看

  • 17-二分查找

    * import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class…

    Linux 2023年6月7日
    091
  • 操作系统实现-loader

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 大家好呀,终于我们到了操作系统的loader部分了,loader也是操作系…

    Linux 2023年6月13日
    066
  • /dev/random 和 /dev/urandom 的原理

    /dev/random 和 /dev/urandom 是 Linux 上的字符设备文件,它们是随机数生成器,为系统提供随机数 随机数的重要性 随机数在计算中很重要。 TCP/IP …

    Linux 2023年6月13日
    076
  • Action Sheets 和 Activity Views

    行动表行动表是一种特殊的提醒方式,它展示了与当前环境相关的两个或多个选择。在较小的屏幕上,动作表会从屏幕的底部滑上去;在较大的屏幕上,动作表会以弹出式的方式一次性出现。 在执行一个…

    Linux 2023年6月7日
    093
  • MySQL-配置参数时 报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu……

    报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu…… 原因: 1、第一次配置参数时,不完整…

    Linux 2023年6月13日
    0108
  • Git详细使用流程

    初始化git仓库 git init 执行命令后文件夹下将会在执行命令路径下生成.git隐藏文件上传该路径下的所有内容到暂存区 git add . 通常项目中都有read.me,创建…

    Linux 2023年6月7日
    098
  • [Git系列] 前言

    Git 简介 Git 是一个重视速度的分布式版本控制和代码管理系统,最初是由 Linus Torvalds 为开发 Linux 内核而设计并开发的,是一款遵循二代 GUN 协议的免…

    Linux 2023年5月27日
    0139
  • 机器学习:正态方程 python实现

    前言 一、算法介绍 二、核心算法 1. 公式 2.python实现 总结 前言 使用python简单实现机器学习中正态方程算法。 一、算法介绍 与梯度下降算法相比,正态方程同样用于…

    Linux 2023年6月7日
    087
  • c++ 使用shell命令

    #include #include #include #include #include //execute shell command //执行&#x…

    Linux 2023年5月28日
    096
  • js阻止事件冒泡(phpcms,浮窗第一次10秒弹出后每30秒弹出,动态更换日期)

    /* v9_date_list 日期表 tiptime 考试日期(数据类型为日期) 如果要实现浮窗淡入淡出用jquery的(“#main0”).fadeIn…

    Linux 2023年6月13日
    0103
  • 我的第一个博客

    我就是想试一试 .阿西吧 段狗是傻逼,段狗请看右边的看板娘 posted @2020-06-22 18:56 xiao-c 阅读(17 ) 评论() 编辑 Original: ht…

    Linux 2023年6月7日
    0127
  • 在Linux下使用rm -rf /*后会怎样?

    每个工作过的码农,也许不知道分布式,也许不知道高并发,但想必都知道这句鼎鼎大名的代码。本人对此也是比较好奇的,不妨用虚拟机试试看 首先是普通角色: 普通角色把 拥有权限的文件全都删…

    Linux 2023年6月14日
    092
  • Spring事务管理

    事务的特性:一致性、原子性、隔离性、持久性 Spring事务管理相关接口:PlatformTransactionManager(事务管理器)、TransactionDefiniti…

    Linux 2023年6月7日
    0106
  • 数组常见操作

    8.19 day7 数组常见操作 获取数组最值 public static int maxElement(int[] arr) { // 假设第一个元素的值就是最大值 int ma…

    Linux 2023年6月7日
    082
  • node.js和vue cli脚手架下载安装配置方法

    一、node.js安装以及环境配置 1、下载vue.js 下载地址: https://nodejs.org/en/ 2、安装node.js 下载完成后,双击安装包开始安装。安装地址…

    Linux 2023年6月7日
    0101
  • 解决USB在虚拟机不显示问题

    电脑重装了下系统,顺带重新装了vmware,发现虚拟机无法识别USB设备,居然连右下角图标和可识别设备都不显示了。 网上找了很多方法,大多是纷繁复杂,且行不行都无法保证。 我发现一…

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