mysql主从复制无忧(主从及主主配置全过程)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

主从复制解决的是:让一台服务器数据与另外的服务器数据保持一致。
主从服务器的版本最好一致。(从服务器的版本也可以高于主服务器)
   主从同步的原理;

wKiom1h7BiCifzkEAAAvYX_FyYo375.png-wh_50

主从同步  涉及到3个 线程: 主服务器(master)I/O thread    和从服务器(slave)I/Othread  以及SQL thread
    实现mysql主从复制(同步)的本质:
        在主服务器上开启Mysql的binary-log(产生二进制日志文件)功能。
    整个复制过程:从服务器(slave)从主服务器端(master)获取该日志,然后在(slave)从服务器上将二进制文件解析成SQL语句并完全顺序地执行SQL语句所记录的各种操作。
    具体过程:
        1)从服务器上的I/O线程连接上主服务器,然后请求从指定日志文件的指定位置或者从最开始的日志位置之后的日志内容。
        2)从服务器在接收到来自从服务器的I/O线程请求后,,通过自身的I/O线程,根据请求信息读取指定日志位置之后的日志信息,
        并返回从服务器端的I/O线程,返回的信息中除了日志所包含的信息之外,还包括此次返回的信息在主服务器端对应二进制文件
        的名称以及在二进制日志中的位置。
        3)从服务器的I/O线程接收到信息后,将获取到的日志内容依次写入从服务器端的中继日志文件(relay)的最后,并且讲读取到的主服务器端的二进制日志的文件名和位置记录到一个名为master-info文件中,方便在下一次读取的时候能够迅速定位从哪个位
        置开始往后读取日志信息。
        4)从服务器的SQL线程在检测到中继日志文件中新增加了内容后,会马上解析该中继日志文件中的内容,将日志内容解析为SQL语句,然后在自身执行这些SQL,由于是在主服务器端和从服务器端执行了同样的SQL操作,所以两端的数据是完全一样的。

    实施分四步: 1.建立mysql主从服务器连接
                2.master开启 binarylog 功能
                3.master授权用户(用来在slave上面登录的)
                4.slave获取master信息。

