看完你就懂什么是Mysql主从复制了

前言

以下内容基于MySQL5.7官方文档


Mysql Replication

可以将一台MySQL数据库服务器(源)中的数据复制到一台或多台MySQL数据库服务器(副本)中。默认情况下,复制是异步的,性能较好;副本无需永久连接即可从源接收更新。根据配置,您可以复制数据库中的所有数据库,选定的数据库,甚至选定的表。

MySQL中复制的优点包括:

  • 横向扩展解决方案-在多个副本之间分散负载以提高性能。在这种环境下,所有写入和更新都必须在复制源服务器(主服务器)上进行。但是,读取可能发生在一个或多个副本(从服务器)上。该模型可以提高写入性能(因为源专用于更新),同时可以在越来越多的副本中显着提高读取速度。
  • 数据安全性-因为数据已复制到副本,并且副本可以暂停复制过程,所以可以在副本上运行备份服务而不会破坏相应的源数据。
  • 分析-可以在源上创建实时数据,而信息分析可以在副本上进行,而不会影响源的性能。
  • 远程数据分发-您可以使用复制来创建数据的本地副本以供远程站点使用,而无需永久访问源。

MySQL 5.7支持不同的复制方法。传统方法基于复制源二进制日志中的事件,并且要求日志文件及其中的位置在源和副本之间同步。基于全局事务标识符(GTID)是一种的较新方法,它是事务性的,因此不需要处理日志文件或这些文件中的位置,从而大大简化了许多常见的复制任务。使用GTID进行复制可以确保源和副本之间的一致性,只要在源上提交的所有事务也都已应用到副本上即可。

MySQL中的复制支持不同类型的同步。同步的原始类型是单向异步复制,其中一台服务器充当源,而一台或多台其他服务器充当副本。这与NDB Cluster的特征同步复制相反。在MySQL 5.7中,除了内置的异步复制外,还支持半同步复制。对于半同步复制,在返回执行事务的会话之前,在源块上执行提交,直到至少一个副本确认它已接收并记录了事务事件为止;MySQL 5.7还支持延迟复制,以便副本在源指定的时间之后进行复制。对于需要同步复制的方案 ,请使用NDB Cluster

复制格式有两种核心类型:基于语句的复制(SBR),它复制整个SQL语句;和基于行的复制(RBR),它仅复制更改的行。您还可以使用第三种混合混合复制(MBR)。

您可以使用复制来解决许多不同的问题,包括性能,支持不同数据库的备份,以及作为减轻系统故障的大型解决方案的一部分。


基于二进制日志文件位置的复制

本节介绍了基于二进制日志文件位置方法的MySQL服务器之间的复制,在该复制方法中,作为源的MySQL实例(数据库更改源自此实例)将更新和更改作为“事件”写入二进制日志。二进制日志中的信息根据所记录的数据库更改以不同的日志记录格式存储。将副本配置为从源读取二进制日志,并在副本的本地数据库上的二进制日志中执行事件。

每个副本都接收二进制日志的全部内容的副本。副本负责确定应执行二进制日志中的哪些语句。除非您另外指定,否则源二进制日志中的所有事件均在副本上执行。如果需要,可以将副本配置为仅处理适用于特定数据库或表的事件。

每个副本均记录二进制日志坐标:从源读取并处理的文件名和文件在文件中的位置。这意味着可以将多个副本连接到源并执行同一二进制日志的不同部分。由于副本控制着此过程,因此可以在不影响源操作的情况下将单个副本与服务器连接和断开连接。同样,由于每个副本都将当前位置记录在二进制日志中,因此副本可能会断开连接,重新连接然后恢复处理。

必须为源和每个副本配置唯一ID(使用server_id系统变量)。此外,必须为每个副本配置有关源主机名,日志文件名以及该文件中位置的信息。可以使用CHANGE MASTER TO副本上的语句在MySQL会话中控制这些详细信息。

注:复制源即代表主数据库(master),副本代表从数据库(slave)

复制的相关配置

下面将介绍基于二进制日志文件复制的基本配置,大家看完,就可以清楚地知道然后进行配置了。

设置复制源配置

要将源配置为使用基于二进制日志文件位置的复制,必须确保启用了二进制日志记录,并建立唯一的服务器ID。

复制拓扑中的每个服务器都必须配置有唯一的服务器ID,您可以使用server_id系统变量指定该ID 。此服务器ID用于标识复制拓扑中的各个服务器,并且必须为1到(2 32)-1之间的正整数。您可以server_id通过发出如下语句来动态更改 值:

SET GLOBAL server_id = 2;

缺省服务器ID为0时,源拒绝来自副本的任何连接,而副本拒绝连接到源,因此该值不能在复制拓扑中使用。除此之外,您可以选择组织和选择服务器ID的方式,只要每个服务器ID与复制拓扑中任何其他服务器使用的每个其他服务器ID不同即可。请注意,如果先前为服务器ID设置的值为0,则必须重新启动服务器以使用新的非零服务器ID初始化源。否则,不需要重新启动服务器,除非您需要启用二进制日志记录或进行其他需要重新启动的配置更改。

必须在源上启用 二进制日志记录,因为二进制日志是将更改从源复制到其副本的基础。如果使用该log-bin 选项未在源上启用二进制日志记录,则无法进行复制。要在尚未启用二进制日志记录的服务器上启用二进制日志记录,必须重新启动服务器。在这种情况下,请关闭MySQL服务器并编辑 my.cnf或my.ini文件。在[mysqld]配置文件的部分中,添加log-bin和 server-id选项。如果这些选项已经存在,但已被注释掉,请取消注释这些选项并根据需要进行更改。例如,要使用日志文件名前缀启用二进制日志记录mysql-bin并将服务器ID配置为1,请使用以下几 行:

