`
toplchx
  • 浏览: 341991 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL的复制

阅读更多

一、概述

复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。MySQL支持两种复制方式:基于行的复制和基于语句的复制。

基于语句的复制(也称为逻辑复制)早在MySQL3.23版本中就存在,而基于行的复制方式在5.1版本中才被加进来。

新版本的服务器可以作为老版本服务器的备库,但反过来是不可行的。

通过复制可以将读操作指向备库来获得更好的读扩展,但对于写操作,除非设计得当,否则并不适合通过复制来扩展写操作。在一主多备的架构中,写操作会被执行多次,这时候这个系统的性能取决于写入最慢的那部分。

复制比较常见的用途:

数据分布、负载均衡、备份、高可用性和故障切换、MySQL升级测试。

复制的三个步骤:

1、在主库上把数据更改记录到二进制日志(Binary Log)中。

2、备库将主库上的日志复制到自己的中继日志(Relay Log)中。

3、备库读取中继日志中的时间,将其重放到备库数据上。

MySQL的复制架构有一个弱点:在主库上并发运行的查询在备库只能串行化执行,因为只有一个SQL线程来重放中继日志中的事件。

 

二、配置复制

 为MySQL服务器配置复制非常简单,分为以下几步:

  • 在每台服务器上创建复制账号。(严格来讲不是必须每台,但推荐这么做)。
  • 配置主库和备库。
  • 通知备库连接到主库并从主库复制数据。

1、创建复制账号

给复制线程特殊权限

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'192.168.0.%' IDENTIFIED BY 'p4ssword';

 我们在主库和备库创建该账号。

注意:

  • 把账号限制在本地网络,因为这是一个特权账号。
  • REPLICATION SLAVE是全局权限,不能限定某个数据库或表。过滤备份用其他方法,后面会介绍到。
  • 实际上主库只需要REPLICATION SLAVE权限,并且不是每一端服务器都需要REPLICATION CLIENT权限,这么配置时方便出现问题时,主备互换角色。

2、配置主库和备库

主库:

在my.cnf文件中增加或修改如下内容:

log_bin=mysql-bin

server_id=10

实际值由你决定。

必须明确指定一个唯一的服务器ID。通常的做法是使用服务器IP地址的末8位。重启MySQL服务。

可以使用SHOW MASTER STATUS命令检查输出是否如下:



 文件名和后面的数字可能有所不同。positon是当前日志文件的位置。

 

备库:

在my.cnf中增加类似的配置,并重启服务:

log-bin=mysql-bin

server_id=2

relay_log=/var/lib/mysql/mysql-relay-bin

log_slave_update=1

read_only=1

从技术上来说,有些选项并不总是必要的。但推荐这样配置。

read_only可以阻止没有特权的线程修改数据。

 

其他推荐配置:

主库:

sync_binlog=1  #证服务器崩溃时不会丢失事件。

innodb_flush_log_at_trx_commit=1  #保证每个commit都及时写入日志

innodb_support_xa=1  #MySQL5.0及以后版本的配置,支持跨存储引擎及二进制日志事务

log_bin="/var/lib/mysql/mysql-bin"  #明确指定日志文件位置,对多台服务器的管理有帮助

 

备库:

relay_log="path/to/logs/relay-bin"   #指定明确日志位置,可以避免多版本MySQL复制的bug

skip_slave_start  #避免崩溃后自动启动日志,给修复赢取时间

如果使用MySQL5.5并且不介意额外的fsync()的性能开销,最好设置一下选项:

sync_master_info=1

sync_relay_log=1

sync_relay_log_info=1

 

3、启动复制

告诉备库连接到主库,这一步不要通过修改my.cnf来配置,而是使用CHANGE MASTER TO语句。

 

mysql> CHANGE MASTER TO MASTER_HOST='server1',
        -> MASTER_USER='repl',
        -> MASTER_PASSWORD='p4ssword',
        -> MASTER_LOG_FILE='mysql-bin.000001',
        -> MASTER_LOG_POS=0;
 MASTER_LOG_FILE和MASTER_LOG_POS是主服务器上SHOW MASTER STATUS命令看到的文件和位置。位置设置成0,即从日志头开始复制。

 

上面的命令是连接主备库,下面是开始复制的命令:

mysql> START SLAVE;

可以通过SHOW SLAVE STATUS;查看备库复制情况。

 

4、从已有数据的数据库复制

上面的步骤是主库和备库都是新库,在都没有数据是,先配置复制。如果从一个已有数据的服务器复制,先要将备库和主库的数据进行同步。

需要三个条件让主库和备库保持同步:

  • 在某个时间点的主库的数据快照。
  • 主库当前二进制日志文件,和获得数据快照时在该二进制日志文件中的偏移量,称为日志文件坐标。可以通过SHOW MASTER STATUS命令获取这些值。
  • 从快照时间到现在的二进制日志
如何克隆数据可以讲本书,这里极其简略的列举一些方法:
  • 使用冷备份
关闭主库,把数据复制到备库。重启主库后,会使用一个新的二进制日志文件,将备库通过CHANGE MASTER TO指向新的文件其实处。
  • 使用热备份
如果仅使用MyISAM表,可以在主库运行时使用mysqlhotcopy或rsync来复制数据。
  • 使用mysqldump
如果只包含InnoDB表,可以使用以下命令来转存主库数据并将其加载到备库:
$ mysqldump --single-transaction --all-database --master-data=1 --host=server1 | mysql --host=server2
选项--single-transaction使得转存的数据为事务开始前的数据。如果使用非事务表,可以使用--lock-all-tables选项来确保一致性。
  • 使用Percona Xtrabackup
Percona的Xtrabackup是一款开元的热备份工具。它能够在备份时不阻塞服务器的操作。
  • 使用MySQL Workbench 的utilities工具集

工具集中有很多有用的工具,其中mysqldbcopy.exe或mysqldbcopy.py可以用来备份数据。

下面这个命令可以从主库备份数据到备库,备份后,自动启动备库的复制线程。

$ mysqldbcopy --source=root@localhost:3310 --destination=root@localhost:3311 test123 --rpl=master --rpl-user=rpl

 

5、复制过滤器

一般主库记录所有内容,使用备库来进行过滤。

在备库上,可以通过设置下列replicate_*的选项从中继日志中读取事件时进行过滤。

replicate_do_db

replicate_do_table

replicate_ignore_db

replicate_ignore_table

replicate_rewrite_do

replicate_wild_do_table

replicate_wild_ignore_table

 

三、复制拓扑

可以在任意主库和备库之间建立复制,记住下面的旗本原则:

  • 每一个备库只能有一个主库。
  • 每个备库必须有一个唯一的服务器ID
  • 一个主库可以有多个备库(或一个备库可以有多个兄弟备库)
  • 如果打开了log_slave_updates选项,一个备库可以把其主库上的数据变化传播到其他备库。

1、一主库多备库

一主多备的结构和基本配置差不多简单,因为备库之间根本没有交互,它们仅仅是连接到同一个主库上。

这种结构非常灵活,有一下一些用途:

为不同的角色使用不同的备库

把一台备库当做代用的主库,除了复制没有其他数据传输。

将一台备库放到远程数据中心,用作灾难恢复。

延迟一个或多个备库,以备灾难恢复。

使用其中一个备库,作为备份、培训、开发或者测试使用服务器。

 

2、主动-被动模式下的主-主复制

简单来讲就是两台服务器互为对方的备库,并确保只有一台服务器可写。

在两台服务器上执行如下设置后,会使其拥有对称设置:

  • 确保两台服务器上有相同的数据。
  • 启用二进制日志,选择唯一的服务器ID,并穿件复制账号。
  • 启用备库更新的日志记录,这是故障转移和恢复的关键。
  • 把被动服务器配置成只读。
  • 启动每个服务器的MySQL实例。
  • 将每个主库设置为对方的备库,使用新常见的二进制日志开始工作。

这种结构某种意义上类似于创建一个热备份,但可以使用这个“备份”来提供性能,比如用它来执行读操作、备份、“离线”维护以及升级等。真正的热备份做不了这些事。

因为配置是几乎是相同的,所以很容易让主动库和被动库互换角色,这使得故障转移和故障恢复很容易。

 

切换角色的步骤:

  • 停止主动服务器上的所有写入。
  • 在主动服务器上执行SET GLOBAL read_only=1,同时在配置文件里也设置一个read_only,防止重启后失效。但记住这不会阻止拥有超级权限的用户更改数据。如果想阻止所有人更改数据,可以执行FLUSH TABLES WITH READ LOCK。如果没有这么做,你必须kill所有的客户端连接以保证没有长时间运行的语句或者未提交的事务。
  • 在主动服务器上执行SHOW MASTER STATUS并记录二进制日志坐标。
  • 使用主动服务器上的二进制日志坐标在被动服务器上执行SELECT MASTER_POS_WAIT()。该语句将阻塞住,知道复制跟上主动服务器。
  • 在被动服务器上执行SET GLOBAL read_only=0,这样就变换成主动服务器。
  • 修改应用的配置,使其写入到新的主动服务器中。
  • 大小: 5.4 KB
分享到:
评论

相关推荐

    MySQL复制设置步骤

    ### MySQL复制设置步骤详解 MySQL复制机制是一种强大的技术,它允许不同计算机上的MySQL服务器之间保持数据的同步。本文将深入探讨MySQL复制的设置步骤,基于提供的文件内容,我们将重点讲解如何构建一个“主-从”...

    Mysql 复制经典书籍

    Mysql复制的经典书籍,详细介绍复制原理,复制的各种场景,各种问题的解决。覆盖绝大多数生产场景

    MySQL数据复制部署与维护

    MySQL复制系统主要可以实现以下几点策略: 1. 在线数据备份。企业可以专门部署一台slave服务器用于备份。当需要进行数据备份时,可以临时停止该slave上的数据复制进程,然后使用mysqldump工具或者直接拷贝数据文件...

    分析MySQL复制以及调优原理和方法

    MySQL复制和调优是数据库管理中的重要环节,它涉及到数据安全性、系统扩展性和高可用性。本文将深入探讨MySQL复制的原理、实现步骤以及调优方法。 首先,MySQL复制的基本原理是通过主从架构实现数据的实时同步。...

    linux-PerconaReplicationManager异步的MySQL复制管理器代理Pacemaker

    PRM作为Pacemaker的代理,可以识别MySQL复制链路的状态,当检测到主库故障时,它会自动触发从库晋升为主库,从而实现快速的故障恢复。此外,PRM还能协助在主从切换过程中保持数据的一致性。 **4. 文件复制与基于...

    MySQL复制流程深入理解

    MySQL 复制流程深入理解 MySQL 复制流程深入理解是一个复杂的过程,它涉及到多个线程、日志、索引、事务等概念。为了深入理解 MySQL 复制流程,我们需要从多个方面进行分析。 首先,MySQL 复制流程可以分为三个...

    YII2数据库MySQL复制和读写分离配置

    在使用YII2开发应用时,配置MySQL复制和读写分离能够帮助我们更好地利用资源,实现负载均衡。 在进行MySQL复制和读写分离之前,需要了解MySQL的复制原理和基本组件。MySQL的复制过程大致包括以下几个步骤:主服务器...

    企业级架构MySQL复制技术

    ### 企业级架构MySQL复制技术详解 #### 一、MySQL复制技术概述 ##### 1. 业务背景 在现代互联网应用中,随着用户数量的急剧增加以及数据访问频率的提高,传统的单点数据库架构难以满足高并发、低延迟的数据访问...

    用go 写的mysql复制库

    用go 写的mysql复制库 它是一个纯 Go 语言库,用于处理 MySQL 网络协议和复制。该库提供了多个功能,包括 MySQL 复制、增量数据导出、客户端、模拟服务器、故障转移、数据库驱动等。以下是对其中一些关键部分的简要...

    MySQL复制架构部署_MYSQL_

    MySQL复制架构是数据库高可用性、负载均衡和数据冗余的一种常见实现方式。在这个架构中,数据在主服务器上写入后,会通过日志复制技术自动或手动地同步到一个或多个从服务器上。这样的设计使得系统可以承受单点故障...

    在 PyMYSQL 上构建 MySQL 复制协议的纯 Python 实现.zip

    python-mysql-复制在 PyMYSQL 之上构建的 MySQL 复制协议的纯 Python 实现。这允许您接收诸如插入、更新、删除等事件及其数据和原始 SQL 查询。使用案例MySQL 到 NoSQL 数据库的复制MySQL 到搜索引擎的复制当数据库...

    MySQL复制功能:数据同步的高效引擎

    ### MySQL复制功能详解 #### 一、MySQL复制概述 MySQL作为一种流行的关系型数据库管理系统(RDBMS),被广泛应用于Web应用程序的后端数据存储。它的特点包括开放源代码、跨平台支持、高性能、可靠性、易用性以及良好...

    cpp-Ripple一个可以作为MySQL复制中间件的服务器

    Ripple是一款强大的开源项目,它作为一个MySQL复制中间件服务器,被设计用于扩展和增强MySQL的复制功能。Ripple的核心目标是提供一个灵活、可扩展且高性能的解决方案,以便在分布式环境中管理和同步MySQL数据。这个...

    MySQL复制.pptx

    MySQL复制技术是数据库高可用性和负载均衡的重要组成部分,特别是在大规模互联网应用中不可或缺。本文将深入探讨MySQL复制的原理、存在的问题、以及针对这些问题的优化方案,特别是阿里巴巴的AliMySQL特性和一个名为...

    MySQL复制表结构问题的解决方法

    本篇文章将深入探讨MySQL复制表结构时遇到的问题及解决方案。 首先,我们要明确复制表结构并不涉及表中的数据,只是复制了列名、数据类型、主键、外键等元数据。通常,开发者可能会尝试使用`SELECT * INTO`语句来...

    意想不到的MySQL复制延迟原因1

    ### 意想不到的MySQL复制延迟原因分析 在IT运维工作中,MySQL数据库的高可用性和数据一致性至关重要。本文将深入探讨一个案例中的MySQL复制延迟问题,该案例涉及MySQL 5.7.18版本,出现了严重的复制延迟现象,具体...

    MySQL复制技术分析研究.pdf

    MySQL的复制技术是一种核心...总的来说,MySQL复制技术是数据库管理中不可或缺的一部分,它为复杂的分布式系统提供了稳定性和灵活性。理解和掌握复制技术的原理和实践,对于设计和维护高可用性的MySQL集群至关重要。

Global site tag (gtag.js) - Google Analytics