目录

一、半同步模式

Ⅰ、MySQL半同步复制的问题

半同步测试搭建

【二进制日志和redo, undo的关系】

【二进制的作用:】

二、异步模式:

三、同步模式

(组复制)group replication

架构:

一主多从,再级联

一主一从

主主复制


一、半同步模式

mysql主主复制原理 mysql主从复制三种模式_mysql主主复制原理

sync :同步

async : 异步

semi-sync : 半同步

Ⅰ、MySQL半同步复制的问题

mysql主主复制原理 mysql主从复制三种模式_mysql主主复制原理_02

- rpl_semi_sync_master_wait_point 等待slave的ack确认

- AFTER_SYNC(默认)︰源将每个事务写入其二进制日志和副本,并将二进制日志同步到磁盘。同步后,源将等待事务接收的副本确认。收到确认后,源将事务提交到存储擎,并将结果返回给客户端,然后客户端可以继续进行。

- AFTER CONNIT:源将每个事务写入其二进制日志和副本中,同步二进制日志,然后副事务提交到存储引擎。提交后,源将等待事务回执的副本确认。收到确认后,源将结果返回给客户端,然后客户端可以继续进行。

下面步骤、结构图更简单直观

mysql主主复制原理 mysql主从复制三种模式_mysql主主复制原理_03

mysql主主复制原理 mysql主从复制三种模式_MySQL_04

半同步测试搭建

master上:

#1、在master上
    ---安装插件
shimm@TestDB 15:37  mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.00 sec)
    --- 查看状态
shimm@TestDB 15:37  mysql>show plugins;
#启用半同步
shimm@TestDB 15:40  mysql>set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
shimm@TestDB 15:40  mysql>show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
shimm@TestDB 15:42  mysql>
#2、slave上的操作
    ---安装插件    
root@(none) 15:48  mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.03 sec)
    --- 查看状态
root@(none) 15:52  mysql>show plugins;
……………………
| rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
+----------------------------+----------+--------------------+--------------------+---------+
45 rows in set (0.01 sec)
    --- 启用半同步
root@(none) 15:53  mysql>set global rpl_semi_sync_slave_enabled=1;   #(0/1)  -->1是开启状态,0 是关闭状态
Query OK, 0 rows affected (0.00 sec)
    --- 刷新服务
root@(none) 15:53  mysql>stop slave;
Query OK, 0 rows affected (0.03 sec)
root@(none) 15:52  mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 16:06  mysql>show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.01 sec)
root@(none) 16:12  mysql>
#3、半同步测试
从库停止复制以后在主库建表测试

rpl_semi_sync_master_timeout,the value N is glven in milliseconds.The sefault value is 10000(10 seconds).

如果ack确认包在10秒钟内没有送达,master会启用异步模式。

slave上:

#slave服务器上
root@(none) 16:16  mysql>stop slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 16:23  mysql>
#主服务器上
shimm@TestDB 16:17  mysql>create database s;
Query OK, 1 row affected (10.00 sec)
shimm@TestDB 16:23  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| TestDB             |
| apiserver          |
| flask_SM           |
| flask_TM           |
| mysql              |
| performance_schema |
| s                  |
| sys                |
| training           |
+--------------------+
11 rows in set (0.00 sec)
#在master上查看,slave的复制账号一直连接到master上
root@(none) 17:02  mysql>show processlist;
+----+----------+---------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User     | Host                | db   | Command     | Time | State                                                         | Info             |
+----+----------+---------------------+------+-------------+------+---------------------------------------------------------------+------------------+
|  2 | root     | localhost           | NULL | Query       |    0 | starting                                                      | show processlist |
|  4 | sc_slave | 192.168.8.142:36634 | NULL | Binlog Dump |  138 | Master has sent all binlog to slave; waiting for more updates | NULL             |
+----+----------+---------------------+------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
root@(none) 17:03  mysql>

master服务器/etc/my.cnf里加入:

rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1second

socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
log_bin
server_id=1
expire_logs_days = 7
gtid-mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1second
innodb_buffer_pool_size = 512M
character-set-server=utf8

slave服务器/etc/my.cnf里加入:

rpl_semi_sync_slave_enabled=1

socket=/data/mysql/mysql.sock
port = 3306
server_id = 2
log_bin
gtid-mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
rpl_semi_sync_slave_enabled=1
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8

【二进制日志和redo, undo的关系】

什么时候会产生二进制日志?

binlog是记录所有数据库表结构变更(例如CREATE、ALTER

TABLE..)以及表数据修改(INSERT、UPDATE、DELET...)的二进制日志。

二进制日志不是存储引擎管理的,是MySQL内部的相关线程去完成。

二进制日志保存下来的2个过程:

flush:将二进制日写到binlog_buffer里 --》sync:将binlog_buffer里的内容刷盘到disk里binlog file

【二进制的作用:】

1、方便恢复数据(增量)

2、主从复制需要使用

        延迟备份

可以快速的恢复数据,比使用全备+二进制日志恢复更加快一些。

二、异步模式:

常见的主从复制

缺点:有延迟,会数据丢失、

三、同步模式

(组复制)group replication

单组

多组复制(至少需要三台master)

mysql主主复制原理 mysql主从复制三种模式_MySQL_05

mysql主主复制原理 mysql主从复制三种模式_mysql_06

架构:

一主多从,再级联

一主一从

主主复制

双机热备

  双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。

双机热备的好处

1.可以做灾备,其中一个坏了可以切换到另一个。

2可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量。对于异地热备,尤其适合灾备。

  • 互为主从,同时为2个机器里写数据
  • 可以是相同的库和表,也可以是不同的库和表
  • 给写入的表设置不同的起始值相同的偏移量
  • 若主主双方都操作,最好设置auto-increment-offset 和auto-increment-increment,以避免冲突,若只在其中一个库操作,可不需要设置。

mysql主主复制原理 mysql主从复制三种模式_MySQL_07