[mysqld]
log-bin=mysql-bin
server-id=1

进行更改后,重新启动服务器。

注意
以下选项会影响此过程:

为了在InnoDB与事务一起使用的复制设置中获得最大的持久性和一致性 ,应在源 文件中使用

innodb_flush_log_at_trx_commit=1
和 
sync_binlog=1

确保 您的源上未启用skip_networking系统变量。如果启用了该变量,那么会禁用网络连接,则副本无法与源通信,复制就会失败。


创建用于复制的用户
每个副本需要使用MySQL用户名和密码连接到源,因此源上必须有一个用户帐户,副本可用于连接。设置副本时,用户名由命令MASTER_USER上的选项指定 CHANGE MASTER TO。只要已授予该帐户REPLICATION SLAVE 特权,任何帐户都可以用于此操作。您可以选择为每个副本创建一个不同的帐户,或为每个副本使用相同的帐户连接到源。

尽管不必专门为复制创建帐户,但应注意,复制用户名和密码以纯文本格式存储在复制元数据存储库中。因此,您可能希望创建一个仅对复制过程具有特权的单独帐户,以最大程度地降低损害其他帐户的可能性。

要创建一个新帐户,请使用CREATE USER命令。要向该帐户授予复制所需的特权,请使用以下GRANT 语句。如果仅出于复制目的创建帐户,则该帐户仅需要 REPLICATION SLAVE特权。例如,要设置一个新用户,repl该用户可以从example.com域内的任何主机进行复制连接,请 在源上发出以下语句:

mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

获取复制源的二进制日志坐标

要将副本配置为在正确的点开始复制过程,您需要在其二进制日志中记下源的当前坐标。

如果计划关闭源以创建数据快照,则可以选择跳过此过程,而是将二进制日志索引文件的副本与数据快照一起存储。在这种情况下,源将在重新启动时创建一个新的二进制日志文件。因此,副本必须在其中开始复制的源的二进制日志坐标就是该新文件的开始,它是源上的下一个二进制日志文件,位于复制的二进制日志索引文件中列出的文件之后。

要获取源的二进制日志坐标,请按照下列步骤操作:

1、通过使用命令行客户端连接到源,从而在源上启动会话,并通过执行以下FLUSH TABLES WITH READ LOCK语句刷新所有表并阻止写入语句:

mysql> FLUSH TABLES WITH READ LOCK;

注:FLUSH TABLES WITH READ LOCK会阻止 表的COMMIT操作 ,即防止写操作的提交

2、在源上的另一个会话中,使用该 SHOW MASTER STATUS语句确定当前二进制日志文件的名称和位置:

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

该File列显示日志文件的名称,并且Position列显示文件中的位置。在本示例中,二进制日志文件为mysql-bin.000003,位置为73。记录这些值。稍后在设置副本时需要它们。它们代表复制坐标,副本应从该坐标开始处理源中的新更新。

如果源以前一直在运行而未启用二进制日志记录,则SHOW MASTER STATUS或mysqldump --master-data显示的日志文件名和位置值为空。在这种情况下,以后指定源日志文件和位置时需要使用的值为空字符串(’’)

现在,您已经拥有了使副本从正确位置的二进制日志开始读取并复制的信息。

#副本设置

以下各节描述如何设置副本。

1、每个副本必须具有server_id系统变量指定的唯一服务器ID 。如果要设置多个副本,则每个副本都必须具有一个唯一server_id值,该值必须不同于源副本和任何其他副本。如果尚未设置副本服务器的服务器ID,或者当前值与您为源服务器或其他副本服务器选择的值相冲突,则必须对其进行更改。默认 server_id值为0,表示副本拒绝连接到源。

您可以server_id 通过发出如下语句来动态更改值:

SET GLOBAL server_id = 21;

如果server_id 先前已将默认值设置为0,则必须重新启动服务器以使用新的非零服务器ID初始化副本。否则,更改服务器ID时不需要重新启动服务器,除非您进行其他需要它的配置更改。例如,如果在服务器上禁用了二进制日志记录,并且您希望对副本启用二进制日志记录,则需要重新启动服务器才能启用此功能。

如果要关闭副本服务器,则可以编辑[mysqld]配置文件的 部分以指定唯一的服务器ID。例如:

[mysqld]
server-id=21

副本不需要启用二进制日志记录就可以进行复制。但是,副本上的二进制日志记录可用于数据备份和崩溃恢复。启用了二进制日志记录的副本也可以用作更复杂的复制拓扑的一部分。如果要在副本上启用二进制日志记录,请配置配置文件 [mysqld]部分中的log-bin选项。需要重新启动服务器才能在以前未使用过的服务器上启动二进制日志记录。

2、在副本服务器上设置源配置

要设置副本以与复制源进行通信,请为副本配置必要的连接信息。为此,请在副本上执行以下语句,将选项值替换为与系统相关的实际值:

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='source_host_name',
    ->     MASTER_USER='replication_user_name',
    ->     MASTER_PASSWORD='replication_password',
    ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;

3、启动复制线程:

mysql> START SLAVE;

执行完此过程之后,副本服务器将连接到源并复制自拍摄快照以来源上发生的所有更新。

猜你喜欢

转载自blog.csdn.net/qq_36551991/article/details/111496176
今日推荐