MySQL 5.7 基于GTID主从复制+并行复制+半同步复制_chen2ha的博客-程序员秘密

技术标签: MySQL  mysql  数据库  

环境准备

IP HOSTNAME SERVICE SYSTEM
192.168.131.129 mysql-master1 mysql CentOS7.6
192.168.131.130 mysql-slave1 mysql CentOS7.6
192.168.131.131 mysql-slave2 mysql CentOS7.6
[[email protected] ~]# sestatus
SELinux status:                 disabled
[[email protected] ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[[email protected] ~]# hostnamectl --static set-hostname mysql-master1
[[email protected] ~]# hostnamectl --static set-hostname mysql-slave1
[[email protected] ~]# hostnamectl --static set-hostname mysql-master2
[[email protected] ~]# hostnamectl --static set-hostname mysql-slave2

部署mysql

# mysql-master和mysql-slave都需要部署
[[email protected] ~]# wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
[[email protected] ~]# yum -y install mysql57-community-release-el7-11.noarch.rpm
[[email protected] ~]# yum -y install yum-utils   # 安装yum管理工具
[[email protected] ~]# yum-config-manager --disable mysql80-community   # 禁用8.0版本
[[email protected] ~]# yum-config-manager --enable mysql57-community    # 启用5.7版本
[[email protected] ~]# yum repolist enabled | grep mysql    # 检查一下,确保只有一个版本
mysql-connectors-community/x86_64       MySQL Connectors Community           165
mysql-tools-community/x86_64            MySQL Tools Community                115
mysql57-community/x86_64                MySQL 5.7 Community Server           444
[[email protected] ~]# yum -y install mysql-community-server
[[email protected] ~]# systemctl enable mysqld --now   # 设为开机自启,并立即启动
# 修改默认密码(MySQL从5.7开始不允许首次安装后使用空密码进行登录!为了加强安全性,系统会随机生成一个密码以供管理员首次登录使用,这个密码记录在/var/log/mysqld.log文件中)
[[email protected] ~]# grep "temporary password" /var/log/mysqld.log
2020-08-11T01:38:32.872421Z 1 [Note] A temporary password is generated for [email protected]: pHj_Agoyi3of
[[email protected] ~]# mysql -uroot -p'pHj_Agoyi3of'
mysql> alter user 'root'@'localhost' identified by 'Test123.com';

主从复制

配置master1

[[email protected] ~]# cp /etc/my.cnf{,.bak}
[[email protected] ~]# > /etc/my.cnf
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
  
symbolic-links = 0
  
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
  
#GTID:
server_id = 1
gtid_mode = on
enforce_gtid_consistency = on
    
#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1
   
#relay log
skip_slave_start = 1
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p
Enter password:
mysql> show master status;   # 查看master状态, 发现多了一项"Executed_Gtid_Set "
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> show global variables like '%uuid%';  
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 5d02c99a-db73-11ea-a39a-000c294ec5c2 |
+---------------+--------------------------------------+
1 row in set (0.00 sec)

mysql> show global variables like '%gtid%';    # 查看确认gtid功能打开
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| binlog_gtid_simple_recovery      | ON    |
| enforce_gtid_consistency         | ON    |
| gtid_executed                    |       |
| gtid_executed_compression_period | 1000  |
| gtid_mode                        | ON    |
| gtid_owned                       |       |
| gtid_purged                      |       |
| session_track_gtids              | OFF   |
+----------------------------------+-------+
8 rows in set (0.00 sec)

mysql> show variables like 'log_bin';    # 查看确认binlog日志功能打开
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> grant replication slave,replication client on *.* to [email protected]'192.168.%' identified by "[email protected]";
Query OK, 0 rows affected, 1 warning (0.04 sec)

mysql> show grants for [email protected]'192.168.%';
+---------------------------------------------------------------------------+
| Grants for [email protected]%                                                |
+---------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.%' |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show master status;   # 查看master状态
+------------------+----------+--------------+------------------+----------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000001 |      466 |              |                  | 5d02c99a-db73-11ea-a39a-000c294ec5c2:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)

配置slave1

[[email protected] ~]# cp /etc/my.cnf{,.bak}
[[email protected] ~]# > /etc/my.cnf
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

symbolic-links = 0

log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid

#GTID:
server_id = 2
gtid_mode = on
enforce_gtid_consistency = on

