MySQL主从复制配置

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 一、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 测试库,测试同步成功。


                相关实践学习
                基于CentOS快速搭建LAMP环境
                本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
                全面了解阿里云能为你做什么
                阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
                相关文章
                |
                4天前
                |
                SQL canal 运维
                MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
                MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
                |
                5天前
                |
                运维 负载均衡 关系型数据库
                MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
                MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
                |
                7天前
                |
                关系型数据库 MySQL 数据库
                MySQL集群 双主架构(配置命令)
                MySQL集群 双主架构(配置命令)
                |
                12天前
                |
                SQL 关系型数据库 MySQL
                【MySQL-3】图形化界面工具DataGrip安装&配置&使用
                【MySQL-3】图形化界面工具DataGrip安装&配置&使用
                |
                12天前
                |
                关系型数据库 MySQL Linux
                【MySQL-2】MySQL的下载&安装&启停&配置环境变量【一条龙教程】
                【MySQL-2】MySQL的下载&安装&启停&配置环境变量【一条龙教程】
                |
                13天前
                |
                设计模式 容灾 关系型数据库
                MySQL 主从复制架构
                MySQL 主从复制架构
                |
                13天前
                |
                分布式计算 DataWorks 关系型数据库
                DataWorks操作报错合集之DataWorks集成实例绑定到同一个vpc下面,也添加了RDS的IP白名单报错:数据源配置有误,请检查,该怎么处理
                DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
                27 0
                |
                13天前
                |
                Ubuntu 关系型数据库 MySQL
                Ubuntu 20.04 + mysql8 安装以及配置大小写不敏感
                Ubuntu 20.04 + mysql8 安装以及配置大小写不敏感
                |
                13天前
                |
                DataWorks 关系型数据库 MySQL
                DataWorks产品使用合集之在DataWorks中配置RDS MySQL数据源的步骤如何解决
                DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
                27 0
                |
                14天前
                |
                存储 关系型数据库 MySQL
                linux安装MySQL8.0,密码修改权限配置等常规操作详解
                linux安装MySQL8.0,密码修改权限配置等常规操作详解

                推荐镜像

                更多