MySQL主从复制

为什么要做主从复制?

1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

2、做数据的热备

3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

mysql主从复制的原理是什么?

binlog: binary log,主库中保存更新事件日志的二进制文件。

主从复制的基础是主库记录数据库的所有变更记录到binlog。binlog是数据库中保存配置中过期时间内所有修改数据库结构或内容的一个文件。如果过期时间是10d的话,那么就是最近10d的数据库修改记录。

mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。

在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,是之后从库连接到主库时,从主库拉取过来进行复制操作的数据源。

binlog输出线程。每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。
对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。

在从库里,当复制开始的时候,从库就会创建两个线程进行处理:

从库I/O线程。当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。
从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

从库的SQL线程。从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。

从库通过创建两个独立的线程,使得在进行复制时,从库的读和写进行了分离。因此,即使负责执行的线程运行较慢,负责读取更新语句的线程并不会因此变得缓慢。比如说,如果从库有一段时间没运行了,当它在此启动的时候,尽管它的SQL线程执行比较慢,它的I/O线程可以快速地从主库里读取所有的binlog内容。这样一来,即使从库在SQL线程执行完所有读取到的语句前停止运行了,I/O线程也至少完全读取了所有的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下一次启动的时候执行语句。

 

整个主从复制的流程可以通过以下步骤理解:

  • 步骤一:主库db的更新事件(update、insert、delete)被写到binlog
  • 步骤二:从库发起连接,连接到主库
  • 步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库
  • 步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
  • 步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db

 

主从复制配置

步骤如下:

主服务器:从服务器ip地址分别为

 

    192.168.145.222、192.168.145.226  


1、修改主服务器master:

 

 

    vi /etc/my.cnf  
    [mysqld]  
        log-bin=mysql-bin   #[必须]启用二进制日志  
        server-id=222      #[必须]服务器唯一ID,默认是1,一般取IP最后一段  


2、修改从服务器slave:

 

 

 

 

vi /etc/my.cnf  
[mysqld]  
     log-bin=mysql-bin   #[不是必须]启用二进制日志  
     server-id=226      #[必须]服务器唯一ID,默认是1,一般取IP最后一段 

3、重启两台服务器的mysql

 

 

systemctl restart mariadb


4、在主服务器上建立帐户并授权slave:

 

 

mysql  
mysql>GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456'; //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

5、登录主服务器的mysql,查询master的状态

 

    mysql>show master status;  
     +------------------+----------+--------------+------------------+  
     | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
     +------------------+----------+--------------+------------------+  
     | mysql-bin.000004 |      308 |              |                  |  
     +------------------+----------+--------------+------------------+  
     1 row in set (0.00 sec)  


注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

 

 

 

 

6、配置从服务器Slave:

注意mysql-bin.000004和308是第五步中的File和Position

 

mysql>change master to master_host='192.168.145.222',master_user='mysync',master_password='q123456',master_log_file='mysql-bin.000004',master_log_pos=308; //注意mysql-bin.000004和308是第五步中的File和  
Position Mysql>start slave; //启动从服务器复制功能 


7、检查从服务器复制功能状态:

 

 

    mysql> show slave status\G  
    ************************** 1. row ***************************  
      
                Slave_IO_State: Waiting for master to send event  
                Master_Host: 192.168.2.222  //主服务器地址  
                Master_User: mysync   //授权帐户名,尽量避免使用root  
                Master_Port: 3306    //数据库端口,部分版本没有此行  
                Connect_Retry: 60  
                Master_Log_File: mysql-bin.000004  
                Read_Master_Log_Pos: 600     //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos  
                Relay_Log_File: ddte-relay-bin.000003  
                Relay_Log_Pos: 251  
                Relay_Master_Log_File: mysql-bin.000004  
                Slave_IO_Running: Yes    //此状态必须YES  
                Slave_SQL_Running: Yes     //此状态必须YES  
                      ......  

 

 

 

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

以上操作过程,主从服务器配置完成。

9、主从服务器测试:

主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:

    mysql> create database hi_db;  
      Query OK, 1 row affected (0.00 sec)  
      
      mysql> use hi_db;  
      Database changed  
      
      mysql>  create table hi_tb(id int(3),name char(10));  
      Query OK, 0 rows affected (0.00 sec)  
       
      mysql> insert into hi_tb values(001,'bobu');  
      Query OK, 1 row affected (0.00 sec)  
      
      mysql> show databases;  
       +--------------------+  
       | Database           |  
       +--------------------+  
       | information_schema |  
       | hi_db                |  
       | mysql                |  
       | test                 |  
       +--------------------+  
       4 rows in set (0.00 sec)  
      
    从服务器Mysql查询:  
      
       mysql> show databases;  
      
       +--------------------+  
       | Database               |  
       +--------------------+  
       | information_schema |  
       | hi_db                 |       //I'M here,大家看到了吧  
       | mysql                 |  
       | test          |  
      
       +--------------------+  
       4 rows in set (0.00 sec)  
      
       mysql> use hi_db  
       Database changed  
       mysql> select * from hi_tb;           //查看主服务器上新增的具体数据  
       +------+------+  
       | id   | name |  
       +------+------+  
       |    1 | bobu |  
       +------+------+  
       1 row in set (0.00 sec)  

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值