#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1

#relay log
skip_slave_start = 1
[[email protected] ~]# mysql -uroot -p
Enter password:
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='192.168.131.129',master_user='slave',master_password='[email protected]',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.131.129
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 466
               Relay_Log_File: mysql-slave1-relay-bin.000002
                Relay_Log_Pos: 679
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
.........
.........
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)
# mysql-slave1节点已经和mysql-master1节点配置完成主从同步关系

并行复制

一般Mysql主从复制有三个线程参与,都是单线程:Binlog Dump() -> IO Thread () -> SQL Thread()。复制出现延迟一般出在两个地方:
-  SQL线程忙不过来 (可能需要应用数据量较大,可能和从库本身的一些操作有锁和资源的冲突;主库可以并发写,SQL线程不可以;主要原因)
-  网络抖动导致IO线程复制延迟(次要原因)。

MySQL主从复制延迟的解决办法:MySQL从5.6开始有了SQL Thread多个的概念,可以并发还原数据,即并行复制技术。并行复制的机制,是MySQL的一个非常重要的特性,可以很好的解决MySQL主从延迟问题!
MySQL 5.6版本支持所谓的并行复制,但是其并行只是基于schema的,也就是基于库的。
如果用户的MySQL数据库实例中存在多个schema,对于从机复制的速度的确可以有比较大的帮助。
但是基于schema的并行复制存在两个问题:
	1) crash safe功能不好做,因为可能之后执行的事务由于并行复制的关系先完成执行,那么当发生crash的时候,这部分的处理逻辑是比较复杂的。
	2) 最为关键的问题是这样设计的并行复制效果并不高,如果用户实例仅有一个库,那么就无法实现并行回放,甚至性能会比原来的单线程更差。而 单库多表是比多库多表更为常见的一种情形 。

注意:mysql 5.6 的MTS是基于库级别的并行,当有多个数据库时,可以将slave_parallel_workers设置为数据库的数量,为了避免新建库后来回修改,也可以将该参数设置的大一些。设置为库级别的事务时,不允许这样做,会报错。
	在MySQL 5.7 中,引入了基于组提交的并行复制(官方称为Enhanced Multi-threaded Slaves,即MTS),设置参数 slave_parallel_workers>0 并且 global.slave_parallel_type='LOGICAL_CLOCK',即可支持一个 schema 下, slave_parallel_workers 个的 worker 线程并发执行 relay log 中主库提交的事务。
	其核心思想:一个组提交的事务都是可以并行回放(配合 binary log group commit );slave 机器的relay log 中 last_committed 相同的事务( sequence_num 不同)可以并发执行。其中,变量 slave-parallel-type 可以有两个值:
	1 )DATABASE 默认值,基于库的并行复制方式;
	2 )LOGICAL_CLOCK,基于组提交的并行复制方式;
	
	MySQL 5.7是基于组提交的并行复制,并且是支持"真正"的并行复制功能,这其中最为主要的原因:就是slave服务器的回放与主机是一致的, 即master服务器上是怎么并行执行的slave上就怎样进行并行回放。不再有库的并行复制限制,对于二进制日志格式也无特殊的要求(基于库的并行复制也没有要求)。

	MySQL5.7的并行复制,期望最大化还原主库的并行度,实现方式是在binlog event中增加必要的信息,以便slave节点根据这些信息实现并行复制。MySQL5.7的并行复制建立在group commit的基础上,所有在主库上能够完成prepared的语句表示没有数据冲突,就可以在slave节点并行复制。

配置master1

[[email protected] ~]# cp /etc/my.cnf{,.bak}
[[email protected] ~]# vim /etc/my.cnf    # 基于GTID主从复制结构,加入并行复制的配置
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

symbolic-links = 0

log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid

#GTID:
server_id = 1
gtid_mode = on
enforce_gtid_consistency = on

#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1

#relay log
skip_slave_start = 1

#不配置binlog_group_commit从库无法做到基于事物的并行复制
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10

