目录
- 一:mysql主从复制
- 1.1:mysql主从复制概述
- 1.1.1:主从复制的优点:
- 1.2:mysql主从复制的工作原理
- 1.3:mysql主从复制的三种类型
- 二:mysql主从复制配置
- 2.1:master配置
- 2.2:slave配置
- 2.3:主从复制测试
- 三:mysql互为主从架构
一:mysql主从复制
1.1:mysql主从复制概述
主从复制(也称 AB 复制),允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。
1.1.1:主从复制的优点:
- 做数据的热备。
作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。 - 读写分离,使数据库能支撑更大的并发(主库负责写入,从库负责读取)
1.2:mysql主从复制的工作原理
数据库有个bin-log二进制文件,记录了所有sql语句。
两个文件+3个线程:
- 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
- 从库生成两个线程,一个I/O线程,一个SQL线程;
- i/o线程连接到主库并请求主库发送binlog里面的更新记录到从库上。
I/O线程读取主库的binlog输出线程(log dump线程)发送的更新并拷贝这些更新到本地文件relay log(中继日志) 文件中; - 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)
三种复制模式的优缺点:
- STATMENT模式:
每一条会修改数据的sql语句会记录到binlog中。
优点:不需要记录每一条SQL语句与每行的数据变化,这样子binlog的日志也会比较少,减少了磁盘IO,提高性能。
缺点:在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题) - 基于行的复制:
不记录每一条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成了什么样子了。(不记录sql执行过程,只记录结果!)
优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。
缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。 - 混合模式复制:以上两种模式的混合使用,
一般的复制使用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是否已经同步过来。