mysql5.7 主从复制配置

一、Mysql主从复制概述

1、Mysql主从复制概念

        MySQL主从复制(是一种数据库复制和数据共享的技术,它允许数据从一个MySQL数据库(主数据库)复制到一个或多个MySQL数据库(从数据库)。这种机制主要用于提高数据的可用性、实现数据的备份、以及分担数据库查询负载

###核心概念:
1.主数据库(Master):主数据库是数据变更(包括插入、更新和删除操作)发生的地方。它记录所有的数据变更事件到二进制日志(Binary Log)中。
2.从数据库(Slave):从数据库从主数据库接收数据变更事件,并将这些变更应用到自己的数据集中,从而保持与主数据库的数据一致性。
3.二进制日志(Binary Log):这是主数据库上的一个文件,记录了所有对数据库进行更改的事件。这些记录可以被从数据库用来复制数据。
4.中继日志(Relay Log):从数据库接收到来自主数据库的二进制日志后,会先将其存储在自己的中继日志中,然后再应用这些变更到自己的数据集中。

二、MySQL主从复制的三种同步模式

1.异步复制(Asynchronous replication)
    MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,
    这样就会有一个问题:主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,
    如果此时,强行将从提升为主,可能导致新主上的数据不完整。

2.全同步复制(Fully synchronous replication)
        指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。
    因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

3.半同步复制(Semisynchronous replication)
        介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,
    而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,
    同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

三、主从库配置设置

1.配置文件
1.修改master数据库的配置文件my.ini,linux为  vim /etc/my.cnf文件
    ## server-id=1 // 主库id
    ## log-bin=mysql-bin // 二进制日志存放位置
    ## binlog-format=row // 基于行的复制(此配置不是必须)
=============================================================
        
2.修改slave数据库配置项
    ## 同时添加replicate-do-db,这个是允许复制的数据库名称。
       如果没有该项,则默认复制所有数据库。如果要复制多个,需要重复写,比如:
        replicate-do-db=db
        replicate-do-db=db02 
    ##  server-id=2 // 从库id 
    ##  default-storage-engine=MyISAM // 一般从数据库做读数据库,不需要事务,故改成MyISAM引擎
================================================================
2.sql语句配置
master
----------------------------------------------------
###创建用户
1.master创建用户用于slave访问执行:
    create user 'slave'@'%' identified by '111';

###用户授权
1.授权所有库,只授予复制权限
    grant replication slave on *.* to slave@'%' identified by '111';
2.授权所有库,只能查询操作
    grant select on *.* to slave@'%'identified by '111';
3.授权所有库,授予所有权限
    grant all privileges on *.* to slave@'%' identified by '111';
4.直接使用root跳过创建用户,直接授权所有库并授予root复制权限
    grant replication slave on *.* to root@'%'identified by '111';

###刷新master权限
1.flush privileges;

###查询master当前状态
show master status
记住FIle文件名称和Position数值,一会儿填入slave
-----------------------------------------------------------------------

slvae
---------------------------------------------------------------
###停止slave同步进程
stop slave;

###执行同步SQL设置语句
    #master地址
        CHANGE MASTER TO MASTER_HOST = '127.0.0.1',
    #master端口
        MASTER_PORT = ,
    #masetr开通的账号
        MASTER_USER = '',
    #masetr开通的密码
        MASTER_PASSWORD = '',
    #masetr的file 查询主状态
        MASTER_LOG_FILE = '',
    masetr的pos 查询主状态
        MASTER_LOG_POS = ;

### 启动slave同步进程
start slave;

###查询slave 状态
show slave status 
看到 slave_IO_Running 和 slave_sql_running 同为YES 则同步成功

-------------------------------------------------------------------

=========================================================================
查看半同步状态
#主数据库执行
    show status like 'Rpl_semi_sync_master_status';
    show variables like 'rpl_semi_sync_master_timeout';
    #从数据库执行(此时可能还是OFF状态,需要在下一步重启IO线程后,从库半同步状态才会为ON)
    show status like 'Rpl_semi_sync_slave_status';

#重启从数据库上的IO线程
    STOP SLAVE IO_THREAD;
    START SLAVE IO_THREAD;

#在主库查询半同步状态
    show status like '%Rpl_semi%';    
    Rpl_semi_sync_master_clients                      #半同步复制客户端的个数
    Rpl_semi_sync_master_net_avg_wait_time            #平均等待时间(默认毫秒)
    Rpl_semi_sync_master_net_wait_time                #总共等待时间
    Rpl_semi_sync_master_net_waits                    #等待次数
    Rpl_semi_sync_master_no_times                     #关闭半同步复制的次数
    Rpl_semi_sync_master_no_tx                        #表示没有成功接收slave提交的次数
    Rpl_semi_sync_master_status               #表示当前是异步模式还是半同步模式,on为半同步
    Rpl_semi_sync_master_timefunc_failures            #调用时间函数失败的次数
    Rpl_semi_sync_master_tx_avg_wait_time             #事物的平均传输时间
    Rpl_semi_sync_master_tx_wait_time                 #事物的总共传输时间
    Rpl_semi_sync_master_tx_waits                     #事物等待次数
    Rpl_semi_sync_master_wait_pos_backtraverse        #可以理解为"后来的先到了,而先来的还没有到的次数"
    Rpl_semi_sync_master_wait_sessions    #当前有多少个session因为slave的回复而造成等待
    Rpl_semi_sync_master_yes_tx           #成功接受到slave事物回复的次数
3、半同步配置信息
安装条件----必须在mysql5.5版本以上

配置文件信息
-----------------------------------------------------------------------------
1.修改master--ini文件------------特别注意lib包别缺失,如果缺失从官网下载对应版本复制lib包
    #半同步复制配置
    #加载mysql半同步复制的插件
        plugin-load=rpl_semi_sync_master=semisync_master.so (windos的后缀是so换成dll) 
    #或者设置为"1",即开启半同步复制功能     
        rpl_semi_sync_master_enabled=ON        
    #超时时间为1000ms,即1s                        
        rpl_semi_sync_master_timeout=1000


2.修改slave--ini-配置信息
     #半同步复制配置
    ##  plugin-load=rpl_semi_sync_slave=semisync_slave.so (windos的后缀是so换成dll)   
    ##  rpl_semi_sync_slave_enabled=ON
--------------------------------------------------------------------------------

sql配置
================================================================
1.主库安装插件
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.dll';

2.从库安装插件
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.dll';

3.查看插件
    SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%semi%';
        +----------------------+---------------+
        | PLUGIN_NAME          | PLUGIN_STATUS |
        +----------------------+---------------+
        | rpl_semi_sync_master | ACTIVE        |
        +----------------------+---------------+
4.从库重新启动同步线程
    STOP/START SLAVE IO_THREAD;

5.查看运行状态
    1)主库查看半同步是否在运行
        show status like 'Rpl_semi_sync_master_status';
            +-----------------------------+-------+
            | Variable_name               | Value |
            +-----------------------------+-------+
            | Rpl_semi_sync_master_status | ON    |
            +-----------------------------+-------+
    2)从库查看半同步是否在运行
         show status like 'Rpl_semi_sync_slave_status';
            +----------------------------+-------+
            | Variable_name              | Value |
            +----------------------------+-------+
            | Rpl_semi_sync_slave_status | ON    |
            +----------------------------+-------+

    3)查看半同步超时时间,默认10秒,超时会自动降级为异步复制
         show variables like "rpl_semi_sync_master_timeout";
            +------------------------------+-------+
            | Variable_name                | Value |
            +------------------------------+-------+
            | rpl_semi_sync_master_timeout | 10000 |
            +------------------------------+-------+
    