#为了数据安全再配置
sync_binlog=1
innodb_flush_log_at_trx_commit =1
#这个参数控制binlog写入 磁盘的方式。设置为1时,表示每次commit;都写入磁盘。这个刷新的是redo log 即ib_logfile0,而不是binlog
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p
Enter password:
mysql> show variables like 'binlog_group_commit_%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| binlog_group_commit_sync_delay          | 100   |
| binlog_group_commit_sync_no_delay_count | 10    |
+-----------------------------------------+-------+
2 rows in set (0.01 sec)
# 设置binlog_group_commit的上面两个参数,否则从库无法做到基于事物的并行复制! 这两个参数共同决定了是否触发组提交操作!
# 第二个参数表示该事务组提交之前总共等待累积到多少个事务(如上要累计到10个事务);
# 第一个参数则表示该事务组总共等待多长时间后进行提交(如上要总共等待100毫秒的时间),任何一个条件满足则进行后续操作。
# 因为有这个等待,可以让更多事务的binlog通过一次写binlog文件磁盘来完成提交,从而获得更高的吞吐量。

配置slave1

'记住:只要主数据库的mysqld服务重启,那么从数据库上就要重启slave,以恢复主从同步状态!!!
[[email protected] ~]# cp /etc/my.cnf{,.bak}
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

symbolic-links = 0

log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid

#GTID:
server_id = 2
gtid_mode = on
enforce_gtid_consistency = on

#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1

#relay log
skip_slave_start = 1
read_only = on

#MTS
slave-parallel-type = LOGICAL_CLOCK          #开启逻辑时钟的复制
slave-parallel-workers = 4                   #这里设置线程数为4 (最大线程数不能超过16,即最大线程为16)
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = on
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p
Enter password:
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
    
mysql> start slave;
Query OK, 0 rows affected (0.10 sec)

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.131.129
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 466
               Relay_Log_File: mysql-slave1-relay-bin.000002
                Relay_Log_Pos: 679
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
.........
.........
           Retrieved_Gtid_Set: 5d02c99a-db73-11ea-a39a-000c294ec5c2:1
            Executed_Gtid_Set: 5d02c99a-db73-11ea-a39a-000c294ec5c2:1
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)
# mysql-slave1从数据库恢复了与mysql-master1主数据库的同步关系了
# 查看线程数,这个跟在my.cnf文件里配置的是一样的
mysql> show variables like '%slave_para%';
+------------------------+---------------+
| Variable_name          | Value         |
+------------------------+---------------+
| slave_parallel_type    | LOGICAL_CLOCK |
| slave_parallel_workers | 4             |
+------------------------+---------------+
2 rows in set (0.01 sec)

半同步复制

	默认情况下MySQL的复制是异步的,master将新生成的binlog发送给各slave后,无需等待slave的ack回复(slave将接收到的binlog写进relay log后才会回复ack),直接就认为这次DDL/DML成功了;
	半同步复制(semi-synchronous replication)是指master将新生成的binlog发送给各slave时, 只需等待一个(默认)slave返回的ack信息就返回成功。
	MySQL 5.7对半同步复制作了大改进,新增了一个master线程。
	在MySQL 5.7以前,master上的binlog dump线程负责两件事:dump日志给slave的io_thread;接收来自slave的ack消息。它们是串行方式工作的。
	在MySQL 5.7中,新增了一个专门负责接受ack消息的线程ack collector thread。这样master上有两个线程独立工作,可以同时发送binlog到slave和接收slave的ack。还新增了几个变量,其中最重要的是 rpl_semi_sync_master_wait_point ,它使得MySQL半同步复制有两种工作模型。
半同步复制的两种类型
	从MySQL 5.7.2开始,MySQL支持两种类型的半同步复制。这两种类型由变量 rpl_semi_sync_master_wait_point (MySQL 5.7.2之前没有该变量)控制,它有两种值:AFTER_SYNC和AFTER_COMMIT。在MySQL 5.7.2之后,默认值为AFTER_SYNC,在此版本之前,等价的类型为AFTER_COMMIT。这个变量控制的是master何时提交、何时接收ack以及何时回复成功信息给客户端的时间点。
- AFTER_SYNC模式:master将新事务写进binlog(buffer)后发送给slave,再sync到自己的binlog file(disk), 之后才允许接收slave的ack回复,接收到ack之后才会提交事务,并返回成功信息给客户端。
- AFTER_COMMIT模式:master将新事务写进binlog(buffer)后发送给slave,再sync到自己的binlog file(disk),然后直接提交事务。之后才允许接收slave的ack回复,然后再返回成功信息给客户端。
AFTER_SYNC和AFTER_COMMIT的优缺点
AFTER_SYNC
-  对于所有客户端来说,它们看到的数据是一样的,因为它们看到的数据都是在接收到slave的ack后提交后的数据。
-  这种模式下,如果master突然故障,不会丢失数据,因为所有成功的事务都已经写进slave的relay log中了,slave的数据是最新的。

