一.数据库的主从复制

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

配置一主一从:

1.server1是主(master),server2是从(slave),server2从server1同步数据。

2.在两台主机上分别解压安装数据库

tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar

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

3.在server1中修改数据库的配置文件:

[[email protected] ~]# vim /etc/my.cnf
server-id=1            # 数据库中的id号,两者不能相同
log-bin=mysql-bin      # 允许slave同步自己的二进制文件

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

4.配置完成后启动数据库,并查看数据库的初始密码

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

5.对数据库进行初始化,设置的新密码必须是'大小写字母+数字+特殊字符并且超过8位'

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

6.登录数据库,在server1中mysql数据库中对slave(同步端)授权用户同步用户repl

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

 对172.25.254.%网段有权限同步, 查看master的状态

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

7.在server2中修改mysql数据库的配置文件:

[[email protected] ~]# vim /etc/my.cnf

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

8.配置完成后启动数据库,并查看数据库的初始密码

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

9.对数据库进行初始化

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

10.登录数据库,将slave与master建立连接,开启slave,并查看两个线程的状态是否为Yes

master_log_file和master_log_pos与server1保持一致

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

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

测试:
主库写入

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

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

从库查看

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

二、基于gtid的主从复制

在server1中修改数据库的配置文件:

[[email protected] ~]# vim /etc/my.cnf   打开gtid模式

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

重新启动数据库[[email protected] ~]# systemctl restart mysqld

在server2中修改数据库的配置文件:

[[email protected] ~]# vim /etc/my.cnf

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

重新启动数据库

登录数据库,停掉slave,重新建立连接,并查看线程状态

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

测试:
server1在列表中写入

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

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

server2查看

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

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

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

三、半同步复制:

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

首先安装master插件,打开半同步master端的开关

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 安装master的插件
Query OK, 0 rows affected (0.43 sec)

mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;  打开半同步复制master端的开关
Query OK, 0 rows affected (0.00 sec)

mysql> show status like '%rpl%';
+--------------------------------------------+-------+
| 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    |  # 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     | # 同步成功的次数
+--------------------------------------------+-------+
14 rows in set (0.01 sec)

mysql> show variables like '%rpl%';# 查看各个参数的状态
+-------------------------------------------+------------+
| 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 |
| rpl_stop_slave_timeout                    | 31536000   |
+-------------------------------------------+------------+
7 rows in set (0.00 sec)

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

在server2上,因为server2是slave端,只需要做slave端的配置

按装插件,开启半同步,关闭slave_io,在开启,使更改生效

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

测试:

当server2关闭io线程,在server1端查看数据插入的时间,等待时间为默认的10s,10秒后进行异步复制。

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

server1,插入数据等待时间为10s左右

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

 Rpl_semi_sync_master_no_tx 失败1次

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

当server2打开io线程,再次测试

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

Rpl_semi_sync_master_yes_tx   半同步成功的次数为1,半同步成功

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

四、基于组提交的并行复制

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

在server2slave端的配置文件中:

[[email protected] ~]# vim /etc/my.cnf   编辑配置文件
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=10  10个并行的线程
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
[[email protected] ~]# systemctl restart mysqld  重新启动数据库

最终结果:(10个线程在等待主线程的调用)

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

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

五、MYSQL数据库的组复制(全同步复制)

数据库组复制的原理:
组复制是一种可用于实现容错系统的技术。复制组是一个通过消息传递相互交互的服务器组。

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

1.需要三台虚拟机,在三个节点server1,2,3停掉之前的数据库服务,清空数据库数据目录(/var/lib/mysqld)中所有的缓存记录。

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

2.配置三个节点处的配置文件

[[email protected] mysql]# vim /etc/my.cnf  编辑配置文件
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="ad859e97-2cb5-475d-b030-59759513a263" 在server1编写配置文件时在server2输入该命令 uuidgen 查找uuid,三个节点uuid在配置文件里要写的一致
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="172.25.254.1:24901" # 自身的ip地址
loose-group_replication_group_seeds="172.25.254.1:24901,172.25.254.2:24901,172.25.254.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.254.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF

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

在server1中设定数据库的初始密码配置组复制:

开启数据库,过滤初始密码

[[email protected] mysql]# systemctl start mysqld
[[email protected] mysql]# cat /var/log/mysqld.log | grep password 
2019-02-25T03:07:19.854482Z 1 [Note] A temporary password is generated for [email protected]: KeXZvo9fwZ_S
[[email protected] mysql]# mysql -p   登录
mysql> ALTER USER [email protected] identified by '[email protected]';#修改新密码
Query OK, 0 rows affected (0.40 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> SET SQL_LOG_BIN=0;  #不开启日志同步 
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER [email protected]'%' IDENTIFIED BY '[email protected]';向rpl_user用户授予所有权限,所有用户均可利用rpl_user用户同步
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES; 刷新授权表 
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=1;  开启日志记录 
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='[email protected]' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.83 sec)

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.29 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.82 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 76a70144-38aa-11e9-8006-525400ace826 | server1     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)

server1配置完成后处于ONLINE状态

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

在server1上创建库和表并查看

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

配置server2

停掉之前的数据库服务,清空数据库数据目录(/var/lib/mysqld)中所有的缓存记录

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

编辑配置文件

[[email protected] mysql]# vim /etc/my.cnf

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

重新启动服务,过滤初始密码

[[email protected] mysql]# systemctl start mysqld
[[email protected] mysql]# cat /var/log/mysqld.log |grep password
2019-02-25T03:14:38.459490Z 1 [Note] A temporary password is generated for [email protected]: H6<oO>Y2pXMa

登录数据库设定数据库的初始密码配置组复制。

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

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

进入到test;查看

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

配置完成后,server2的状态处于ONLINE,在server1上查看到的

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

配置server3

首先安装

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

编辑配置文件

[[email protected] ~]# vim /etc/my.cnf

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

重新启动服务,过滤初始密码

[[email protected] ~]# systemctl start mysqld
[[email protected] ~]# grep password /var/log/mysqld.log
2019-02-25T03:21:02.901365Z 1 [Note] A temporary password is generated for [email protected]: pvus<:,Z:9yl

登录数据库设定数据库的初始密码配置组复制。

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

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

进入到test;查看

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

配置完成后,server3的状态处于ONLINE,在server1上查看到的

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

5.测试:

在server3上插入数据,在server1和server2查看

server3

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

server1查看

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

server2查看

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

在server2上插入数据,在server1和server3查看

server2

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

server1

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

server3

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

相关文章:

  • 2021-10-01
  • 2021-10-01
  • 2021-10-25
  • 2021-04-13
  • 2018-03-29
  • 2021-10-16
  • 2021-07-06
  • 2021-08-27
猜你喜欢
  • 2021-10-01
  • 2021-11-21
  • 2021-09-26
  • 2021-10-01
  • 2021-09-23
  • 2021-10-01
  • 2021-10-01
相关资源
相似解决方案