(一)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不同

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. LVS和nginx反向代理网站架构

    LVS和nginx反向代理网站架构 nginx反向代理和lvs的dr都存在单点,要keepalived做高可用,但是成本高了 f

  2. 关于sed -i 修改selinux 的软链接文件的问题

    关于sed -i 修改selinux 的软链接文件的问题 http://blog.csdn.net/kumu_linux/article/details/8598005 因为sed -i /etc/s ...

  3. POJ3352Road Construction(构造双连通图)sdut2506完美网络

    构造双连通图:一个有桥的连通图,如何把它通过加边变成边双连通图? 一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,然后删除这些桥边,剩下的每个连通块都是一个双连通子图.把每个 ...

  4. 画柱状图Java

    样例输入:THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.THIS IS AN EXAMPLE TO TEST FOR YOURHISTOGRAM PROGR ...

  5. mysql8新特性(一)

    https://www.oschina.net/news/95325/mysql-8-0-ga-released http://blog.itpub.net/28218939/viewspace-21 ...

  6. uva11795

    这题说的是一个人要消灭 所有的机器人,但是他有他可以消灭的机器人,他可以通过它消灭的机器人的武器去消灭其他的机器人, 给了一个可以消灭的关系的矩阵,计算消灭这些机器人的顺序的不同方案是多少种 , 刚开 ...

  7. 20155207 2016-2017-2 《Java程序设计》第八周学习总结

    20155207 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第15章 通用API 15.1 日志 15.1.1 日志API简介 java.util.lo ...

  8. linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍

    第四章 进程调度 进程调度程序是一个内核子系统 分配有限的处理器时间和资源 最大限度利用时间的原则(只要有可执行的进程,那么总会有进程执行) 基本工作:从一组处于等待(阻塞)状态的可执行进程中选择一个 ...

  9. POJ 2115 C Looooops(模线性方程)

    http://poj.org/problem?id=2115 题意: 给你一个变量,变量初始值a,终止值b,每循环一遍加c,问一共循环几遍终止,结果mod2^k.如果无法终止则输出FOREVER. 思 ...

  10. Python中通过多个字符分割(split)字符串的方法--转载

    Python中字符串自带的split方法一次只能使用一个字符对字符串进行分割,但是python的正则模块则可以实现多个字符分割 import re re.split('_#|','this_is#a| ...