300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 主从复制:主从复制的概述 一主一从架构搭建主从复制的原理 同步数据一致性问题

主从复制:主从复制的概述 一主一从架构搭建主从复制的原理 同步数据一致性问题

时间:2018-09-10 22:46:38

相关推荐

主从复制:主从复制的概述 一主一从架构搭建主从复制的原理 同步数据一致性问题

文章目录

1. 主从复制的概述1.1 如何提升数据库的并发能力1.2 主从复制的作用 2. 主从复制的原理2.1 原理剖析2.2 复制的最大问题2.3 复制的基本原则 3. 一主一从架构搭建3.1 准备工作3.2 主机配置文件3.3 从机配置文件3.4 建立账户并授权3.5 配置需要复制的主机3.6 测试3.7 停止主从同步 4. 同步数据一致性问题4.1 理解主从延迟问题4.2 解决一致性问题

1. 主从复制的概述

1.1 如何提升数据库的并发能力

在实际工作中,我们常常将Redis作为缓存与MySQL配合来使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出。如果不存在再访问数据库,这样就提升了读取的效率,也减少了对后端数据库的访问压力。Redis的缓存架构是高并发架构中非常重要的一环。

此外,一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是采用数据库集群的方案,做主从架构、进行读写分离,这样同样可以提升数据库的并发处理能力。但并不是所有的应用都需要对数据库进行主从架构的设置,毕竟设置架构本身是有成本的。

如果我们的目的在于提升数据库高并发访问的效率,那么首先考虑的是如何优化SQL和索引,这种方式简单有效;其次才是采用缓存的策略,比如使用Redis将热点数据保存在内存数据库中,提升读取的效率;最后才是对数据库采用主从架构,进行读写分离。

按照上面的方式进行优化,使用和维护的成本是由低到高的。

1.2 主从复制的作用

主从同步设计不仅可以提高数据库的吞吐量,还有以下3个方面的作用。

第1个作用:读写分离。我们可以通过主从复制的方式来同步数据,然后通过读写分离提高数据库并发处理能力。

其中一个是Master主库,负责写入数据,我们称之为:写库。

其它都是Slave从库,负责读取数据,我们称之为:读库。

当主库进行更新的时候,会自动将数据复制到从库中,而我们在客户端读取数据的时候,会从从库中进行读取。

面对“读多写少”的需求,采用读写分离的方式,可以实现更高的并发访问。同时,我们还能对从服务器进行负载均衡,让不同的读请求按照策略均匀地分发到不同的从服务器上,让读取更加顺畅。读取顺畅的另一个原因,就是减少了锁表的影响,比如我们让主库负责写,当主库出现写锁的时候,不会影响到从库进行SELECT的读取。

第2个作用就是数据备份。我们通过主从复制将主库上的数据复制到了从库上,相当于是一种热备份机制,也就是在主库正常运行的情况下进行的备份,不会影响到服务。

第3个作用是具有高可用性。数据备份实际上是一种冗余的机制,通过这种冗余的方式可以换取数据库的高可用性,也就是当服务器出现故障宕机的情况下,可以切换到从服务器上,保证服务的正常运行。

关于高可用性的程度,我们可以用一个指标衡量,即正常可用时间/全年时间。比如要达到全年99.999%的时间都可用,就意味着系统在一年中的不可用时间不得超过365*24*60*(1-99.999%)=5.256分钟(含系统崩溃的时间、日常维护操作导致的停机时间等),其他时间都需要保持可用的状态。

实际上,更高的高可用性,意味着需要付出更高的成本代价。在现实中我们需要结合业务需求和成本来进行选择。

2. 主从复制的原理

Slave会从Master读取binlog来进行数据同步。

2.1 原理剖析

二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程连接的时候,主库可以将二进制日志发送给从库,当主库读取事件(Event)的时候,会在Binlog上加锁,读取完成之后,再将锁释放掉。

从库I/O线程会连接到主库,向主库发送请求更新Binlog。这时从库的I/O线程就可以读取到主库的二进制日志转储线程发送的Binlog更新部分,并且拷贝到本地的中继日志(Relay log)。

从库SQL线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同步。

2.2 复制的最大问题

延时

2.3 复制的基本原则

每个Slave只有一个Master每个Slave只能有一个唯一的服务器ID每个Master可以有多个Slave

3. 一主一从架构搭建

一台主机用于处理所有写请求,一台从机负责所有读请求,架构图如下:

3.1 准备工作

准备2台CentOS虚拟机每台虚拟机上需要安装好MySQL(可以是MySQL8.0)

3.2 主机配置文件

建议mysql版本一致且后台以服务运行,主从所有配置项都配置在[mysqld]节点下,且都是小写字母。

必选

