MySQL主从复制配置

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 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
                相关文章
                |
                2月前
                |
                存储 SQL 关系型数据库
                MySQL体系结构与配置
                MySQL体系结构与配置
                41 0
                |
                6天前
                |
                关系型数据库 MySQL 数据安全/隐私保护
                docker应用部署---MySQL的部署配置
                这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
                docker应用部署---MySQL的部署配置
                |
                6天前
                |
                关系型数据库 MySQL Go
                go抽取mysql配置到yaml配置文件
                go抽取mysql配置到yaml配置文件
                |
                9天前
                |
                关系型数据库 MySQL Unix
                MySQL配置不区分大小写的方法
                结论 通过适当配置 lower_case_table_names参数以及在数据定义和查询中选择合适的校对规则,可以灵活地控制MySQL中的大小写敏感性,以适应不同的应用场景和需求。这样的设置既可以增加数据库的兼容性,又可以在必要时利用大小写敏感性进行精确的数据处理。需要注意的是,修改 lower_case_table_names参数后,最好在数据库初始化时进行,以避免现有表名的大小写问题。
                26 3
                |
                2月前
                |
                弹性计算 关系型数据库 MySQL
                centos7 mysql安装及配置
                本文详细介绍了在阿里云服务器ECS上通过yum源安装MySQL 8.0.12的过程,包括更新yum源、下载并安装MySQL源、解决安装过程中可能遇到的问题等步骤。此外,还介绍了如何启动MySQL服务、设置开机自启、配置登录密码、添加远程登录用户以及处理远程连接异常等问题。适合初学者参考,帮助快速搭建MySQL环境。
                156 8
                centos7 mysql安装及配置
                |
                9天前
                |
                SQL 关系型数据库 MySQL
                MySQL主从配置
                MySQL主从配置
                |
                19天前
                |
                存储 关系型数据库 MySQL
                分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
                通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
                51 6
                |
                20天前
                |
                存储 关系型数据库 MySQL
                分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
                通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
                38 1
                |
                20天前
                |
                关系型数据库 MySQL Java
                MySQL主从复制实现读写分离
                MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
                MySQL主从复制实现读写分离
                |
                2月前
                |
                SQL 关系型数据库 MySQL
                MySQL----配置双主双从
                本文档详细介绍了如何在四台服务器上配置MySQL的双主双从架构。首先,通过关闭防火墙和SELinux确保网络通信畅通无阻。接着,设置各服务器的主机名和本地Host,确保名称解析正确。然后,通过YUM安装MySQL并修改初始密码。接下来,逐步配置四个节点(master01、master02、slave01、slave02),包括修改配置文件、创建用户和授权等步骤,实现主从复制。最后,通过SQL命令验证主从同步是否成功。
                下一篇
                无影云桌面