Mysql5.7的gtid主从半同步复制和组复制
(一)gtid主从半同步复制
一、半同步复制原理
mysql默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库如果crash掉了,此时主库上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
二、操作步骤
server2 master
server3 slave
1) 在server2(master)上进行配置文件的修改
---> vim /etc/my.cnf
server-id=1 # 表示master的id
enforce_gtid-consistency=ON
---> /etc/init.d/mysqld start
2)在server3(slave)上编写配置文件
---> vim /etc/my.cnf
server-id=2
---> /etc/init.d/mysqld start
3)在slave中,基于gtid的主从复制搭建成功后,关闭slave。
(可以参照之前的博客mysql的gtid的主从复制)
4)在master中安装半同步复制所需的模块
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> show variables like '%semi_sync%'; # 半同步复制等待时间为10s
5)在slave中安装模块并查看
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> show global variables like '%semi%'; # 查看半同步的信息
---> start slave;
6)在master中插入一条语句,并进行检测
mysql> use student;
mysql> insert into msg values ('4','lala');
mysql> show status like '%semi_sync%'; # 可以看到半同步成功了次数加了1
注释: Rpl_semi_sync_master_yes_tx ##使用半同步成功的次数,数据一致性性能提高
Rpl_semi_sync_master_no_tx ##使用半同步失败的次数,10s后没有得到反馈信息,会转为异步复制
7)将slave的半同步关闭时候,进行插入测试
mysql> set global rpl_semi_sync_slave_enabled=OFF; ###将半同步设置为关闭
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> show global variables like '%semi%';
# 此时在server2(master)中再插入一条数据测试。结果如下:
mysql> insert into msg values ('5','ling'); # 本次插入花费了十秒,因为异步复制有十秒等待slave发送ack的时间;若10s后还没有反映,就会转换为异步复制。
mysql> show global status like '%semi%';
# 查看异步复制的执行记录(失败次数+1)
在此过程出现问题和解决方式:
问题1:Slave_SQL_Running: No
解决方法:start slave; # 启动slave(或者关闭slave之后,---> reset slave,再启动slave)
问题2:Slave_IO_Running: Connecting,说明主从库没有连接上
解决方法:1) 在master中是否对用户进行授权
2) 密码或pos号是否正确
3) 防火墙是否关闭
(二)组复制
环境: server2 master
server3、server4 slave
参照官方文档:https://dev.mysql.com/doc/refman/5.7/en/group-replication-adding-instances.html;最终实现三台主机均可以读写,且可以同步。
2、在server2、server3、server4中修改配置文件:
---> vim /etc/my.cnf
server_id=1 # 三个节点的id不同
gtid_mode=ON # 打开gtid模式
enforce_gtid_consistency=ON
master_info_repository=TABLE # 把relay.info记录在slave_relay_log_info表中
relay_log_info_repository=TABLE
log_bin=binlog
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="c1a16382-2146-417d-a1c7-1b77fd000b42" # uuid我们可以使用uuidgen来生成
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.2.2:24901" # 填写自己主机的ip
loose-group_replication_group_seeds= "172.25.2.2:24901,172.25.2.3:24902,172.25.2.4:24901" # 三个节点ip
loose-group_replication_bootstrap_group= offloose-group_replication_enforce_update_everywhere_checks=onloose-group_replication_ip_writelist='127.0.0.1/8,172.25.2.0/24'loose-group_replication_single_primary_mode=off
---> /etc/init.d/mysqld start # 启动数据库
3、在server2中进行mysql的登陆,并进行设置。(随机密码在/var/log/mysqld下查找)
mysql> SET SQL_LOG_BIN=0; # 关闭日志同步
mysql> alter user root@localhost identified by 'Xniu+123'; # 修改root用户密码
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' identified by 'Xniu+123'; # 向rel_user用户授予所有权限(用来同步信息)
mysql> FLUSH PRIVILEGES; # 刷新授权表
mysql> reset master;
mysql> SET SQL_LOG_BIN=1; # 开启日志记录
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xniu+123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; # 安装组复制所需的模块
mysql> SHOW PLUGINS;
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members; # 此时server2已添加到组中。(状态为online)
4、在server3和server4中进行mysql的设置。由于步骤相同,在这以server3为例显示:
mysql> SET SQL_LOG_BIN=0;
mysql> alter user root@localhost identified by 'Xniu+123';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Xniu+123';
mysql> reset master;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xniu+123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members; # 若此时server4也配置完成,则结果如下:(状态均为online)
5、测试
#当我们在server2中创建数据库时,所有节点均可以看到
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
server2:
server3:
server4:
# 当我们在server4中插入信息时,在srver2和server3中结果如下:
mysql> INSERT INTO test.t1 VALUES (2, 'Lucy');
server2:
server3:
Mysql5.7的gtid主从半同步复制和组复制的更多相关文章
- 实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)
主从复制原理: 从库生成两个线程,一个I/O线程,一个SQL线程: i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中:主库会生成一个 log ...
- 搭建MySQL的主从、半同步、主主复制架构
复制其最终目的是让一台服务器的数据和另外的服务器的数据保持同步,已达到数据冗余或者服务的负载均衡.一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作为主服务器.主从服务器可以位于不同的网络拓 ...
- MariaDB主从半同步复制详解
半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay lo ...
- mysql5.7基于gtid主从重做
master上备份mysql/data/Percona-5721/scripts/xtra_sohmysql_fullbak.sh scp 备份文件到备机 关闭slave service mysql ...
- Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)
之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...
- MySQL5.6复制技术(2)-主从部署以及半同步配置详细过程
当前环境规划 主机名称 ec2t-pgtest-01 ec2t-pgtest-02 IP地址 10.189.102.118 10.189.100.195 角色 master slave 系统版本 Ce ...
- mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制)
一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在一定的延时,这样存在一个隐患:当主库上写入一个事务并提交成功,而从库尚未得到主库推送的Binlog日志时,主库 ...
- centos7下mysql半同步复制原理安装测试详解
原理简介: 在MySQL5.5之前,MySQL的复制其实都是异步复制(见下图),主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写入一个事务并提交成功,而从库尚未得到主库推送的BinL ...
- (5.5)mysql高可用系列——MySQL半同步复制(实践)
关键词,mysql半同步复制 [0]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复 ...
随机推荐
- mysql 数据操作 单表查询 where约束 is null in
需求找出年龄是 81 或者 73 或者 28 mysql ; +----+-----------+--------+-----+------------+-----------+----------- ...
- go-003-基础语法
1.行分隔符 一行代表一个语句结束. 如果一行多个,使用“;”分割,不推荐使用,建议使用默认一行一个语句 2.标识符 标识符用来命名变量.类型等程序实体.一个标识符实际上就是一个或是多个字母(A~Z和 ...
- PHP debug_backtrace() 函数打印调用处的调试信息
http://php.net/manual/zh/function.debug-backtrace.php debug_backtrace (PHP 4 >= 4.3.0, PHP 5, PHP ...
- 关于Oracle误操作--数据被Commit后的数据回退恢复(闪回)
今天操作Oracle数据库时,做一个Update数据时,不小心少写了个where,看这粗心大意的. 于是乎,把所有的员工工号都给更新成一个同一个工号了.这是一个悲催的故事. 因为工号是Check了好多 ...
- [LeetCode]83. Remove Duplicates from Sorted List(排序链表去重)
Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...
- RedHot 不能联网 ifconfig命令只显示lo 不显示eth0的解决方法!
1.修改eth0 具体步骤如下 vi /etc/sysconfig/network-scripts/ifcfg-eth0, i,进入insert编辑模式,具体参数设置如下: DEVICE=eth0 B ...
- SQL学习笔记三(补充-2)之MySQL数据类型
阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 ...
- object类之toString方法
object是所有类的基类 如果没有使用extends关键字指明其基类,则默认基类为object类 public class Person{ ........ } 等价于: public class ...
- 在apache中使用.htaccess文件的注意事项
在apache的配置文件中: <VirtualHost *:80> ServerName tp5.com DocumentRoot d:/wamp/www/tp5.com/public & ...
- stm32 Flash读写独立函数[库函数]
一. stm32的FLASH分为 1.主存储块:用于保存具体的程序代码和用户数据,主存储块是以页为单位划分的, 一页大小为1KB.范围为从地址0x08000000开始的128KB内. 2.信息块 ...