广告
返回顶部
首页 > 资讯 > 数据库 >主从复制原理以及实践
  • 642
分享到

主从复制原理以及实践

2024-04-02 19:04:59 642人浏览 泡泡鱼
摘要

Mysql主从复制原理及配置输入的命令蓝色字体:注释×××背景:重要小标题:蓝底白字1.复制概述Mysql内建的复制功能是构建大型,高性能应用程序的基础。将mysql的数据分布到多个系统上去,这种分布的机制

Mysql主从复制原理及配置

输入的命令

蓝色字体:注释

×××背景:重要

小标题:蓝底白字
1.复制概述

Mysql内建的复制功能是构建大型,高性能应用程序的基础。将mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封并等待主服务器通知新的更新。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。(所以一般会把从服务器设置成只读read_only= 1)

1.1 mysql支持的复制类型:

1):基于语句的复制:在主服务器上执行的sql语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高.一旦发现没法精确复制时,会自动选着基于行的复制。    
2):基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持
3):混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

1.2 . 复制解决的问题

         MySQL复制技术有以下一些特点:
    (1)数据分布 (Data distribution )
    (2)负载平衡(load balancing)
    (3)备份(Backups) 
    (4)高可用性和容错行 High availability and failover 

 1.3 复制如何工作   > 复制的原理:

       (1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
       (2) slave将master的binary log events拷贝到它的中继日志(relay log);
       (3) slave重做中继日志中的事件,将更改应用到自己的数据上。

下图描述了复制的过程:

             主从复制原理以及实践    主从复制原理以及实践        主从复制原理以及实践

slave复制过程:

第一步:master记录二进制日志。在每个事务更新数据完成之前,master二进制日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
       第二步:slave利用I/O thread将master的binary log读取并拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
       第三步:SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

注意:I/O线程更新的数据的情况记录在master.info中.(/application/mysql/data)
        此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。实际生产过程中,同步并不是实时的,是异步进行的.

2 .主从实践配置

   准备两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,如果数据不相同,应该先把master的数据全备导出,然后导入到slave中,这是为了保证主库从库数据一致.(利用多端口实例也可以做)

要点:
负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限。        
环境:
Master版本为5.1.17和slave的版本同为5.5.34(其实最好版本一样,不一样可能有些函数没办法复制)
操作系统Centos 6.9

2.1、创建复制帐号

1、在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予replication slave权限。用户名的密码都会存储在文本文件master.info中

命令如下:
mysql > grant replication slave,reload,super, on *.* to 'backup'@ 192.168.52.220 identified by ‘123456’;

建立一个帐户backup,并且只能允许从192.168.52.220这个地址上来登陆,密码是123456。这里@后面的ip地址就是slave的ip

2.2、拷贝数据

(假如是你完全新安装mysql主从服务器,这个一步就不需要。因为新安装的master和slave数据完全一样)

如果不是则需要:关停Master服务器,将Master中的数据拷贝到B服务器中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同!

其中在进行master数据库全备的时候,请使用参数--master-data=1进行备份如下:

[root@localhost]#mysqldump -uroot -p123456 -A -B -F --master-data=1 -x --events|gzip>备份的文件.

有这个参数,那么在做主从同步的时候,执行change master就不用单独指定mysql-bin的位置,和文件,因为已经在全备里面了,而且是执行语句,在从库进行全备恢复的时候已经完成恢复.和相关文件的指定. 

2.3、配置master

接下来对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值:

server-id=1          #为主服务器A的ID值
log-bin=mysql-bin     #二进制变更日值

重启master,运行SHOW MASTER STATUS,输出如下则代表二进制日志已经成功打开:

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000002 |      106 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

2.4、配置slave

Slave的配置与master类似,你同样需要重启slave的MySQL。如下:
log_bin = mysql-bin
server_id= 2
relay_log = mysql-relay-bin
log_slave_updates = 1
read_only= 1
1):server_id是必须的,而且唯一。

2):slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果slave为其它slave的master,必须设置bin_log。在这里,我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。
3):relay_log配置中继日志,log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处)。
有些人开启了slave的二进制日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误的配置。
4):尽量使用read_only,它防止改变数据(除了特殊的线程)。但是需要在slave上创建表的应用read_only并是很实用.