AFTER_COMMIT
-  不同客户端看到的数据可能是不一样的。对于发起事务请求的那个客户端,它只有在master提交事务且收到slave的ack后才能看到提交的数据。但对于那些非本次事务的请求客户端,它们在master提交后就能看到提交后的数据,这时候master可能还没收到slave的ack。
-  如果master收到ack回复前,slave和master都故障了,那么将丢失这个事务中的数据。

	在MySQL 5.7.2之前,等价的模式是 AFTER_COMMIT ,在此版本之后,默认的模式为 AFTER_SYNC ,该模式能最大程度地保证数据安全性,且性能上并不比 AFTER_COMMIT 差。

配置master1

[[email protected] ~]# cp /etc/my.cnf{,.bak}
[[email protected] ~]# vim /etc/my.cnf    # 基于GTID主从复制和并行复制,加入半同步复制
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

symbolic-links = 0

log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid

#GTID:
server_id = 1
gtid_mode = on
enforce_gtid_consistency = on

#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1

#relay log
skip_slave_start = 1

#不配置binlog_group_commit从库无法做到基于事物的并行复制
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10

#开启半同步复制 (超时时间为1s)
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p
Enter password:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
ERROR 1125 (HY000): Function 'rpl_semi_sync_master' already exists
# 在mysql-master主数据库上加载 (前提是/usr/lib64/mysql/plugin/semisync_master.so 文件存在。 一般mysql安装后就默认产生),我的已经默认带有这个function
mysql> select plugin_name, 
    -> plugin_status from information_schema.plugins
    -> where plugin_name like '%semi%';   # 查看插件是否加载成功
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
1 row in set (0.01 sec)

mysql> show status like 'Rpl_semi_sync_master_status';    # 查看半同步是否在运行
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+
1 row in set (0.00 sec)

配置slave1

[[email protected] ~]# cp /etc/my.cnf{,.bak}
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
     
symbolic-links = 0
     
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
     
#GTID:
server_id = 1
gtid_mode = on
enforce_gtid_consistency = on
       
#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1
      
#relay log
skip_slave_start = 1
     
#不配置binlog_group_commit从库无法做到基于事物的并行复制
binlog_group_commit_sync_delay = 100             
binlog_group_commit_sync_no_delay_count = 10
     
#为了数据安全再配置
sync_binlog=1
innodb_flush_log_at_trx_commit =1
#这个参数控制binlog写入 磁盘的方式。设置为1时,表示每次commit;都写入磁盘。这个刷新的是redo log 即ib_logfile0,而不是binlog
 
# 开启半同步复制
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p
Enter password:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.00 sec)
# 在mysql-slave1从数据库上加载 (前提是/usr/lib64/mysql/plugin/semisync_slave.so 文件存在。 一般mysql安装后就默认产生)
mysql> select plugin_name,
    -> plugin_status from information_schema.plugins
    -> where plugin_name like '%semi%';    # 查看插件是否加载成功
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_slave  | ACTIVE        |
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
2 rows in set (0.00 sec)

mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF   |
+----------------------------+-------+
1 row in set (0.00 sec)
# 发现是OFF,这是因为此时还没有生效,必须从数据库上的IO线程才能生产!!

mysql> stop slave IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> show status like 'Rpl_semi_sync_slave_status';   # 然后再查看mysql-slave1的半同步状态,发现就已经开启了!
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)

mysql> show slave status \G   # 再次查看主从同步状态,发现主从同步出现异常,这个时候再重启下slave即可!
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.131.129
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-slave1-relay-bin.000005
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: No

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.131.129
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-slave1-relay-bin.000007
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

master1查看Rpl_semi

mysql> show status like '%Rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| 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     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

# 从上面信息,发现Rpl_semi_sync_master_clients的数值为1,说明此时mysql-master主数据库已经有一个半同步复制的从机,即mysql-slave1节点。
# Rpl_semi_sync_master_yes_tx的数值为0, 说明此时还没有半同步复制的sql语句被执行。主库写入数据后,Rpl_semi_sync_master_yes_tx的数值为sql语句的数量