实验过程:
    准备阶段:
        master 端
        ip :192.168.1.151   
        [root@www data]# mysqld -V   # 查看mysql版本
        mysqld  Ver 5.5.33-log for linux2.6 on x86_64 (MySQL Community Server (GPL)) 
        [root@www data]# uname -r
        2.6.32-642.11.1.el6.x86_64
        [root@www data]# cat /etc/issue
        CentOS release 6.8 (Final)

        slave  端
        ip ;192.168.1.123
        [root@jf6 data]# mysqld -V
        mysqld  Ver 5.5.33-log for linux2.6 on x86_64 (MySQL Community Server (GPL))
        [root@jf6 data]# uname -r
        2.6.32-642.11.1.el6.x86_64
        [root@jf6 data]# cat /etc/issue
        CentOS release 6.8 (Final)

        统一数据库环境:(同步一个库文件 库名:swallow)
        master端
        [root@jf6 data]# service mysqld status
        SUCCESS! MySQL running (16394)
        进入数据库:
        [root@jf6 data]# mysql -uroot -p
        Enter password:
        mysql>
        创建一个库名:swallow   表名  test   字段 id     插入数据  1
        mysql> select * from swallow.test;
        +------+
        | id   |
        +------+
        |    1 |
        +------+
        复制这个库:
        [root@jf6 data]# mysqldump -uroot -p swallow >mysql.sql
        Enter password: 
        将创建的数据库复制到slave端下
        [root@jf6 data]# scp mysql.sql root@192.168.1.123:/root/
                root@192.168.1.123's password: 
                mysql.sql                                                             100% 1784     1.7KB/s   00:00 
        slave 端:
        [root@www data]# mysql -uroot -p
        mysql> create database swallow;       
        mysql> use swallow
        Database changed
        mysql> source /root/mysql.sql;
        mysql> select * from swallow.test;
        +------+
        | id   |
        +------+
        |    1 |
        +------+
    开启主从复制配置模式:
        master端:
        vim /etc/my.cnf
            server-id       = 1    #属于标识符,区别数据库
            log-bin=mysql-bin       #开启binarylog 功能生成 二进制文件
            binlog-do-db=swallow    # 指明要同步的库
        重启mysql。
    复制同步的第一条件:2个mysql服务器可以互通,采用授权的方式。
        mysql> grant replication slave on *.* to 'slave123'@'192.168.1.123' identified by '123456';
        (  replication slave 赋予取得 二进制日志的权利         )
        slave 端:
        vim /etc/my.cnf
            server-id      =2 
        重启mysql
            测试连通性: 
            [root@www ~]# mysql -h 192.168.1.151 -u slave123 -p123456
            Welcome to the MySQL monitor.  Commands end with ; or \g.
            Your MySQL connection id is 3
            Server version: 5.5.33-log MySQL Community Server (GPL)

            Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

            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> 
            可以连接上master端。
    开启slave服务器:目的是探知 master服务器的二进制文件的名称和开始点
        首先查询 master状态:(取得二进制文件和开始点)
            master端
            mysql> show master status;
            +------------------+----------+--------------+------------------+
            | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
            +------------------+----------+--------------+------------------+
            | mysql-bin.000002 |      107 | swallow      |                  |
            +------------------+----------+--------------+------------------+
            slave端
            mysql> change master to \
            -> master_host='192.168.1.151',              #指明master地址
            -> master_user='slave123',                   #指明授权用户。可以连接master的用户
            -> master_password='123456',                 #指明进入master的验证
            -> master_log_file='mysql-bin.000002',       # 指明二进制文件
            -> master_log_pos=107;                       #指明获取该文件的开始点
            mysql> slave start;             #开启 slave  
            mysql> slave start;
            Query OK, 0 rows affected (0.00 sec)

            mysql> show slave status \G;
            *************************** 1. row ***************************
                           Slave_IO_State: Waiting for master to send event
                              Master_Host: 192.168.1.151     ######## master_host
                              Master_User: slave123          ######## master_user
                              Master_Port: 3306
                            Connect_Retry: 60
                          Master_Log_File: mysql-bin.000003
                      Read_Master_Log_Pos: 107               
                           Relay_Log_File: www-relay-bin.000003
                            Relay_Log_Pos: 253
                    Relay_Master_Log_File: mysql-bin.000003
                         Slave_IO_Running: Yes             ######### IOthread  正常
                        Slave_SQL_Running: Yes              ######## SQLthread  正常
        测试主从:
            master端:
                mysql> use swallow
                mysql> insert into test values(2);
                mysql> insert into test values(3);
                mysql> insert into test values(4);
            slave端:
                mysql> select * from swallow.test;
                +------+
                | id   |
                +------+
                |    1 |
                |    2 |
                |    3 |
                |    4 |
                +------+
                  
