`

mysql主从复制(半同步方式)

阅读更多

一、半同步复制原理介绍

如果还不了解Semi-sync可以阅读(Mannul | 概述

 

 

1. 优点

当事务返回客户端成功后,则日志一定在至少两台主机上存在。

 

MySQL在加载并开启Semi-sync插件后,每一个事务需等待备库接收日志后才返回给客户端。如果做的是小事务,两台主机的延迟又较小,则Semi-sync可以实现在性能很小损失的情况下的零数据丢失。

 

2. 缺点

完成单条事务增加了额外的等待延迟,延迟的大小取决于网络的好坏。

 

Semi-sync不是分布式事务,主库会在自己完成事务后,等待备库接收事务日志。

 

3. 主机Crash时的处理

 

备库Crash时,主库会在某次等待超时后,关闭Semi-sync的特性,降级为普通的异步复制,这种情况比较简单。

 

主库Crash后,那么可能存在一些事务已经在主库Commit,但是还没有传给任何备库,我们姑且称这类事务为"墙头事务"。"墙头事务"都是没有返回给客户端的,所以发起事务的客户端并不知道这个事务是否已经完成。

 

这时,如果客户端不做切换,只是等Crash的主库恢复后,继续在主库进行操作,客户端会发现前面的"墙头事务"都已经完成,可以继续进行后续的业务处理;另一种情况,如果客户端Failover到备库上,客户端会发现前面的“墙头事务”都没有成功,则需要重新做这些事务,然后继续进行后续的业务处理。

 

4. 其他

可以做多个备库,任何一个备库接收完成日志后,主库就可以返回给客户端了。

 

网络传输在并发线程较多时,一次可能传输很多日志,事务的平均延迟会降低。

 

"墙头事务"在墙头上的时候,是可以被读取的,但是这些事务在上面Failover的场景下,是被认为没有完成的。

 

 

5. 半同步复制插件安装

 

 

1. 安装

-------------------------------------

 

在master上安装master插件:

 

 

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 

 

在slave上安装slave插件;

 

 

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
 

 

 

2. 必须同时两端激活

-------------------------------------

在运行时:

 

在master上执行:

 

 

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 3000;
 

 

 

在slave上执行:

 

 

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

 

 

 

3. 监视

-------------------------------------

看配置

 

 

SHOW VARIABLES LIKE 'rpl_semi_sync%';
 

 

 

看状态:

 

SHOW STATUS LIKE 'rpl_semi_sync%';

 

 

二、主从复制原理介绍

     一、MySQL复制概述
  MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器上已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器定位到从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
  二、复制实现细节
  MySQL使用3个线程来执行复制功能,其中两个线程(Sql线程和IO线程)在从服务器,另外一个线程(IO线程)在主服务器。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程执行更新的远远滞后。
  1、复制线程状态
  通过show slave status\G和show master status可以查看复制线程状态。常见的线程状态有:
  (1)主服务器Binlog Dump线程
  Has sent all binlog to slave; waiting for binlog to be updated
  线程已经从二进制日志读取所有主要的更新并已经发送到了从服务器。线程现在正空闲,等待由主服务器上新的更新导致的出现在二进制日志中的新事件。
  (2)从服务器I/O线程状态
  Waiting for master to send event
  线程已经连接上主服务器,正等待二进制日志事件到达。如果主服务器正空闲,会持续较长的时间。如果等待持续slave_read_timeout秒,则发生超时。此时,线程认为连接被中断并企图重新连接。
  (3)从服务器SQL线程状态
  Reading event from the relay log
  线程已经从中继日志读取一个事件,可以对事件进行处理了。
  Has read all relay log; waiting for the slave I/O thread to update it
  线程已经处理了中继日志文件中的所有事件,现在正等待I/O线程将新事件写入中继日志。
  2、复制过程中使用的传递和状态文件
  默认情况,中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。
  从服务器在data目录中另外创建两个小文件。这些状态文件默认名为主master.info和relay-log.info。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。
  如果要备份从服务器的数据,还应备份这两个小文件以及中继日志文件。它们用来在恢复从服务器的数据后继续进行复制。如果丢失了中继日志但仍然有relay-log.info文件,可以通过检查该文件来确定SQL线程已经执行的主服务器中二进制日志的程度。然后可以用Master_Log_File和Master_LOG_POS选项执行CHANGE MASTER TO来告诉从服务器重新从该点读取二进制日志。


三、主从复制的配置方法

 


1. 在master创建复制用户

 

 

grant replication slave on *.* to 'replication'@'192.168.1.%' identified by '000000';
flush privileges;

 

2. 修改master的配置文件,开启binlog日志和设置需要复制的数据库

 

 

[mysqld]
server-id = 1
log-bin=/opt/mysql/binlog/mysql-bin
binlog_do_db=db1
binlog_ignore_db=mysql
binlog_format=mixed

 

 3. 修改slave 配置,指定需要复制的数据库和relaylog的路径

 

 

[mysqld]
server-id = 2
replicate-do-db=db1
replicate-ignore-db = mysql,information_schema
relay-log=/opt/mysql/data/mysqlb-relay-bin
relay-log-index=/opt/mysql/data/mysqlb-relay-bin.index

 

 

 

4. 重启master和slave数据库服务器

 

5. 在master上执行

 

 

 

mysql>flush tables with read lock;
mysql>show master status\G
*************************** 1. row ***************************
            File: binlog.000006
        Position: 107
    Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
 
mysql>unlock tables;

 

 注:这里锁表的目的是为了生产环境中不让进新的数据,好让从服务器定位同步位置。初次同步完成后,记得解锁。

 

6. 在slave上,使用change master指向同步位置

 

mysql>change master to 
master_host='192.168.1.106',master_port=3307, 
master_user='replication', master_password='000000', 
master_log_file='binlog.000006', master_log_pos=107;

 

 注:master_log_file,master_log_pos由上面主服务器查出的状态值中确定。master_log_file对应File,master_log_pos对应Position。mysql 5.x以上版本已经不支持在配置文件中指定主服务器相关选项。

 

 

 

7. 启动从服务器复制线程

 

mysql>start slave;
 

 

 

 

分享到:
评论

相关推荐

    如何实现MySQL的主从复制和半同步复制

    MySQL主从复制是指在一个MySQL集群中,数据在主服务器上写入后,会被自动复制到一个或多个从服务器上。这种复制模式分为三个主要阶段:日志记录、网络传输和应用更改。 1. **日志记录**:在主服务器上,所有事务在...

    Mysql主从半同步配置

    在当今的IT环境下,数据库的高可用性和数据一致性要求越来越高,MySQL主从复制技术也因此受到广泛应用。MySQL主从半同步复制是介于异步复制和全同步复制之间的一种模式,它提供了更好的数据安全性和一致性,同时也尽...

    MySQL主从复制数据同步详解及其架构与优化策略

    内容概要:本文档深入探讨了MySQL主从复制的数据同步原理及其优化方法,涵盖了主从复制架构、MySQL数据同步机制、各种复制方式及其应用场景,还包括常见的主从同步问题如数据不一致性等,提出了改进的方案。...

    MySQL主从复制与读写分离.docx

    MySQL 主从复制是指将一个 MySQL 服务器的数据实时同步到另一个 MySQL 服务器中,以实现数据的高可用性和读写分离。下面是 MySQL 主从复制与读写分离的详细知识点: MySQL 主从复制 MySQL 主从复制是指将一个 ...

    MySQL 主从复制模式全面实践

    MySQL主从复制模式是数据库领域内一种重要的数据同步机制,它能够让一台主数据库服务器(master)的数据实时复制到一个或多个从数据库服务器(slave)上。这种机制在数据库的高可用性、数据备份、读写分离以及负载...

    使用keepalived实现对mysql主从复制的主备自动切换.docx

    mysql主从复制是mysql数据库的一种高可用性解决方案,它可以将数据从主数据库同步到从数据库上,确保数据的一致性。在mysql主从复制环境中,keepalived可以实现自动切换,提高系统的可用性和可靠性。 实验环境 在...

    mysql 主从复制环境搭建

    MySQL 主从复制是指将一个 MySQL 服务器的数据实时同步到另一个 MySQL 服务器上,通常用于提高数据安全、负载均衡和读写分离等。 MySQL 主从复制环境搭建 在 Windows 环境下,搭建 MySQL 主从复制功能需要准备...

    Mysql主从复制&半同步复制原理.pdf

    MySQL主从复制与半同步复制是两种常见的数据复制策略,各有优缺点。主从复制提供简单的异步复制,易于部署,但可能存在数据不一致的风险。半同步复制在一定程度上解决了这个问题,牺牲了一定的性能以换取更高的数据...

    MySQL主从复制搭建从入门到掌握

    MySQL主从复制是一种数据同步机制,它能够将一个MySQL服务器(主服务器)的数据自动同步到一个或多个MySQL服务器(从服务器)。这种机制不仅可以提高数据的安全性和可靠性,还能有效分担主服务器的压力,提升系统的...

    SpringBoot第 12 讲:SpringBoot+MySQL主从复制、读写分离

    主从复制是MySQL数据库的一种高可用性解决方案,其中一台服务器(主服务器)处理所有写操作,而其他服务器(从服务器)同步主服务器上的数据变化,从而形成一个读写分离的环境。这种设计模式有助于减轻主服务器的...

    MYsql主从复制.docx

    Mysql主从复制是一种常用的数据库复制方式,旨在提高数据库的可用性、安全性和读取性能。在Mysql主从复制中,一个数据库服务器充当主服务器,其他服务器充当从服务器。主服务器负责写入数据,而从服务器则负责读取...

    MySQL主从复制.docx

    ### MySQL 主从复制详解 #### 一、引言 MySQL 的主从复制是一种常见的数据库架构模式,它能够帮助实现数据的自动备份与读写分离,从而增强数据安全性并提高数据库性能。本文将详细介绍 MySQL 主从复制的基本概念、...

    MySQL主从复制模式全面实践

    MySQL主从复制是一种数据库高可用性和数据冗余的重要机制,它允许数据从一个服务器(主节点)同步到一个或多个其他服务器(从节点)。在本实践中,我们将深入探讨这一模式的各个方面,包括其工作原理、配置步骤、...

    《深入理解MySQL主从原理32讲》推荐篇

    导读: 作者:高鹏(网名八怪),《深入理解...八怪写作风格很是严谨,几乎每篇都是从源码入手去剖析MySQL主从复制相关的知识点。 强烈推荐大家订阅本专栏 业界大咖推荐序 从2016年开始八怪(本名高鹏)经常向我请教一

    MySQL主从复制与读写分离

    MySQL主从复制与读写分离是数据库架构中的重要策略,旨在提高系统的可用性、扩展性和数据安全性。在大型系统中,随着数据量的增长和访问压力的增加,单一数据库服务器往往无法满足性能需求。主从复制和读写分离是...

Global site tag (gtag.js) - Google Analytics