#[必须]主服务器唯一IDserver-id=1#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbinlog-bin=/log/mysqlbin

可选

#[可选]0(默认)表示读写(主机),1表示只读(从机)read-only=8#设置日志文件保留的时长,单位是秒binlog_expire_logs_seconds=6090#控制单个二进制日志大小,此参数的最大和默认值是1GBmax_binlog_size=200M#[可选]设置不要复制的数据库binlog-ignore-db=test#[可选]设置雨要复制的数据库,默认全部记录。比如:binlog-do-db=atguigu_master_slavebinlog-do-db=需要复制的主数据库名字#[可选]设置binlog格式binlog_format=STATEMENT

重启后台mysql服务,使配置生效。

3.3 从机配置文件

要求主从所有配置项都配置在f[mysqld]栏位下,且都是小写字母。

必选

#[必选]从服务器唯一IDserver-id=2

可选

#[可选]启用中继日志relay-log=mysql-relay

重启后台mysql服务,使配置生效。

3.4 建立账户并授权

#在主机MySQL里执行授权主从复制的命令GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'从机器数据库IP'IDENTIFIED BY'abc123';#5.5,5.7

注意:如果使用的是MySQL8,需要如下的方式建立账户,并授权slave:

CREATE USER 'slave1'@ '%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE ON *.* TO 'slave1'@ '%';#此语句必须执行。否则出错。ALTER USER 'slave1'@ '%' IDENTIFIED WITH mysql_native_password BY '123456';flush privileges;

查询Master的状态,并记录下File和Position的值。

show master status;

3.5 配置需要复制的主机

**步骤1:**从机上复制主机的命令

CHANGE MASTER TOMASTER_HOST='主机的IP地址',MASTER_USER='主机用户名',MASTER_PASSWORD='主机用户名的密码',MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;

步骤2:

#启动slave同步START SLAVE;

3.6 测试

主机新建库、新建表、insert记录,从机复制:

3.7 停止主从同步

stop slave;

4. 同步数据一致性问题

主从同步的要求

读库和写库的数据一致(最终一致);写数据必须写到写库;读数据必须到读库(不一定);

4.1 理解主从延迟问题

进行主从同步的内容是二进制日志,它是一个文件,在进行网络传输的过程中就一定会存在主从延迟(比如500ms),这样就可能造成用户在从库上读取的数据不是最新的数据,也就是主从同步中的数据不一致性问题。

4.2 解决一致性问题

异步复制

异步模式就是客户端提交COMMIT之后不需要等从库返回任何结果,而是直接将结果返回给客户端,这样做的好处是不会影响主库写的效率,但可能会存在主库宕机,而Binlog还没有同步到从库的情况,也就是此时的主库和从库数据不一致。这时候从从库中选择一个作为新主,那么新主则可能缺少原来主服务器中已提交的事务。所以,这种复制模式下的数据一致性是最弱的。

半同步复制

MySQL5.5版本之后开始支持半同步复制的方式。原理是在客户端提交COMMIT之后不直接将结果返回给客户端,而是等待至少有一个从库接收到了Binlog,并且写入到中继日志中,再返回给客户端。

这样做的好处就是提高了数据的一致性,当然相比于异步复制来说,至少多增加了一个网络连接的延迟,降低了主库写的效率。

在MysQL5.7版本中还增加了一个rpl_semi_sync_master_wait_for_slave_count参数,可以对应答的从库数量进行设置,默认为1,也就是说只要有1个从库进行了响应,就可以返回给客户端。如果将这个参数调大,可以提升数据一致性的强度,但也会增加主库等待从库响应的时间。

组复制

异步复制和半同步复制都无法最终保证数据的一致性问题,半同步复制是通过判断从库响应的个数来决定是否返回给客户端,虽然数据一致性相比于异步复制有提升,但仍然无法满足对数据一致性要求高的场景,比如金融领域。MGR很好地弥补了这两种复制模式的不足。

组复制技术,简称MGR(MySQL Group Replication)。是MySQL在5.7.17版本中推出的一种新的数据复制技术,这种复制技术是基于Paxos协议的状态机复制。

MGR是如何工作的

首先我们将多个节点共同组成一个复制组,在执行读写(RW)事务的时候,需要通过一致性协议层(Consensus层)的同意,也就是读写事务想要进行提交,必须要经过组里“大多数人”(对应Node节点)的同意,大多数指的是同意的节点数量需要大于(N/2+1),这样才可以进行提交,而不是原发起方一个说了算。而针对只读(RO)事务则不需要经过组内同意,直接COMMIT即可。

在一个复制组内有多个节点组成,它们各自维护了自己的数据副本,并且在一致性协议层实现了原子消息和全局有序消息,从而保证组内数据的一致性。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。