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" # 填写自己主机的iploose-group_replication_group_seeds= "172.25.2.2:24901,172.25.2.3:24902,172.25.2.4:24901" # 三个节点iploose-group_replication_bootstrap_group= offloose-group_replication_enforce_update_everywhere_checks=on
loose-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:
转载于:https://www.cnblogs.com/uthnb/p/9747288.html
Mysql5.7的gtid主从半同步复制和组复制相关推荐
- mysql主从复制,半同步,主主复制架构的实现
mysql的数据同步功能,不仅在一定程度上提供数据库查询时的负载均衡,而且为实现数据库的冗灾.备份.恢复.负载均衡等都是有极大帮助.而数据的同步功能可以通过主从复制来实现,而主从复制是异步进行的,并且 ...
- 企业级高性能MYSQL的用法---------(二)----------半同步复制 和 全同步复制(组复制)
企业级高性能MYSQL的用法---------(二)----------半同步复制 和 全同步复制(组复制) 1.基于GDIT的半同步复制 为什么要实现mysqI的复制 1.实现服务器负载均衡 2.通 ...
- mysql5.623 GTID主从复制+半同步复制安装与配置
一.GTID简介 什么是GTID GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号. GTID实际上是由UUID+TID组成的.其中UUID是 ...
- Mysql多源复制半同步_MySQL多源复制搭建
1.1 实验概要 1.1.1 实验假设 本实验假设已经完成操作系统和MySQL安装部署. 1.1.2 实验目的 MySQL5.7的多源复制技术搭建部署,然后简单测试. 1.1.3 环境信 ...
- linux mysql主从半同步_centos下安装mysql主从架构(半同步/多实例)
centos下安装mysql主从架构(半同步/多实例) [toc] 简介 本教程会进行mysql一机多实例的安装.mysql主从同步配置.半同步配置 环境 OS: CentOS Linux relea ...
- mysql数据库group_key_【MySQL】数据库复制:组复制(Group Replication)
[root@wallet01 ~]# uuidgen 8d1945a5-5c74-4ba0-8240-e9d731110753 [root@wallet01 ~]# vi /etc/my.cnf ## ...
- mysql 半同步 主主_MySQL主从,半同步,主主复制
MySQL Replication 我们知道,MySQL数据库的二进制日志记录着每一个明确或者潜在可能导致数据库发生改变的sql语句,因此我们可以基于二进制日志来实现mysql的主从一致.而我们在此提 ...
- MySQL 5.7 基于GTID的半同步复制
MySQL version: 5.7.20 master: 10.0.0.201 slave1: 10.0.0.202 slave2: 10.0.0.203 master的配置 安装插件 instal ...
- mysql主主复制、主从复制、半同步的实现
实验前提:两台服务器 Master server:172.16.23.1 slave server:172.16.23.2 一.mysql主从服务器实现 简单介绍: MySQL支持单向.异步复制,复制 ...
最新文章
- java javaw区别
- 如何在Mac上的IntelliJ IDEA中增加IDE内存限制?
- CentOS下初次使用MySQL
- c#如何嵌套第三方程序_C#程序演示嵌套条件运算符的示例
- Java利用二维数组判断节假日_《剑指offer》面试题3 二维数组中的查找 Java版
- java 抛出异常_我的Java Web之路51 - Java异常基础
- iPhone企业应用实例分析之三:程序框架分析
- 线性规划问题及单纯形法-目标函数值极小大M法
- 谈谈Scala的抽取器(Extractor)
- uniapp小程序src引用服务器图片时全局变量与图片路径拼接
- vue前端开发微信支付和支付宝支付
- 【ARM汇编】打印金字塔 | 打印倒三角
- SIM7600CE模块(GSM/GPRS)调试
- OCR识别技术保险保单识别系统|车险保单识别寿险保单识别|助力保险理赔
- 安装Python3.6.3+spyder
- 三维模型材质了解一下
- Pytorch使用autograd.Function自定义拓展神经网络
- 推荐一个轻松搞定数据加密解密神器!
- 浙大pat 1017
- IOS 屏幕适配(一)理论篇