四、半同步复制转为异步复制的情况

1.  当半同步复制发生超时(由rpl_semi_sync_master_timeout参数控制,默认为10000ms,即10s),
会暂时关闭半同步复制,转而使用异步复制,也就是会自动降为异步工作。
2.  当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,
收到了从库的响应, 则主从又重新恢复为半同步复制

五、使用半同步复制注意点

1.  在一主多从的架构中,如果要开启半同步复制,并不要求所有的从都是半同步复制。
2.  MySQL 5.7极大的提升了半同步复制的性能。
3.  5.6 版本的半同步复制,dump thread 承担了两份不同且又十分频繁的任务:
传送 binlog 给 slave ,还需要等待 slave 反馈信息,而且这两个任务是串行的,
dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。
dump thread 已然成为整个半同步提高性能的瓶颈。
在高并发业务场景下,这样的机制会影响数据库整体的系统吞吐量(TPS)。
4.  5.7 版本的半同步复制中,独立出一个 ack collector thread ,
专门用于接收 slave 的反馈信息。这样 master 上有两个线程独立工作,
可以同时发送 binlog 到 slave ,和接收 slave 的反馈。

=========================================================
5.如果配置文件配置成功,无法启动半同步状态,只保留 rpl_semi_sync_master_enabled=1 ,其他配置文件删除
  在主库中执行sql语句:
        SET GLOBAL rpl_semi_sync_master_enabled = 1;
        SET GLOBAL rpl_semi_sync_master_timeout = 1000
  在从库中执行sql语句:
        SET GLOBAL rpl_semi_sync_slave_enabled = 1;

六、常用命令

-- set GLOBAL server_id=2;
-- show variables like 'server_id';
-- show variables like '%server_uuid%';
-- show variables like '%server_id%';

##更改密码
set password for root@localhost = password('Easy@0122');

七、常见问题

1.注意:Slave_io_Running=Yes 不成立 原因可能是:ip地址、用户的权限 、密码 、pos值 不正确

+--------------------------------------------------------------------------------

2.UUID相同问题
    将slave虚拟机上的UUID的配置文件(auto.cnf)删除然后重启mysql服务即可

3.mysql数据库初始化
1.mysql数据库,找到bin目录文件下,执行 mysqld --initialize-insecure --user=mysql。
2.会有一个初始值密码,记住初始值密码,启动mysql服务,net .....start  
3.输入mysql -uroot -p 刚才初始化的零时密码登录

    注意:如果登录临时密码登不上去,请在ini文件中增加 skip-grant-tables=1  跳过登录密码,登录成功后,

在更改密码重启mysql即可
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值