小贴士: 还有一种开启slave的方法:就是在mysql5.1 版本下  在配置文件中写入  master_host  master_user master_password  
        这3个参数。由于后期版本采用引擎(mysql5.5的默认存储引擎是)innodb,是不是myisam引擎(mysql5.1的版本)。
        所以,如果安装的版本高于5.1 不要这样做了。因为:引擎的变化。/etc/my.cnf主配置文件里面不支持上面3个参数。
        加入后,会造成slave服务器的mysql无法启动。

    顺手做个主主配置吧。(实质就是把刚才的配置主从交换下)
        slave端(这里沿袭上面的叫法。防止弄乱了)
            vim /etc/my.cnf
            log-bin=mysql-bin           #开启产生日志功能
            binlog-do-db=swallow        #定义同步库
            重启mysql服务
            mysql> grant replication slave on *.* to 'slave151'@'192.168.1.151' identified by '123456'; 
            查看服务器状态:
            mysql> show master status;
            +------------------+----------+--------------+------------------+
            | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
            +------------------+----------+--------------+------------------+
            | mysql-bin.000002 |      265 | swallow      |                  |
            +------------------+----------+--------------+------------------+ 

        master端  (这里沿袭上面的叫法。防止弄乱了)
            测试连通性:
            [root@jf6 data]# mysql -h 192.168.1.123 -uslave151 -p123456
            Welcome to the MySQL monitor.  Commands end with ; or \g.
            Your MySQL connection id is 4
            Server version: 5.5.33-log MySQL Community Server (GPL)
            Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
            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>   
                            开启slave配置:
            mysql> change master to \
            -> master_host='192.168.1.123', 
            -> master_user='slave151', 
            -> master_password='123456', 
            -> master_log_file='mysql-bin.000002', 
            mysql> slave start;
            mysql> show slave statu \G;
            ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'statu' at line 1
            ERROR: 
            No query specified

            mysql> show slave status \G;
            *************************** 1. row ***************************
                       Slave_IO_State: Waiting for master to send event
                          Master_Host: 192.168.1.123
                          Master_User: slave151
                          Master_Port: 3306
                        Connect_Retry: 60
                      Master_Log_File: mysql-bin.000002
                  Read_Master_Log_Pos: 265
                       Relay_Log_File: jf6-relay-bin.000002
                        Relay_Log_Pos: 253
                Relay_Master_Log_File: mysql-bin.000002
                     Slave_IO_Running: Yes
                    Slave_SQL_Running: Yes
    测试方法:
        slave端:
            mysql> use swallow
            mysql> insert into test values(1);
        master端
            mysql> use swallow
            mysql> insert into test values(2);
    两边交替插入数据;
        结果:
            mysql> select * from test;        
            +------+
            | id   |
            +------+
            |    1 |
            |    2 |
            |    3 |
            |    4 |
            |    1 |
            |    2 |
            |    1 |
            |    2 |
            |    1 |
            |    2 |
            +------+

    这里需要注意的关键点:
        1.主服务器开启binarylog功能(log-bin=mysql-bin ),以及日志状态。
         mysql> show master status;
            +------------------+----------+--------------+------------------+
            | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
            +------------------+----------+--------------+------------------+
            | mysql-bin.000002 |      265 | swallow      |                  |
            +------------------+----------+--------------+------------------+ 
        2.开启slave服务时:别忘了  开启slave。
        3.slave的状态监控:(如果IO 和SQL都OK 就OK了)
                   Slave_IO_Running: Yes
                    Slave_SQL_Running: Yes
        如果是no:IO一般和权限之类有关系。因为IO负责2个服务之间通信
                    SQL 则是自己的原因。因为他的作用就是 从relay-log里面查看变化
                    转化成SQL  依照顺序写入 从服务器。
        4.主配置文件:  server-id  不要相同。










本文转自 swallow_zys  51CTO博客,原文链接:http://blog.51cto.com/12042068/1891922,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
SQL 关系型数据库 MySQL
mysql 主从复制与读写分离
mysql 主从复制与读写分离
|
1天前
|
SQL 负载均衡 关系型数据库
mysql主从复制,从搭建到使用
mysql主从复制,从搭建到使用
11 1
|
1天前
|
Prometheus 监控 关系型数据库
数据库同步革命:MySQL GTID模式下主从配置的全面解析
数据库同步革命:MySQL GTID模式下主从配置的全面解析
7 0
|
1天前
|
SQL 监控 关系型数据库
探秘MySQL主从复制的多种实现方式
探秘MySQL主从复制的多种实现方式
8 0
|
1天前
|
开发工具
centos8 yum安装mysql8 流程配置
centos8 yum安装mysql8 流程配置
|
12天前
|
存储 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何配置可以实现实时同步多张MySQL源表时只读取一次binlog
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
13天前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用合集之同步MySQL数据到Hologres时,配置线程池的大小该考虑哪些
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
13天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错之遇到MySQL服务器的时区偏移量(比UTC晚18000秒)与配置的亚洲/上海时区不匹配,如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
13天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之mysql cdc支持全量的时候并发读取,该如何配置
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5天前
|
存储 NoSQL 关系型数据库
mysql 数据库 基本介绍
mysql 数据库 基本介绍