配置也需要重启才生效. 

2.5、启动slave

到此,接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:

mysql> CHANGE MASTER TO MASTER_HOST='主机IP',

-> MASTER_USER='rep',

-> MASTER_PASSWord='123456',

-> MASTER_LOG_FILE='mysql-bin.000001',#恢复备份用--master-data=1的不需指定.自动在备份中指定

-> MASTER_LOG_POS=0;##恢复备份用--master-data=1的不需要指定.自动在备份中指定

MASTER_LOG_POS的值为0,因为它是日志的开始位置。

如果没有用--master-data则可以需要登录数据库,利用show master status进行MASTER_LOG_FILE

MASTER_LOG_POS的寻找.

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000002 |      106 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确:

mysql> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

Slave_IO_State:

Master_Host: 192.168.52.220

Master_User: rep

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 4

Relay_Log_File: mysql-relay-bin.000001

Relay_Log_Pos: 4

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: No

Slave_SQL_Running: No

               ...omitted...

Seconds_Behind_Master: NULL

Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running是No

表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。

开始复制,你可以运行:

mysql> START SLAVE;

运行SHOW SLAVE STATUS查看输出结果:

mysql> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

 Slave_IO_State: Waiting for master to send event

Master_Host:192.168.52.220

Master_User: rep

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 164

Relay_Log_File: mysql-relay-bin.000001

Relay_Log_Pos: 164

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

                          ...omitted...

Seconds_Behind_Master: 0

在这里主要是看:
             Slave_IO_Running=Yes
             Slave_SQL_Running=Yes

slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。

验证:如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。

你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:

在master上输入show processlist\G;

mysql> show processlist \G

*************************** 1. row ***************************

Id: 1

User: root

Host: localhost:2096

db: test

Command: Query

Time: 0

State: NULL

Info: show processlist

*************************** 2. row ***************************

Id: 2

User: repl

Host: localhost:2144

db: NULL

Command: Binlog Dump

Time: 1838

State: Has sent all binlog to slave; waiting for binlog to be updated

Info: NULL

2 rows in set (0.00 sec)

行2为处理slave的I/O线程的连接。

在slave服务器上运行该语句:

mysql> show processlist \G

*************************** 1. row ***************************

Id: 1

User: system user

Host:

db: NULL

Command: Connect

Time: 2291

State: Waiting for master to send event

Info: NULL

*************************** 2. row ***************************

Id: 2

User: system user

Host:

db: NULL

Command: Connect

Time: 1852

State: Has read all relay log; waiting for the slave I/O thread to update it

Info: NULL

*************************** 3. row ***************************

Id: 5

User: root

Host: localhost:2152

db: test

Command: Query

Time: 0

State: NULL

Info: show processlist

3 rows in set (0.00 sec)

行1为I/O线程状态,行2为SQL线程状态。

来源于网络整理 


您可能感兴趣的文档:

--结束END--

本文标题: 主从复制原理以及实践

