(一)gtid主从半同步复制

一、半同步复制原理

mysql默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库如果crash掉了,此时主库上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

二、操作步骤

server2   master

server3   slave

1) 在server2(master)上进行配置文件的修改

--->  vim /etc/my.cnf

server-id=1         # 表示master的id                  

log-bin=mysql-bin   # 生成二进制文件  
gtid_mode=ON        # 打开gtid模式

enforce_gtid-consistency=ON

--->  /etc/init.d/mysqld  start

2)在server3(slave)上编写配置文件

--->  vim /etc/my.cnf

server-id=2

gtid_mode=ON
enforce-gtid-consistency=true

--->  /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;最终实现三台主机均可以读写,且可以同步。

1、首先关闭server2、3、4的mysqld服务,并把/var/lib/mysql下的内容删除。

2、在server2、server3、server4中修改配置文件:

--->  vim /etc/my.cnf

server_id=1                    # 三个节点的id不同

  1. 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= off
    loose-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:

Mysql5.7的gtid主从半同步复制和组复制的更多相关文章

  1. 实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)

    主从复制原理: 从库生成两个线程,一个I/O线程,一个SQL线程: i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中:主库会生成一个 log ...

  2. 搭建MySQL的主从、半同步、主主复制架构

    复制其最终目的是让一台服务器的数据和另外的服务器的数据保持同步,已达到数据冗余或者服务的负载均衡.一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作为主服务器.主从服务器可以位于不同的网络拓 ...

  3. MariaDB主从半同步复制详解

    半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay lo ...

  4. mysql5.7基于gtid主从重做

    master上备份mysql/data/Percona-5721/scripts/xtra_sohmysql_fullbak.sh scp 备份文件到备机 关闭slave service mysql ...

  5. Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)

    之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...

  6. MySQL5.6复制技术(2)-主从部署以及半同步配置详细过程

    当前环境规划 主机名称 ec2t-pgtest-01 ec2t-pgtest-02 IP地址 10.189.102.118 10.189.100.195 角色 master slave 系统版本 Ce ...

  7. mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制)

    一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在一定的延时,这样存在一个隐患:当主库上写入一个事务并提交成功,而从库尚未得到主库推送的Binlog日志时,主库 ...

  8. centos7下mysql半同步复制原理安装测试详解

    原理简介: 在MySQL5.5之前,MySQL的复制其实都是异步复制(见下图),主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写入一个事务并提交成功,而从库尚未得到主库推送的BinL ...

  9. (5.5)mysql高可用系列——MySQL半同步复制(实践)

    关键词,mysql半同步复制 [0]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复 ...

随机推荐

  1. EasyUI Droppable 可放置

    通过 $.fn.droppable.defaults 重写默认的 defaults. 用法 通过标记创建可放置(droppable)区域. <div class="easyui-dro ...

  2. php中使用Curl、socket、file_get_contents三种方法POST提交数据

    抓取远程内容,之前一直都在用file_get_content函数,其实早就知道有curl这么一个好东西的存在,但是看了一眼后感觉使用颇有些复杂,没有file_get_content那么简单,再就是需求 ...

  3. C#使用Gzip解压缩完整读取网页内容

    using System; using System.Threading; using System.Text; using System.Text.RegularExpressions; using ...

  4. C++ builder 书籍推荐

    china-pub网上书店c++builder书籍专区,本专区专门为c++builder学习者提供目前最为畅销实用的c++builder技术书籍,通过对本专区c++builder书籍的了解,让您学习c ...

  5. Spring—spring概述

    Spring框架的特点? 1:轻量级,一站式开发 2:易用,追求代码的最佳实现 3:Spring的内容: a:Ioc容器 b:AOP实现 c:数据访问支持(ORM框架/声明事务[Transaction ...

  6. flume通过avro对接(汇总数据)

    使用场景: 把多台服务器(flume generator)上面的日志汇总到一台或者几台服务器上面(flume collector),然后对接到kafka或者HDFS上 Flume Collector服 ...

  7. Qt信号和槽连接方式的选择

    看了下Qt的帮助文档,发现connect函数最后还有一个缺省参数. connect函数原型是这样的: QMetaObject::Connection QObject::connect(const QO ...

  8. WdatePicker设置日期范围

    设置 结束日期不超过当天日期:设置 开始日期不超过结束日期:设置 开始日期默认显示当月1日的日期,结束日期显示当天日期?<label>开始日期:</label><inpu ...

  9. OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)

    http://blog.csdn.net/dcrmg/article/details/53677739 1. 基于直方图均衡化的图像增强   直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶 ...

  10. 20145322何志威《网络对抗》逆向及Bof基础

    20145322何志威<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...