slave2加入主从复制&并行复制&半同步复制

[[email protected] ~]# cp /etc/my.cnf{,.bak}
[[email protected] ~]# > /etc/my.cnf
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
    
symbolic-links = 0
    
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
    
#GTID:
server_id = 3
gtid_mode = on
enforce_gtid_consistency = on
      
#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1
     
#relay log
skip_slave_start = 1
read_only = on
    
#MTS
slave-parallel-type = LOGICAL_CLOCK          #开启逻辑时钟的复制
slave-parallel-workers = 4                               #最大线程16
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = on
  
# 开启半同步复制
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p
Enter password:
mysql> show global variables like 'gtid_%';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| gtid_executed                    |       |
| gtid_executed_compression_period | 1000  |
| gtid_mode                        | ON    |
| gtid_owned                       |       |
| gtid_purged                      |       |
+----------------------------------+-------+
5 rows in set (0.01 sec)

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='192.168.131.129',master_user='slave',master_password='[email protected]',master_auto_position=1;    # 开启主从复制
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.131.129
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-slave2-relay-bin.000003
                Relay_Log_Pos: 407
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            
mysql> show variables like '%slave_para%';   # 查看并行复制
+------------------------+---------------+
| Variable_name          | Value         |
+------------------------+---------------+
| slave_parallel_type    | LOGICAL_CLOCK |
| slave_parallel_workers | 4             |
+------------------------+---------------+
2 rows in set (0.00 sec)

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';  # 开启半同步复制
Query OK, 0 rows affected (0.04 sec)

mysql> select plugin_name,
    -> plugin_status from information_schema.plugins
    -> where plugin_name like '%semi%';
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_slave  | ACTIVE        |
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
2 rows in set (0.00 sec)

mysql> stop slave IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)
# 回到mysql-master1主数据库查看
mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|         3 |      | 3306 |         1 | 5d138126-db73-11ea-988b-000c29bef1e6 |
|         2 |      | 3306 |         1 | 5d0fecd7-db73-11ea-b20e-000c2986ee9d |
+-----------+------+------+-----------+--------------------------------------+
2 rows in set (0.00 sec)
# mysql-master1主数据库现在有两个从数据库,分别为mysql-slave1 和 mysql-slave2

mysql> show status like '%Rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| 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     |
+--------------------------------------------+-------+
14 rows in set (0.01 sec)
# mysql-master1主数据库现在有两个半同步复制的从库,即mysql-slave1 和mysql-slave2
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010383467/article/details/107931580

智能推荐

远程桌面连接的问题_baining97的博客-程序员秘密

远程桌面连接出现的提示如下: 中断远程桌面连接,客户端无法建立跟远程计算机的连接。 导致这个错误的可能的原因是: 1) 远程计算机上的远程连接可能没有启用。 2) 已超出远程计算机上的连接最大数。 3) 建立连接时出现了一个网络错误。  具体的解决办法: 有时候是这个错误提示:由于网络错误,连接被中断,请重新连接到远程计算机 远程连接我肯定是开启了的,防火墙里面3389端口也是打开的,并且...

IDEA插件系列(103):Native Terminal插件——本地终端_idea terminal插件_二木成林的博客-程序员秘密

1.插件介绍Native Terminal插件。IDE 工具栏和上下文菜单中添加一个终端图标,可在您喜欢的终端中打开项目目录。默认情况下,它使用操作系统本机终端:Windows - 命令提示符 (cmd) Linux - gnome-terminal / konsole macOS - Terminal.app如果你想使用另一个终端,只需在IDE Settings/Preferences 中指定您最喜欢的一个。PowerShell、ConEmu、Cmder、WSL、GitBash、RX

服务器之间挂载及挂载失败解决方法_挂载不上_Xiamumu~的博客-程序员秘密

服务器之间如何挂载记录下两台linux服务器之间磁盘挂载。服务端:A服务器(192.168.1.2),客户端:B服务器(192.168.1.3)。1、修改服务端文件:vi /etc/exports2、添加需要服务端的文件绝对路径,注意在ip后面直接跟里面的配置,不要有空格,我遇到多了空格导致重启报错,例如:/home/testfile 192.168.1.3(insecure,rw,sync,no_root_squash)3、重启nfs服务service nfs resatrt4、查看nfs

