MYSQL数据库的主从复制,半同步复制和组复制

一.数据库的主从复制

原理:
master端产生一个binlogdump线程,slave端产生I/O线程和SQL线程
1.master节点上的binlogdump线程,在slave与其正常连接的情况下,将binlog发送到slave上。
2.slave节点上的I/O线程,通过读取master节点发送的内容,并将数据复制到本地的relaylog中。
3.slave节点上的SQL线程,读取relaylog中的日志,并将其事务在本地执行。

这里写图片描述
配置一主二从:
1.server1是主(master),server2和server3是从(slave),server2从server1同步数据,server3从server2同步数据,其实也相当于server3从server1上同步数据
2.在三台主机上分别解压安装数据库
tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar # 需要5.7及以上版本的mysql数据库
这里写图片描述
3.在server1中修改数据库的配置文件:

server-id=1            # 数据库中的id号,三者不能相同
log-bin=mysql-bin      # 允许slave同步自己的二进制文件

gtid_mode=ON           # 打开gtid模式
enforce-gtid-consistency=true   

这里写图片描述
4.在server1中mysql数据库中对slave(同步端)授权用户同步用户repl

grant replication slave on *.* to repl@'172.25.1.%' identified by 'Hellojay123+';  
# 对172.25.1.%网段有权限同步
show master status;      # 查看master的状态

这里写图片描述
5.在server2中修改mysql数据库的配置文件:

server-id=2    # 三者全部不相同
log-bin=mysql-bin    # 允许slave端同步自己的二进制日志
log-slave-updates

gtid_mode=on     # 开启gtid模式
enforce_gtid-consistency=true

6.在server2中添加自己的master(即server1端)

change master to master_host='172.25.1.1',master_user='repl',master_password='Hellojay123+',master_log_file='mysql-bin.000001',master_log_pos=842;
# master_log_file和master_log_pos与上边server1的保持一致
start slave;
show slave status\G;   (查看两个线程的状态是否是yes)

这里写图片描述
7.因为server2既是master端也是slave端,所以还要在server2中为server3授权可同步用户:

grant REPLICATION SLAVE on *.* to repl@'172.25.1.%' identified by 'Hellojay123+';

8.在server3中修改数据库的配置文件

server-id=3   # 三者的server-id均不能相同

gtid_mode=ON
enforce-gtid-consistency=true

在server3中接收成为server2的slave;

change master to master_host='172.25.1.2',master_user='repl',master_password='Hellojay123+', master_auto_position=1;
# master_auto_position=1是利用gtid自动验证二进制文件

9.查看server3的slave的状态,检测两个线程的状态是否为两个yes
这里写图片描述

二.基于组提交的并行复制

并发复制是数据库级别的,这意味着一个SQL线程可以处理一个数据库的连续事务,而不用等待其它数据库完成。这个版本的并发复制,可以理解成一个数据库一个SQL线程

在server2和server3(两个slave端)的配置文件中:

slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16     # worker 线程个数
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

最终结果:(16个线程在等待主线程的调用)
这里写图片描述

三.半同步复制:

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

1.在server1端上,因为server1是master端

install plugin rpl_semi_sync_master soname 'semisync_master.so';   
#安装master的插件
set global rpl_semi_sync_master_enabled = 1;
# 打开半同步复制master端的开关
show variables like 'rpl_semi_sync%';    # 查看各个参数的状态
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |   # 必须为ON状态
| rpl_semi_sync_master_timeout              | 10000      |# 半同步等待的时间,默认10s
| 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 |
+-------------------------------------------+------------+

show status like 'rpl_semi_sync%';
mysql> show status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |  # 该master端所拥有的slave端
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |  # 同步失败的次数
| Rpl_semi_sync_master_status                | ON    |  # master的状态
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |  # 同步成功的次数
+--------------------------------------------+-------+

这里写图片描述
2.因为server2既是master也是slave,要安装master的插件也要安装slave的插件

install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
set global rpl_semi_sync_slave_enabled = 1;
set global rpl_semi_sync_master_enabled = 1;

show variables like 'rpl_semi_sync%';
+-------------------------------------------+------------+
| 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 |
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.00 sec)

