mysql数据库的主从复制集群应用 (4)

一:mysql主从复制

1.1:mysql主从复制概述

主从复制(也称 AB 复制),允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。

1.1.1:主从复制的优点:

  1. 做数据的热备。
    作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
  2. 读写分离,使数据库能支撑更大的并发(主库负责写入,从库负责读取)

1.2:mysql主从复制的工作原理

在这里插入图片描述数据库有个bin-log二进制文件,记录了所有sql语句。

两个文件+3个线程:

  1. 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

  2. 从库生成两个线程,一个I/O线程,一个SQL线程;

  3. i/o线程连接到主库并请求主库发送binlog里面的更新记录到从库上。

    I/O线程读取主库的binlog输出线程(log dump线程)发送的更新并拷贝这些更新到本地文件relay log(中继日志) 文件中;

  4. SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

1.3:mysql主从复制的三种类型

binlog有三种格式:Statement、Row以及Mixed。

  • 基于SQL语句的复制(statement-based replication,SBR)

  • 基于行的复制(row-based replication,RBR)

  • 混合模式复制(mixed-based replication,MBR)

查看当前日志格式:

MariaDB [(none)]> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)

在线修改日志格式:(不演示)

mysql> set global binlog_format=mixed;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like "binlog_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED  |
+---------------+-------+
1 row in set (0.00 sec)

三种复制模式的优缺点:

  1. STATMENT模式:
    每一条会修改数据的sql语句会记录到binlog中。

    优点:不需要记录每一条SQL语句与每行的数据变化,这样子binlog的日志也会比较少,减少了磁盘IO,提高性能。

    缺点:在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)

  2. 基于行的复制:

    不记录每一条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成了什么样子了。(不记录sql执行过程,只记录结果!)

    优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。

    缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。

  3. 混合模式复制:以上两种模式的混合使用,

    一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

二:mysql主从复制配置

2.1:master配置

编辑/etc/my.cnf

server-id=1
#开启binlog文件
log-bin=mysql-bin

重启服务生效!

建立账号并授权:

MariaDB [(none)]> GRANT all ON *.* TO 'slave'@'192.168.1.9' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

查看master节点状态:
#记录下日志文件名和位置,备用

MariaDB [(none)]> show master status;
+------------------+----------+--------------+---------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            |
+------------------+----------+--------------+---------------------------------------------+
| mysql-bin.000003 |      459 |              | information_schema,performance_schema,mysql |
+------------------+----------+--------------+---------------------------------------------+

2.2:slave配置

编辑/etc/my.cnf

server-id=2

重启服务生效!

关闭从服务器的复制功能

stop slave;

配置从服务器,与主库建立连接。

MariaDB [(none)]> change master to master_host='192.168.1.8',master_user='slave',master_password='123456',master_log_file='mysql-bin.000003', master_log_pos=459;
Query OK, 0 rows affected (0.05 sec)

#开启复制功能!
MariaDB [(none)]> slave start;

检查从服务的复制功能状态

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

ariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.8
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 459
               Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2.3:主从复制测试

实验步骤:
1:在主库上创建一个库db1
2:登录到从库上,使用命令show databases;查看 db1是否存在
3:如果存在,说明主从复制是ok的!

三:mysql互为主从架构

其实很简单就是把原来的从库当主库,把原来的主库当从库。按照主从配置的方法从前把主库当从库,把从库当主库的配置一遍。

注意:务必要开启binlog文件

log-bin=mysql-bin

互为主从验证:
1:在两个节点上各自创建一个库db(130db,131db)
2:show databases;查看db是否已经同步过来。

猜你喜欢

转载自blog.csdn.net/zhangshaohuas/article/details/108994067