本文链接: https://www.lsjlt.com/news/42512.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 主从复制原理以及实践
    Mysql主从复制原理及配置输入的命令蓝色字体:注释×××背景:重要小标题:蓝底白字1.复制概述Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制...
    99+
    2022-10-18
  • 浅谈Redis主从复制以及主从复制原理
    目录面临问题解决办法主从复制主从复制的作用主从复制启用面临问题 1. 机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的。...
    99+
    2022-11-12
  • MySQL 主从复制原理与实践详解
    本文实例讲述了MySQL 主从复制原理与实践。分享给大家供大家参考,具体如下: 简介 MySQL 的主从复制又叫 Replication、AB 复制。至少需要两个 MySQL 服务(可以是同一台机器,也可以是不同机器...
    99+
    2022-05-11
    MySQL 主从复制
  • MySQL 主从复制及原理
    1.主从复制配置a. 环境:CentOS7.4,IP地址分别是主库:192.168.11.146,从库:192.168.11.238,主库版本应低于或等于从库版本,这里用的都是MySQL 8.0.13b.主...
    99+
    2022-10-18
  • MySql主从复制实现原理及配置
    数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个...
    99+
    2022-05-18
    MySql 主从复制
  • MySQL 主从复制原理及搭建
    一.主从复制的工作过程:二.MySQL复制类型基于SQL语句的复制基于行的复制混合复制三.实验环境  OS:CentOS 6.5 x64  master:192.168.0.134&nb...
    99+
    2022-10-18
  • MySQL主从复制的配置及原理
    -----------------------------------------------------------mysql 5.5   环境用的数据库可的多实例----------...
    99+
    2022-10-18
  • Redis replication主从复制原理及配置
    本文主要介绍Redis replication 主从复制原理和配置及基本操作 等 主要参考官方文档: https://redis.io/topics/replication ...
    99+
    2022-10-18
  • MySQL主从复制原理以及需要注意的地方
    写在前面 最近在写Mycat专题,由于不少小伙伴最近要出去面试,问我能不能简单写下MySQL的主从复制原理和注意事项,因为在之前的面试中被问到了这些问题。我:可以啊,安排上了!! 主从复制原理 (1) Master ...
    99+
    2022-05-13
    MySQL 主从复制 MySQL 主从复制原理 MySQL 主从复制注意事项
  • mysql 主从复制原理
    主从形式mysql主从复制 灵活一主一从主主复制一主多从---扩展系统读取的性能,因为读是在从库读取的;多主一从---5.7开始支持联级复制--- 用途及条件 mysql主从复制用途实时...
    99+
    2022-10-18
  • Redis--主从复制原理
    前言: 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Red...
    99+
    2022-10-18
  • mysql主从复制原理
    环境:3306 主库3307 从库1 设置server-id值并开启binlog功能参数编辑mysql的配置文件/data/3306/my.cnf[mysqld]server-id = 6   &...
    99+
    2022-10-18
  • MySQL主从复制原理解析与最佳实践过程
    目录一、主从复制1、复制的基本原理2、复制的基本原则 二、最佳实践1、ping测试2、主服务器配置3、从服务器配置4、主服务器设置5、从服务器设置6、主从测试7、关闭slave总结一、主从复制 1、复制的基本原理 主要涉...
    99+
    2023-05-16
    MySQL主从复制原理解析 MySQL主从复制 MySQL主从复制实践
  • MySQL GTID 主从复制的原理及配置
        GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成。这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系 ...
    99+
    2022-10-18
  • 详解Redis主从复制实践
    目录复制简介服务介绍实现方式1. 服务启动时配置2. 命令行配置3. 配置文件配置4.配置说明效果测试1.主服务器添加数据2.从服务器获取数据实现原理实现策略1.全量复制2.部分复制...
    99+
    2022-11-12
  • solr的主从复制原理
    这篇文章主要讲解了“solr的主从复制原理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“solr的主从复制原理”吧!master的工作对于ReplicationHandler的复制功能来说,...
    99+
    2023-06-03
  • MySQL主从复制延迟原因以及解决方案
    来源:公众号「神谕的暗影长廊」 在异步或半同步的复制结构中,从库出现延迟是一件十分正常的事。 虽出现延迟正常,但是否需要关注,则一般是由业务来评估。 如:从库上有需要较高一致性的读业务,并且要求延迟小于某个值,那么...
    99+
    2022-05-16
    MySQL 主从复制 MySQL 主从复制延迟 MySQL 主从复制延迟解决
  • MySQL主从复制原理详情
    目录前言:一、为什么需要主从复制?二、什么是mysql的主从复制?三、mysql复制原理具体步骤四、mysql主从同步延时分析五、主从复制的配置1、基础设置准备2、安装mysql数据...
    99+
    2022-11-13
  • 初识MariaDB之5——主从复制原理及部署
    一、原理简介当前主流的数据库为了保证数据一致性,都采用支持事务类型的数据存储引擎,如innodb等,当一个事务提交后先写到事务日志中,在进行数据修改,并且将对数据产生任何影响的语句都记录在二进制日志中,主从...
    99+
    2022-10-18
  • MySQL主从复制原理及必备知识总结
    本文主要是关于mysql主从复制的一些原理以及必备知识的梳理,关于mysql主从环境的搭建可参考另一篇博客:MySQL主从复制环境部署【http://blog.itpub.net/31015730/...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作