暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql主从复制

杨遥 2019-08-07
193

Mysql复制简介

简单来说就是讲master上面的数据复制,同步到另外一台slave,默认情况是异步同步的。
Mysql复制原理

复制原理图

  • master节点开启binlog二进制日志

  • slave端的io线程发送请求到master端的binlog dump 线程获取二进制日志文件

  • master的binlog发送数据到slave的io线程

  • slave的io线程写入日志到relaylog

  • sql 线程执行sql操作同步数据到slave数据库

主从复制的好处

AB模式可以做读写分离。也可以将B服务器当做备份数据库。但是AB模式还是常用于读写分离,一般而言master节点可以读写,slave只能读,这样在一定程度上减轻了master的压力。这里我之前遇到过一个问题,小伙伴们一起思考一下。

思考:对于主从复制,主到从的数据同步过程可能需要一定的时间,但是我们线上有这么个需求,就是更新完之后要立马能查询最新的信息,那么我们还能采用读写分离吗?

结论:对于这样的需求一般而言,同步的时间我们是能接受的,但是不排除确有这样的需求。如果你这样的需求,我们该怎么办呢?我们之前采用的个别读写都是master,其他走读写分离。不知道你们有什么好的解决方案没,有的话欢迎一起探讨。

主从环境搭建
  • 下载rpm包

官方地址:https://dev.mysql.com/downloads/repo/yum/
    wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
    官方解释这个rpm包是包含8.0和5.7等其他版本的,所以我们可以放心大胆的下载安装,最后根据自己选择安装mysql版本即可。

    执行安装rpm包,但是上面说到当前mysql版本默认是8.0,我们需要修改为/etc/yum.repos.d/mysql-community.repmysql5.7enable=1和mysql 8.0enable=0
      rpm -ivh mysql80-community-release-el7-3.noarch.rpm
      vi /etc/yum.repos.d/mysql-community.repo

      修改完成后,我们执行以下命令安装

        yum makecache fast //更新缓存
        yum install -y mysql-community-server //安装mysql-server
        安装完成之后,我们需要在master的配置文件加入一下配置
          server-id=1
          log-bin=mysql-bin
          datadir=/var/lib/mysql //默认数据目录,要想迁移请stop后cp到其他目录
          slave增加以下配置
            server-id=2 //不能与master相同,唯一标识
            # log-bin=mysql-bin //slave不需要开启
            datadir=/var/lib/mysql
            启动mysql
              systemctl start mysqld
              修改mysql的root密码,默认密码在/var/log/mysqld.log
                grep 'temporary password' var/log/mysqld.log
                ALTER USER 'root'@'localhost' IDENTIFIED BY 'Aa@123456';
                在master端创建一个账户,用来做数据同步
                  # 创建用户
                  create user 'sync_user'@'192.168.3.4' identified by 'Aa@123456';
                  # 授权
                  grant replication slave on *.* to 'sync_user'@192.168.3.4;
                  # 刷新权限
                  flush privileges;

                  查看master的日志文件和位置信息

                    mysql> show master status\G;
                    *************************** 1. row ***************************
                    File: mysql-bin.000002
                    Position: 1173
                    Binlog_Do_DB:
                    Binlog_Ignore_DB:
                    Executed_Gtid_Set:
                    1 row in set (0.00 sec)

                    slave上执行同步操作

                      change master to master_host='192.168.3.3',master_user='sync_user',master_password='Aa@123456',master_log_file='mysql-bin.000002',master_log_pos=1173;
                      start slave;

                      查看slave同步状态是否正常,只要看到我们的IO和SQL处于running即可,并且日志文件和pos也是正确的。

                        show slave status\G;

                        验证

                        在mster上创建一个数据库试试,重点不在建表建库我就随便建,验证一下同步状态。

                          create database t1;
                          create table t1.t1(a int(11) );
                          insert into t1.t1 values(1);
                          slave查询是否有当前库当前表当前数据
                            show databases;
                            use t1;
                            show tables;
                            select * from t1;
                            可以看到我们的slave已经正常同步到数据了

                            文章转载自杨遥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论