电磁场与电磁波:读书笔记:静电场边界条件_weixin_33739646的博客-程序员秘密

1. D的法向分量根据高斯定理,分界面上自由电荷密度(!是自由电荷!不要考虑面束缚电荷)等于穿越该分界面的电通密度的法向分量。如果分界面两侧都是介质,一般来说分界面上没有自由电荷(因为是介质啊,除非人为放置,自身是没有能力产生自由电荷的),于是界面两侧电通密度法向分量相等。这个其实很好理解,分界面上没有自由电荷,那么分界面两侧的电力线法向分量必然相等,于是D必相等。<< 如...

手把手教你用Python分析微信聊天内容_python 解析微信文章内容_小碎银的博客-程序员秘密

在开始之前, 先简单说下我为何会写这篇文章?为了开发新客户, 领导安排公司的客服们加入了很多的微信群, 在群内收集目标客户的联系方式.然而她们收集客户信息的方式非常的原始: 在微信群内翻看群聊记录 -> 寻找客户发出的电话号码 -> 复制 -> 打开公司内部APP -> 填写表单 -> 粘贴客户电话号码 -> 提交 -> 继续翻看群聊记录.如此这...

python 爬虫例子及总结(详细理解注释)_python爬虫项目总结_不想想了的博客-程序员秘密

文章目录备注详细注释代码无解析代码以年份-评论人数作为图片命名备注集成环境:anaconda(Spyder)anaconda(Spyder)下载后还需要pycharm吗?(python集成环境选择)详细注释代码# -*- coding: utf-8 -*-"""Created on Wed Nov 17 10:31:22 [email protected]: 瑛"""# 使用import导入requests模块,在爬取新的网页内容前,我们需要导入requests模块,请求并查看状态码。impor

随便推点

Android安卓开发集成微信第三方扫描二维码登录-超级无敌具详细_android 集成维修扫码登录_冰镇柠檬啊的博客-程序员秘密

Android安卓开发中集成微信二维码登录的步骤:写在前面的:该教程使用AS作为演示,使用ecplise请参照微信官方文档下载相应jar等所需参考文档和资源。在最后,我会附上这个Activity的java文件、封装的加密文件SHA、我自己的MyApiUtil、和我自己用来映射返回数据的bean类,希望对你有所帮助,相信阅读之后的你一定能快速集成完毕。1、依赖:implementation ...

1198 找出所有行中最小公共元素_王培琳的博客-程序员秘密

题目描述:给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了。请你帮忙找出在所有这些行中 最小的公共元素。如果矩阵中没有这样的公共元素,就请返回 -1。示例:输入:mat = [[1,2,3,4,5],[2,4,5,8,10],[3,5,7,9,11],[1,3,5,7,9]]输出:5提示:1 <= mat.length, mat[i].length <= 5001 <= mat[i][j] <= 10^4mat[i] 已按递增顺序排列。方法1:主

Qt学习之路_6(Qt局域网聊天软件)_利用qt实现局域网 聊天程序_阿木大叔mu的博客-程序员秘密

在上2次文章Qt学习之路_5(Qt TCP的初步使用)   Qt学习之路_4(Qt UDP的初步使用) 中已经初步介绍了群聊功能和文件传输功能,这一节中主要在这个基础上加入一个私聊功能。  参考文献依旧是:《Qt及Qt Quick开发实战精解》一书中的第5个例子以及http://www.yafeilinux.com/ 网站上的源码。另外这次的私聊功能也是参考网友http://www.q

android 格子控件,Android UI控件详解-GridView(网格视图)_weixin_39615419的博客-程序员秘密

xml布局源代码package com.example.gridview;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.Ad...

程序员面试一百题-06-判断整数序列是不是二元查找树的后序遍历结果_252619的博客-程序员秘密

程序员面试一百题-06-判断整数序列是不是二元查找树的后序遍历结果

linux安装不同版本的tensorflow_lxlong89940101的博客-程序员秘密

不同的python版本,安装不同的tensorflow版本Python3.5.#pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.4.0-cp35-cp35m-linux_x86_64.whl(CPU)pip install https://storage.googleapis.co...

推荐文章

热门文章

相关标签