MySQL主从复制配置

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 一、MySQL复制的应用常见场景 读写分离,提高查询访问性能,有效减少主数据库访问压力。 实时灾备,主数据库出现故障时,可快速切换到从数据库。 数据汇总,可将多个主数据库同步汇总到一个数据库中,方便数据统计分析。

 一、MySQL复制的应用常见场景

    • 读写分离,提高查询访问性能,有效减少主数据库访问压力。
    • 实时灾备,主数据库出现故障时,可快速切换到从数据库。
    • 数据汇总,可将多个主数据库同步汇总到一个数据库中,方便数据统计分析。

    二、MySQL主从复制原理介绍

      1、 MySQL异步和半同步复制

    传统的MySQL复制提供了一种简单的主-从复制方法。有一个主,以及一个或多个从。

    主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新执行(在基于语句的复制中)或应用(在基于行的复制中)。

       这是一个shared-nothing(异步)的系统,默认情况下所有server成员都有一个完整的数据副本。(主节点不依赖从节点)

    image.gif

       还有一个半同步复制,他在协议中添加了一个同步步骤,这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。

    image.gif

       上两张图片,可以看到传统一部MySQL复制协议(以及半同步)的图形展示。蓝色箭头表示在不同server之间或者server与client应用之间的信息交互。

    2、MySQL主从复制过程

      • 开启binlog日志,通过把主库的binlog传到从库,从新解析应用到从库。
      • 复制需要3个线程(dump、io、sql)完成

      3、MySQL主从复制前提

        • 主服务器一定要打开二进制日志
        • 必须两台服务器(或者是多个实例)
        • 从服务器需要一次数据初始化
        • 如果主从服务器都是新搭建的话,可以不做初始化
        • 如果主服务器已经运行了很长时间了,可以通过备份将主库数据恢复到从库。
        • 主库必须要有对从库复制请求的用户。
        • 从库需要有relay-log设置,存放从主库传送过来的二进制日志show variables like '%relay%';
        • 在第一次的时候,从库需要change master to去连接主库。
        • change master信息需要存放到master.info 中show variables like '%master_info%';
        • 从库怎么知道,主库发生了新的变化?通过relay-log.info记录的已经应用过的relay-log信息。
        • 在复制过程中涉及到的线程
          • 从库会开启一个I0 thread(线程),负责连接主库,请求binlog, 接收binlog并写入relay-log。
          • 从库会开启一个SQL thread(线程),负责执行relay-log中的事件。
          • 主库会开启一个dump thrad(线程),负责响应从I0 thread的请求。

            4、MySQL主从复制实现

            image.gif

            2、MySQL复制有三种核心格式

            image.gif

            8、MySQL授权远程主机登录

            grant all privileges on *.* to 'slave'@'192.168.%.%' identified by '123456' with grant option;

            9、MySQL编辑配置文件

            9.1、master配置文件

            vim /etc/my.cnf

            default-storage-engine=INNODB

            symbolic-links=0

            server_id=6

            log_bin=/var/log/mysql/mysql-bin

            image.gif

            9.1.2、创建相应文件夹以及更改属性

            [root@localhost ~]# mkdir -p /var/log/mysql

            [root@localhost ~]# chown -R mysql.mysql /var/log/mysql

            [root@localhost ~]# ll -d /var/log/mysql

            drwxr-xr-x. 2 mysql mysql 203 4月  29 16:22 /var/log/mysql

            [root@localhost ~]#

            重启动数据库

            9.2、Slave配置文件

            vim /etc/my.cnf

            default-storage-engine=INNODB

            symbolic-links=0

            server_id=8

            log_bin=/var/log/mysql/mysql-bin

            relay_log=/var/log/mysql/mysql-relay

            image.gif

            9.2.2、创建相应文件夹以及更改属性

            [root@localhost ~]# mkdir -p /var/log/mysql

            [root@localhost ~]# chown -R mysql.mysql /var/log/mysql

            [root@localhost ~]# ll -d /var/log/mysql

            drwxr-xr-x. 2 mysql mysql 203 4月  29 16:22 /var/log/mysql

            [root@localhost ~]#

            重启动数据库

            10、MySQL创建主从同步账号

              • 在主库创建一个专门用来复制的数据库用户,所有从库都用这个用户来连接主库,确保这个用户只有复制的权限

              create user 'slave'@'192.168.%.%' identified by '123456';

              如果出现密码不符合要求的问题则按以下解决

              修改密码的策略,使得可以设置简单的密码

              如果想要查看MySQL完整的初始密码规则,登陆后执行以下命令

              SHOW VARIABLES LIKE'validate_password%';

              密码的长度是由validate_password_length决定的,但是可以通过以下命令修改

              setglobal validate_password_length=4;

              validate_password_policy决定密码的验证策略,默认等级为MEDIUM(中等),可通过以下命令修改为LOW(低)

              setglobal validate_password_policy=0;

              删除已有账户

              delete from mysql.user where user ='用户名';

              查询已创建的用户

              select user,host from mysql.user;

              image.gif

              授权用户复制权限

              grant replication slave on *.* to 'slave'@'192.168.%.%';

              查看指定用户的授权情况

              show grants for 'slave'@'192.168.%.%';

              image.gif

              关闭防火墙

              systemctl stop firewalld

              再从服务器上使用slave账户远程连接主服务器

              mysql -h192.168.126.133 -uslave -p

              image.gif

              连接成功

              查看MySQL主服务器的状态

              show master status;

              13、MySQL主库备份数据

              mysqldump -uroot -p123456 --master-data --all-databases > master.sql

              image.gif

              将备份的文件master.sql拷贝到从服务器

              scp master.sql 192.168.126.132:/root

              image.gif

              在从数据库中执行下列语句,将备份数据还原到从服务器中,同步数据

              [root@localhost ~]# mysql -p123456 < master.sql
              [root@localhost ~]# mysql -p123456 < master.sql
              mysql: [Warning] Using a password on the command line interface can be insecure.
              [root@localhost ~]# mysql -uroot -p123456
              mysql: [Warning] Using a password on the command line interface can be insecure.
              Welcome to the MySQL monitor.  Commands end with ; or \g.
              Your MySQL connection id is 3
              Server version: 5.7.38-log MySQL Community Server (GPL)
              Copyright (c) 2000, 2022, Oracle and/or its affiliates.
              Oracle is a registered trademark of Oracle Corporation and/or its
              affiliates. Other names may be trademarks of their respective
              owners.
              Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
              mysql> select user,host from mysql.user;
              +---------------+-------------+
              | user          | host        |
              +---------------+-------------+
              | slave         | 192.168.%.% |
              | mysql.session | localhost   |
              | mysql.sys     | localhost   |
              | root          | localhost   |
              +---------------+-------------+
              4 rows in set (0.01 sec)
              mysql>

              image.gif

              15、MySQL从库配置同步

                • 再从库上建立复制关系,即从库指定主库的日志信息和链接信息
                mysql> change master to
                    -> master_host='192.168.126.133',
                    -> master_port=3306,
                    -> master_user='slave',
                    -> master_password='123456',
                    -> master_log_file='mysql-bin.000003',
                    -> master_log_pos=154;
                Query OK, 0 rows affected, 2 warnings (0.02 sec)
                mysql>

                image.gif

                注意这两个值需要根据主服务器上显示的值来写

                master_log_file='mysql-bin.000003',
                master_log_pos=154;

                image.gif

                在主服务器上输入一下命令即可显示出来

                image.gif

                关闭主从服务器防火墙和一些安全策略,不想关闭就

                启动从服务

                mysql> start slave;
                Query OK, 0 rows affected (0.02 sec)
                mysql>

                image.gif

                查看从的状态

                mysql> show slave status\G
                *************************** 1. row ***************************
                               Slave_IO_State: Waiting for master to send event
                                  Master_Host: 192.168.126.133
                                  Master_User: slave
                                  Master_Port: 3306
                                Connect_Retry: 60
                              Master_Log_File: mysql-bin.000003
                          Read_Master_Log_Pos: 154
                               Relay_Log_File: mysql-relay.000003
                                Relay_Log_Pos: 320
                        Relay_Master_Log_File: mysql-bin.000003
                             Slave_IO_Running: Yes
                            Slave_SQL_Running: Yes
                ........
                             Master_Server_Id: 6
                                  Master_UUID: 753763f0-c7a4-11ec-b29b-000c297f1d9e
                             Master_Info_File: /var/lib/mysql/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
                                  Master_Bind:
                      Last_IO_Error_Timestamp:
                     Last_SQL_Error_Timestamp:
                               Master_SSL_Crl:
                           Master_SSL_Crlpath:
                           Retrieved_Gtid_Set:
                            Executed_Gtid_Set:
                                Auto_Position: 0
                         Replicate_Rewrite_DB:
                                 Channel_Name:
                           Master_TLS_Version:
                1 row in set (0.00 sec)
                mysql>

                image.gif

                注意看红色部分,主从配置完成,如果是克隆的虚拟机注意查看server-uuid,主从的uuid是不一致的,需要自行修改。

                [root@localhost ~]# vim /var/lib/mysql/auto.cnf
                [auto]
                server-uuid=753763f0-c7a4-11ec-b29b-000c297f1d91

                image.gif

                测试主服务起的数据能否同步到从服务器上

                在主服务器创建test_slave 数据库

                mysql> create database test_slave;
                Query OK, 1 row affected (0.01 sec)
                mysql> show databases;
                +--------------------+
                | Database           |
                +--------------------+
                | information_schema |
                | mysql              |
                | performance_schema |
                | sys                |
                | test_slave         |
                +--------------------+
                5 rows in set (0.00 sec)
                mysql>

                image.gif

                在从服务器上查看,是否同步

                mysql> show databases;
                +--------------------+
                | Database           |
                +--------------------+
                | information_schema |
                | mysql              |
                | performance_schema |
                | sys                |
                | test_slave         |
                +--------------------+
                5 rows in set (0.06 sec)
                mysql>

                image.gif

                从服务器也能看到test_slave 测试库,测试同步成功。


                相关实践学习
                如何在云端创建MySQL数据库
                开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
                全面了解阿里云能为你做什么
                阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
                相关文章
                |
                26天前
                |
                SQL 关系型数据库 MySQL
                mysql主从复制概述和配置
                【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
                |
                1月前
                |
                监控 关系型数据库 MySQL
                深入了解MySQL主从复制:构建高效稳定的数据同步架构
                深入了解MySQL主从复制:构建高效稳定的数据同步架构
                116 1
                |
                21天前
                |
                存储 关系型数据库 MySQL
                MySQL主从复制原理和使用
                本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
                MySQL主从复制原理和使用
                |
                15天前
                |
                存储 SQL 关系型数据库
                2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
                Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
                |
                16天前
                |
                关系型数据库 MySQL Linux
                在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
                本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
                59 2
                |
                20天前
                |
                SQL 关系型数据库 MySQL
                Mysql中搭建主从复制原理和配置
                主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
                Mysql中搭建主从复制原理和配置
                |
                2月前
                |
                关系型数据库 MySQL 数据安全/隐私保护
                docker应用部署---MySQL的部署配置
                这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
                docker应用部署---MySQL的部署配置
                |
                1月前
                |
                关系型数据库 MySQL Java
                Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
                这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
                61 0
                Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
                |
                2月前
                |
                关系型数据库 MySQL Go
                go抽取mysql配置到yaml配置文件
                go抽取mysql配置到yaml配置文件
                |
                1月前
                |
                数据可视化 关系型数据库 MySQL
                【IDEA】配置mysql环境并创建mysql数据库
                【IDEA】配置mysql环境并创建mysql数据库
                90 0