您的位置:首页 > 数据库 > MySQL

MySQL主从复制原理与配置

2020-07-16 06:03 429 查看

文章目录

1. 主从概述

什么是mysql主从?

  • mysql主从又叫mysql复制(同步),简单来说就是将A和B两个数据库做了主从之后,在A上面写入数据,B也会写入同样的数据,两者实现数据实时同步

主从有什么作用?

  • 主库宕机后能够及时替换主库,保证业务可用性
  • 主库负责写入数据,从库负责读取数据,实现读写分离,提高单个机器的I/O性能

主从有哪些形式?

  • 一主一从 写入数据找主库,读取数据找从库
  • 主主复制
      主主复制又叫双机热备,对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致
    • 每台master既是master,又是另一台服务器的slave,当master工作时,slave不能工作
  • 一主多从
      扩展系统读取性能,当读取数据的需求量较多的时候适合使用一主多从
  • 多主一从
      扩展系统写入性能,当写入数据量较多时适合使用多主一从
    • mysql5.7版本开始支持,低于5.7的版本不支持多主一从

    2. 主从复制原理

    如上图所示:

    1. 主库收到外来的增、删、改操作
    2. 主库将收到的操作数据写入binlog日志中
    3. 从库上面的IO线程连接上主库,并请求binglog日志文件中的操作数据
    4. 主库生成log dump线程,通过log dump线程将binlog日志中的操作数据传输给从库的IO线程
    5. 从库的IO线程将收到的操作数据写入relay log(中继日志)中
    6. 从库的sql线程读取relay log(中继日志)中记录的操作数据
    7. 在从库中执行relay log(中继日志)中记录的操作,保持和主库的内容一致

    3. 主从复制配置

    配置步骤:

    1. 确保主从数据库数据一致
    2. 在主数据库中创建一个同步账号授权给从数据库使用
    3. 配置主数据库,修改其配置文件
    4. 配置从数据库,修改其配置文件
    5. 验证是否配置成功

    配置实例:

    需求:
    搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作,主数据库和从数据库要保持数据同步

    环境:

    角色 主机名 IP 系统版本/数据库版本 有无数据
    主数据库 node1 192.168.207.129 Centos7/mysql5.7 有数据
    从数据库 node3 192.168.207.131 Centos7/mysql5.7 无数据

    步骤:

    注意:必须关闭防火墙,如果没有关闭可执行

    systemctl stop firewalld
    来关闭防火墙


    1.分别在主从数据库中安装

    mysql5.7
    ,此处可直接执行自动安装脚本,脚本在 《二进制格式安装MySQL5.7》 文章中有写

    主数据库:
    [root@node1 ~]# ls
    abc.sh           mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
    [root@node1 ~]# bash abc.sh
    
    从数据库:
    [root@node3 ~]# ls
    abc.sh           mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
    [root@node1 ~]# bash abc.sh

    2.确保从数据库与主数据库里的数据一样

    因为我们的数据库都是新装的所以数据肯定一样,但是需求环境中数据不一样,所以我们需要在主库中加入一点数据

    //查看主库中的数据
    [root@node1 ~]# mysql -uroot -p123
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | aaabbbccc          |
    | mysql              |
    | performance_schema |
    | school             |
    | sys                |
    +--------------------+
    6 rows in set (0.00 sec)
    
    //查看从库中的数据
    [root@node3 ~]# mysql -uroot -p123
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    
    //对主库进行全备
    //全备之前需要新开一个终端,给数据库加上读锁,避免在备份期间有其他人在写入导致数据不一致
    mysql> flush tables with read lock;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql>   //注意:在全备执行完成前,不要退出数据库和关闭此终端,否则读锁会失效
    
    //在主库上做全备,并将全备文件传给从库
    [root@node1 ~]# mysqldump -uroot -p123 --all-databases > all-202006190900.sql
    mysqldump: [Warning] Using a password on the command line interface can be insecure.
    [root@node1 ~]# scp all-202006190900.sql root@192.168.207.131:/root
    
    //解除主库的锁表状态,直接退出交互式界面即可
    可以直接关闭终端或者quit退出数据库
    mysql> quit
    Bye
    
    //在从库上恢复主库的全备文件,并查看数据是否和主库一致
    [root@node3 ~]# mysql -uroot -p123 < all-202006190900.sql
    mysql: [Warning] Using a password on the command line interface can be insecure.
    [root@node3 ~]# mysql -uroot -p123
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | aaabbbccc          |
    | mysql              |
    | performance_schema |
    | school             |
    | sys                |
    +--------------------+
    6 rows in set (0.00 sec)

    3.在主库中创建一个同步账号给从库使用

    mysql> grant replication slave on *.* to 'repl'@'192.168.207.131' identified by 'repl123';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)

    4.配置主数据库

    //编辑配置文件
    [root@node1 ~]# vim /etc/my.cnf
    //添加下面两行内容
    server-id = 10         //数据库服务器唯一标识符,主库的server-id值必须比从库的小
    log-bin = mysql_bin    //启用binlog日志
    
    //重启数据库
    [root@node1 ~]# service mysqld restart
    Shutting down MySQL.. SUCCESS!
    Starting MySQL. SUCCESS!
    
    //查看主库的状态
    [root@node1 ~]# mysql -uroot -p123
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql_bin.000001 |      154 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    5.配置从数据库

    //编辑配置文件
    [root@node3 ~]# vim /etc/my.cnf
    //添加下面两行内容
    server-id = 20             //数据库服务器唯一标识符
    relay-log = myrelay_bin    //启用中继日志relay-log
    
    //重启数据库
    [root@node3 ~]# service mysqld restart
    Shutting down MySQL... SUCCESS!
    Starting MySQL.. SUCCESS!
    
    //配置并启动主从复制
    [root@node3 ~]# mysql -uroot -p123
    mysql> change master to
    -> master_host='192.168.207.129',
    -> master_user='repl',
    -> master_password='repl123',
    -> master_log_file='mysql_bin.000001',
    -> master_log_pos=154;
    Query OK, 0 rows affected, 2 warnings (0.03 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show slave status\G
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 192.168.207.129
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql_bin.000001
    Read_Master_Log_Pos: 154
    Relay_Log_File: myrelay_bin.000002
    Relay_Log_Pos: 320
    Relay_Master_Log_File: mysql_bin.000001
    Slave_IO_Running: Yes  //此行和下面一行必须为yes
    Slave_SQL_Running: Yes
    .......

    6.验证是否配置成功

    //在主库中写入数据
    mysql> create database haha;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | aaabbbccc          |
    | haha               |
    | mysql              |
    | performance_schema |
    | school             |
    | sys                |
    +--------------------+
    7 rows in set (0.00 sec)
    
    //在从库中查看是否同步
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | aaabbbccc          |
    | haha               |
    | mysql              |
    | performance_schema |
    | school             |
    | sys                |
    +--------------------+
    7 rows in set (0.00 sec)
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: