MySQL-主从复制+半同步复制

MySQL

MySQL主从复制

高可用集群

  • High Available Cluster,HA Cluster
  • 高可用集群是指通过特殊的软件把独立的服务器连接起来,组成一个能够提供故障切换(Fail Over)功能的集群
  • 高可用的衡量标准
可用性级别(指标)年度宕机时间描述叫法
99%3.65天/年基本可用系统2个9
99.9%8.76小时/年可用系统3个9
99.99%52.6分钟/年高可用系统4个9
99.999%5.3分钟/年抗故障系统5个9
99.9999%32秒/年容错系统6个9

计算方法:

1年 = 365天 = 8760小时
99		8760 * 1% = 8760 * 0.01 = 87.6小时=3.65天
99.9	8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99	8760 * 0.01% = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999	8760 * 0.001% = 0.0876小时 = 0.0876 * 60 = 5.26分钟
  • MySQL常用集群
    • MySQL Replication主从架构
    • MySQL Cluster 集群架构
    • MySQL Group Replication (MGR) 主复制,多主一从
    • MariaDB Galera Cluster
    • MHA|Keepalived|HeartBeat|Lvs,Haproxy等技术构建高可用集群

MySQL主从复制原理

  • Replication可以实现将数据从一台数据库服务器(master)复制到一台到多台数据库服务器(slave)。默认情况下,属于异步复制,所以无需维持长连接

  • master(主服务器)将数据库的改变写入二进制日志,slave(从服务器)同步这些二进制日志,并根据这些二进制日志进行数据重演操作,实现数据异步同步

  • 具体过程

    • slave端的IO线程发送请求给master端的binlog dump线程
    • master端binlog dump线程将获取的二进制日志信息(文件名和位置信息)发送给slave端的IO线程
    • salve端IO线程获取到的内容依次写到slave端**relay log(中继日志)**里,并把master端的bin-log文件名和位置记录到master.info里
    • salve端的SQL线程,检测到relay log中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和master在这里插入图片描述
      数据一致

中继日志的开启:

在mysql的配置文件中添加relay-log字段,并指定路径和文件名,如:

relay-log=/mysql_3306/data/relaylog

MySQL复制架构

双机热备(AB复制)
  • 传统的复制架构,也被称为M-S
  • 默认情况下,master接受读写请求,slave只接受读请求以减轻master的压力

在这里插入图片描述

级联复制
  • 可以进一步分担读压力,但slave1 出现故障,后面的所有级联slave服务器都会同步失败

在这里插入图片描述

并联复制(一主多从)
  • 解决级联复制的单点故障,同时也分担读压力,但会间接增加master传输二进制日志的压力
    在这里插入图片描述
双主复制

理论上,两台master好像都能接受读、写请求,但实际上,往往运作的过程中,同一时刻只有其中一台master会接受写请求,另外一台接受读请求

在这里插入图片描述

MySQL主从复制搭建(AB复制)

要求
  • master和slave必须安装相同版本的mysql数据库软件
  • master端必须开启二进制日志;slave端必须开启relay log日志
  • master端和slave端的server-id号不能一致
  • slave端配置主从复制,向master来同步数据
  • master端必须创建一个用来主从复制的用户
  • 保证master和slave端初始数据一致
IP地址主机名
192.168.226.20master
192,168.226.30Slave
环境准备
[root@server2 ~]# hostnamectl set-hostname master
[root@server2 ~]# su
[root@server3 ~]# hostnamectl set-hostname slave
[root@server3 ~]# su

#防止NetworkManager对静态ip及高可用软件产生影响
systemctl stop NetworkManager
systemctl disable NetworkManager

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

cat >> /etc/hosts <<EOF
	192.168.226.20 master
	192.168.226.30 slave
	EOF

ntpdate cn.ntp.org.cn

#向xshell中传入mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz软件包
yum install -y lrzsz
rz

ls
tar -xzf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz 
MySQL安装要求
选项采用默认形式
安装路径/usr/local/mysql
数据路径/usr/local/mysql/data
端口号3306
master上安装mysql
安装
[root@master ~]# vim mysql.sh

#!/bin/bash

#Desc='此脚本用于安装MySQL软件'
#Usage=source mysql.sh

yum install -y libaio
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

[root@master ~]# source mysql.sh 
#脚本中含有source命令,调用脚本时也需要使用source 调用

查看随机密码
[root@master ~]# cat /root/password.txt |grep password
2021-09-28T06:41:36.468051Z 1 [Note] A temporary password is generated for root@localhost: 3KkY)iSsSJo7

安全配置
[root@master ~]# mysql_secure_installation
#顺便更改密码
	Enter password for user root: #产生的随机密码

	The existing password for the user account root has expired. Please 	set a new password.

	New password: #新密码123

	Re-enter new password: #123

配置my.cnf文件
[root@master ~]# cd /usr/local/mysql/
[root@master mysql]# vim my.cnf

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/mysql.err
log-bin=/usr/local/mysql/data/binlog		
server-id=20
character_set_server=utf8mb4

[root@master mysql]# service mysqld restart
slave上安装mysql

相对于主服务器MySQL的安装与配置,从服务器端不需要进行初始化操作,因为其数据将来都来自于主服务器

安装
[root@slave ~]# vim mysql.sh

#!/bin/bash

#Desc='此脚本用于slave上安装MySQL软件'
#Usage=source mysql.sh

yum install -y libaio
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
#bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
#bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
#service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

[root@slave ~]# source mysql.sh 

配置my.cnf文件
[root@slave mysql]# cd /usr/local/mysql/
[root@slave mysql]# vim my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/mysql.err
#log-bin=/usr/local/mysql/data/binlog		
relay-log=/usr/local/mysql/data/relaylog
server-id=30
character_set_server=utf8mb4

把master主服务器的数据目录同步到slave从服务器
#停止master的mysql
[root@master ~]# service mysqld stop

#删除master的/usr/local/mysql/data下的auto.cnf文件,该文件随安装mysql产生,记录了一个具有唯一性编号
[root@master ~]# rm -rf /usr/local/mysql/data/auto.cnf 

#拷贝数据目录
yum install -y rsync.x86_64
[root@master ~]# rsync -av /usr/local/mysql/data root@192.168.226.30:/usr/local/mysql/

启动mysql
service mysqld start
[root@slave mysql]# mysql -uroot -p123
主从复制的配置
在master上创建专门用于主从复制的账号
[root@master ~]# mysql -uroot -p123
mysql> create user 'slave'@'192.168.226.%' identified by '123';
mysql> grant replication slave on *.* to 'slave'@'192.168.226.%';
mysql> flush privileges;

在master上锁表
mysql> flush tables with read lock;

在master中查看二进制文件的名称及位置
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |      773 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
mysql> show master status\G
*************************** 1. row ***************************
             File: binlog.000002
         Position: 773
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 

在slave从服务器中,使用change master to指定主服务器,实现数据同步
[root@slave mysql]# mysql -uroot -p123
mysql> change master to
	master_host='192.168.226.20',
	master_user='slave',
	master_password='123',
	master_port=3306,
	master_log_file='binlog.000002',
	master_log_pos=773;

启动slave数据同步
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.226.20
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 773
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: binlog.000002
             Slave_IO_Running: Yes #为Yes
            Slave_SQL_Running: Yes #为Yes,两者均为Yes说明启动成功

给master解锁
mysql> unlock tables;

change master to语句写错,解决方法:

mysql> stop slave;
mysql> reset slave;
mysql> change master to
	master_host='192.168.226.20',
	master_user='slave',
	master_password='123',
	master_port=3306,
	master_log_file='binlog.000002',
	master_log_pos=773;
mysql> start slave;
主从复制测试
在master端准备数据
mysql> create database db1;
mysql> use db1;
mysql> create table department( 
    id int, 
    name varchar(20) 
);
mysql> insert into department values 
	(200,'技术'), 
	(201,'人力资源'), 
	(202,'销售'), 
	(203,'运营');
mysql> select * from department;
+------+--------------+
| id   | name         |
+------+--------------+
|  200 | 技术         |
|  201 | 人力资源     |
|  202 | 销售         |
|  203 | 运营         |
+------+--------------+