mysql> show status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_status                 | ON    |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)


stop slave io_thread;
start slave io_thread;   # 重启io线程

这里写图片描述
3.在server3上,因为server3是slave端,只需要做slave端的配置

set global rpl_semi_sync_slave_enabled = 1;
stop slave io_thread;
start slave io_thread;
show status like 'rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+

show variabl
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
es like 'rpl_semi_sync%';

验证结果:
在server1上插入数据,在server3上查看是否同步过来,并查看成功的次数。
在server2上关闭io线程,在server1端查看数据插入的时间,等待时间为默认的10s
这里写图片描述
这里写图片描述

四.MYSQL数据库的组复制

数据库组复制的原理:
组复制是一种可用于实现容错系统的技术。复制组是一个通过消息传递相互交互的服务器组。通信层提供了很多保证,例如原子消息和总消息序号的传递。通过这些强大的特性,我们可以构建更高级的数据库复制解决方案。

MySQL组复制构建在这些属性和抽象之上,并实现多主复制协议的更新。实质上,复制组由多个数据库实例组成,并且组中的每个实例都可以独立地执行事务。但是所有读写(RW)事务只有在被组批准后才会提交。只读(RO)事务不需要在组内协调,因此立即提交。换句话说,对于任何RW事务,组需要决定是否提交,因此提交操作不是来自始发服务器的单向决定。准确地说,当事务准备好在始发服务器上提交时,该始发服务器原子地广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后为该事务建立一个全局总序号。最终,这意味着所有服务器以相同的顺序接收同一组事务。因此,所有服务器以相同的顺序应用相同的一组更改,因此它们在组内保持一致。

数据库组复制的配置:
1.在三个节点server1,2,3停掉之前的数据库服务,清空数据库数据目录(/var/lib/mysqld)中所有的缓存记录。
2.配置三个节点处的配置文件

server-id=1       # server-id三个节点保持不同
gtid_mode=ON      # gtid模式打开
enforce-gtid-consistency=on

master_info_repository=TABLE    # 把relay.info记录在slave_relay_log_info表里
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name='d14fed72-9c7c-11e8-b20c-525400b41bb7'
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="172.25.1.1:24901"   # 自身的ip地址
loose-group_replication_group_seeds="172.25.1.1:24901,172.25.1.2:24901,172.25.1.3:24901"

loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=off
loose-group_replication_enforce_update_everywhere_checks=on

loose-group_replication_ip_whitelist="172.25.1.0/24,127.0.0.1/8"

3.在server1中设定数据库的初始密码配置组复制:
(1)不开启日志同步
SET SQL_LOG_BIN=0; #
(2)向rpl_user用户授予所有权限,所有用户均可利用rpl_user用户同步
GRANT REPLICATION SLAVE ON . TO rpl_user@’%’ IDENTIFIED BY ‘Hellojay123+’;
(3)刷新授权表
FLUSH PRIVILEGES;
(4)reset master;
(5)开启日志记录
SET SQL_LOG_BIN=1;
(6)CHANGE MASTER TO MASTER_USER=’rpl_user’,MASTER_PASSWORD=’Hellojay123+’ FOR CHANNEL ‘group_replication_recovery’;
(7)INSTALL PLUGIN group_replication SONAME ‘group_replication.so’;
(8)SHOW PLUGINS;
(9)SET GLOBAL group_replication_bootstrap_group=ON;
(10)START GROUP_REPLICATION;
(11)SET GLOBAL group_replication_bootstrap_group=OFF;
(12)SELECT * FROM performance_schema.replication_group_members;
server1配置完成后处于online状态:
这里写图片描述
4.在server2和server3中设定数据库的初始密码配置组复制:
这里写图片描述
配置完成后,server2和server3处于online状态:
这里写图片描述

5.测试:
(1)在server1建数据库建表,检测server2和server3是否同步
server1:
这里写图片描述
server2:
这里写图片描述
server3:
这里写图片描述

(2)在server2和server3中向数据库中插入数据,检测在各个节点是否同步
server2:
这里写图片描述
server1:
这里写图片描述
server3:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/jay_youth/article/details/81570700
今日推荐