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 数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复 ...
随机推荐
- 菜单和按钮-EasyUI Menu 菜单、EasyUI Linkbutton 链接按钮、EasyUI Menubutton 菜单按钮、EasyUI Splitbutton 分割按钮
EasyUI Menu 菜单 通过 $.fn.menu.defaults 重写默认的 defaults. 菜单(Menu)通常用于上下文菜单.它是创建其他菜单组件(比如:menubutton.spli ...
- Hive重写表数据丢失风险记录
若在Hive中执行INSERT OVERWRITE重写同一个表的数据时,有可能会造成数据丢失. 如 INSERT OVERWRITE TABLE table_name SELECT * FROM ta ...
- (转) SpringBoot非官方教程 | 第二十四篇: springboot整合docker
这篇文篇介绍,怎么为 springboot程序构建一个Docker镜像.docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的 ...
- 1.1 Getting Started-Core Concepts
一.Templates 使用Handlebars模板语言来描述程序的用户接口.每一个模板都有model的支持,如果model改变template就会自动更新. Expressions: li ...
- 121. Best Time to Buy and Sell Stock(股票最大收益)
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- mongo数据库连接工具类(C#)
Framework版本:.Net Framework 4 using System; using System.Collections.Generic; using System.Linq; usin ...
- PostgreSQL 9.3:在windows(包括win7)下的安装与正确配置
首先,以下是常用命令: ③ initdb 初始化 数据库. ④ pg_ctl start 启动数据库 ⑤ pg_ctl stop 停止数据库 ⑥ post_svc -install 建立windows ...
- 20162326 qilifeng 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1
<网络对抗技术>第1次作业 (一)作业任务 1.安装kali 2.设置共享文件夹 (二)操作过程 1.安装kali 因为之前安装过Oracle 的VM VirtualBox 所以直接 进入 ...
- pytorch 从入门到实战
一.安装 按照 http://pytorch.org 官网上的说明来做,遇到了几个坑.记录如下: 1.用 conda 安装 pytorch 时,下载安装包非常慢,无法忍受. 解决办法:用蓝灯FQ,将蓝 ...
- Java发送带html标签内容的邮件
package test; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; im ...