在slave端查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
mysql> select * from db1.department;
+------+--------------+
| id   | name         |
+------+--------------+
|  200 | 技术         |
|  201 | 人力资源     |
|  202 | 销售         |
|  203 | 运营         |
+------+--------------+
slave从服务器写入数据解决方案
mysql> show slave status\G

在这里插入图片描述

可以通过变量sql_slave_skip_counter临时跳过N条事务进行处理

mysql> SET GLOBAL sql_slave_skip_counter=1;
mysql> stop slave;
mysql> start slave;
mysql重启后,需要手动开启主从复制
[root@master ~]# service mysqld restart

#slave端
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.226.20
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000005
          Read_Master_Log_Pos: 1218
               Relay_Log_File: relaylog.000004
                Relay_Log_Pos: 573
        Relay_Master_Log_File: binlog.000005
             Slave_IO_Running: No
            Slave_SQL_Running: No
开启slave
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.226.20
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000006
          Read_Master_Log_Pos: 234
               Relay_Log_File: relaylog.000008
                Relay_Log_Pos: 401
        Relay_Master_Log_File: binlog.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

基于GTIDs的AB复制架构

概述
  • GTIDs(Global transaction identifiers)全局事务标识符

  • 基于mysql 5.6及以上版本

  • 当使用GTIDs时,每一个事务(增删改)都可以通过被给定唯一的编号被识别并跟踪

  • 添加新的slave或者当发生故障需要将master身份或者角色迁移到slave上时,都无需考虑是哪一个二进制日志以及哪个position值,极大简化了相关操作

  • GTIDs基于事务,不支持MYISAM存储引擎

  • GTID由source_idtransaction_id组成:

    • source_id来自于server_uuid,可以在auto.cnf中看到

    • transation_id是一个序列数字,自动生成

使用GTIDs的限制条件
  • 不支持非事务引擎(MyISAM),因为可能会导致多个gtid分配给同一个事务
  • 必须使用enforce-gtid-consistency参数
  • 不支持传统的跳过错误方式sql-slave-skip-counter
  • create table … select 不支持该语句
  • create/drop temporary table 不支持临时表
  • GTID复制环境中必须要求统一开启和GTID或者关闭GTID
  • 在mysql 5.6.7版本前,使用mysql_upgrade命令会出现问题
基于GTIDs的主从复制搭建
修改master和slave的配置文件,让其支持GTIDs
[root@master ~]# cd /usr/local/mysql/
[root@master mysql]# cat >> my.cnf <<EOF
	gtid-mode=on
	log-slave-updates=1
	enforce-gtid-consistency
	EOF

[root@slave mysql]# rm -rf data/binlog.*
[root@slave mysql]# cat >> my.cnf <<EOF
	gtid-mode=on
	log-slave-updates=1
	enforce-gtid-consistency
	skip-slave-start
	log-bin=/usr/local/mysql/data/binlog
	EOF
#skip-slave-start:当master主服务器GTIDs没有启动时,跳过slave服务器的启动
#log-bin:基于GTIDs复制从服务器必须开启二进制日志

重启mysqld服务
service mysqld restart

主从配置只读模式
mysql -uroot -p123
mysql> set @@global.read_only=ON;

在slave重新配置change master to
mysql> stop slave;
mysql> reset slave;
mysql> change master to 
	master_host='192.168.226.20',
	master_user='slave',
	master_password='123',
	master_port=3306,
	master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.226.20
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 361
        Relay_Master_Log_File: binlog.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

在master和slave上关闭主从配置只读模式
mysql>  @@global.read_only=OFF;

测试验证
#准备数据
mysql> create table tb1(
    create table tb1(
	id int not null auto_increment,
	name varchar(20),
	primary key(id)
	);
mysql> insert into db1.tb1 values(null,'aaa');
mysql> insert into db1.tb1 values(null,'bbb');
mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
+----+------+

从服务器端验证
mysql> select * from db1.tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
+----+------+
slave从服务器写入数据解决方案-重新同步
模拟slave从服务写入数据
mysql> insert into db1.tb1 values(null,'ccc');
mysql> select * from db1.tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
#在master端再次插入该数据
mysql> insert into db1.tb1 values(null,'ccc');
mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
#slave端查看
mysql> select * from db1.tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
#再向master插入数据
mysql> insert into db1.tb1 values(null,'ddd');
mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
|  4 | ddd  |
+----+------+
#slave端查看
mysql> select * from db1.tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
#数据没有同步
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.226.20
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000003
          Read_Master_Log_Pos: 1689
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 1378
        Relay_Master_Log_File: binlog.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: No #已经变成了No

在slave端:停止mysql并删除mysql数据目录data
[root@slave data]# service mysqld stop
[root@slave data]# cd ../
[root@slave mysql]# rm -rf data/*

在master端:停止mysql并删除文件data/auto.cnf
[root@master mysql]# service mysqld stop
[root@master mysql]# rm -rf data/auto.cnf 

重新同步
[root@master mysql]# rsync -av /usr/local/mysql/data root@192.168.226.30:/usr/local/mysql/

开启mysql
service mysqld start

验证
[root@slave mysql]# mysql -uroot -p123
mysql> select * from db1.tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
|  4 | ddd  |
+----+------+
  • 方法2(可能会不成功)
查询需要跳过的事务(向从服务器添加内容)的GTIDs编号
[root@slave1 data]# mysqlbinlog relaylog.000002|less
#选择编号最大的relaylog
# at 756
#181015 12:04:45 server id 10  end_log_pos 817 CRC32 0x5374f49e         GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '044e6392-cf9b-11e8-a748-000c294ca304:3'/*!*/;

解决步骤
mysql> stop slave;
mysql> SET @@SESSION.GTID_NEXT= '13e36f00-eb70-11ea-91a8-000c29d1f40a:1'/*!*/;
mysql> BEGIN;
mysql> commit;
#使用下一个自动生成的全局事务ID
mysql> SET @@SESSION.GTID_NEXT= 'AUTOMATIC';	
mysql> start slave;
mysql> show slave status\G

MySQL半同步复制

介绍

在这里插入图片描述

所谓的半同步复制就是master每commit一个事务(一个改变数据的操作),要确保slave接受完主服务器发送的binlog日志文件并写入到自己的中继日志relay log里,然后会给master信号,告诉对方已经接收完毕,这样master才能把事物成功commit。这样就保证了master-slave的数据绝对的一致,但是会牺牲master的性能,因为需要一定的等待时间。

搭建半同步复制

基于M-S架构
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.226.20
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000005
          Read_Master_Log_Pos: 194
               Relay_Log_File: relaylog.000003
                Relay_Log_Pos: 317
        Relay_Master_Log_File: binlog.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

给master安装plugin插件
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> show global variables like 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| 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 |
+-------------------------------------------+------------+

给slave安装plugin插件
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> show global variables like 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+

给master的plugin插件激活
mysql> set global rpl_semi_sync_master_enabled=on;
mysql> show global 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 |
+-------------------------------------------+------------+

给slave的plugin插件激活
mysql> set global rpl_semi_sync_slave_enabled=on;
mysql> show global variables like 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+

在SLAVE服务器中重启IO线程
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;

测试验证
#master端插入数据
mysql> insert into db1.tb1 values (null,'eee');
mysql> select * from db1.tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
|  4 | ddd  |
|  5 | eee  |
+----+------+
mysql> show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 1     |  
+-----------------------------+-------+
####表示这次事务成功从slave返回一次确认信号

#slave查看
mysql> select * from db1.tb1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
|  4 | ddd  |
|  5 | eee  |
+----+------+

模拟slave服务器故障,再次测试
#slave停用mysql
[root@slave mysql]# service mysqld stop

#master端再次插入数据
mysql> insert into db1.tb1 values (null,'fff');
####这次插入无响应,默认需要等待10秒
mysql> show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 1     |
+-----------------------------+-------+
####表示这次事务没有从slave端获返回确认信号(在原来的基础上加一才表明有返回)
mysql> insert into db1.tb1 values (null,'ggg');
####这次插入无响应,但不需要等待,因为变成了异步复制
mysql> show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 1     |
+-----------------------------+-------+

重新启动mysql的半同步复制
[root@slave mysql]# service mysqld start
[root@slave mysql]# mysql -uroot -p123
mysql> set global rpl_semi_sync_slave_enabled=on;
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;
#master插入数据
mysql> insert into db1.tb1 values (null,'hhh');
mysql> show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 2     |
+-----------------------------+-------+

修改等待时间(默认10s)

mysql> show global 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 |
+-------------------------------------------+------------+
mysql> set global rpl_semi_sync_master_timeout=1000;
mysql> show global variables like 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| 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 |
+-------------------------------------------+------------+

插件卸载

插件搜索
mysql> select plugin_name,load_option from information_schema.plugins;
+----------------------------+-------------+
| plugin_name                | load_option |
+----------------------------+-------------+
| binlog                     | FORCE       |
| mysql_native_password      | FORCE       |
| sha256_password            | FORCE       |
| PERFORMANCE_SCHEMA         | FORCE       |
| MEMORY                     | FORCE       |
| MRG_MYISAM                 | FORCE       |
| InnoDB                     | FORCE       |
| INNODB_TRX                 | FORCE       |
| INNODB_LOCKS               | FORCE       |
| INNODB_LOCK_WAITS          | FORCE       |
| INNODB_CMP                 | FORCE       |
| INNODB_CMP_RESET           | FORCE       |
| INNODB_CMPMEM              | FORCE       |
| INNODB_CMPMEM_RESET        | FORCE       |
| INNODB_CMP_PER_INDEX       | FORCE       |
| INNODB_CMP_PER_INDEX_RESET | FORCE       |
| INNODB_BUFFER_PAGE         | FORCE       |
| INNODB_BUFFER_PAGE_LRU     | FORCE       |
| INNODB_BUFFER_POOL_STATS   | FORCE       |
| INNODB_TEMP_TABLE_INFO     | FORCE       |
| INNODB_METRICS             | FORCE       |
| INNODB_FT_DEFAULT_STOPWORD | FORCE       |
| INNODB_FT_DELETED          | FORCE       |
| INNODB_FT_BEING_DELETED    | FORCE       |
| INNODB_FT_CONFIG           | FORCE       |
| INNODB_FT_INDEX_CACHE      | FORCE       |
| INNODB_FT_INDEX_TABLE      | FORCE       |
| INNODB_SYS_TABLES          | FORCE       |
| INNODB_SYS_TABLESTATS      | FORCE       |
| INNODB_SYS_INDEXES         | FORCE       |
| INNODB_SYS_COLUMNS         | FORCE       |
| INNODB_SYS_FIELDS          | FORCE       |
| INNODB_SYS_FOREIGN         | FORCE       |
| INNODB_SYS_FOREIGN_COLS    | FORCE       |
| INNODB_SYS_TABLESPACES     | FORCE       |
| INNODB_SYS_DATAFILES       | FORCE       |
| INNODB_SYS_VIRTUAL         | FORCE       |
| CSV                        | FORCE       |
| MyISAM                     | FORCE       |
| partition                  | ON          |
| FEDERATED                  | OFF         |
| BLACKHOLE                  | ON          |
| ARCHIVE                    | ON          |
| ngram                      | ON          |
| rpl_semi_sync_master       | ON          |
+----------------------------+-------------+

卸载插件rpl_semi_sync_master
mysql> uninstall plugin rpl_semi_sync_master;
ERROR 1883 (HY000): Plugin 'rpl_semi_sync_master' cannot be uninstalled now. Stop any active semisynchronous slaves of this master first.

#需要先卸载slave上的rpl_semi_sync_slave;
mysql> uninstall plugin rpl_semi_sync_slave;
ERROR 1883 (HY000): Plugin 'rpl_semi_sync_slave' cannot be uninstalled now. Stop any active semisynchronous I/O threads on this slave first.
#卸载rpl_semi_sync_slave,需要先关闭IO线程
mysql> stop slave IO_THREAD;
mysql> uninstall plugin rpl_semi_sync_slave;

mysql> uninstall plugin rpl_semi_sync_master;
ERROR 1883 (HY000): Plugin 'rpl_semi_sync_master' cannot be uninstalled now. Stop any active semisynchronous slaves of this master first.
#卸载rpl_semi_sync_master,还需要先使其失活
mysql> set global rpl_semi_sync_master_enabled=OFF;
mysql> uninstall plugin rpl_semi_sync_master;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值