一,MySQL Replication
上面的栗子,一个主库(M),三个从库(S),通过 replication,Master 生成 event 的 binlog,然后发给 slave,Slave 将 event 写入 relaylog,然后将其提交到自身数据库中,实现主从数据同步。 对于数据库之上的业务层来说,基于 MySQL 的主从复制集群,单点写入 Master ,在 event 同步到 Slave 后,读逻辑可以从任何一个 Slave 读取数据,以读写分离的方式,大大降低 Master 的运行负载,同时提升了 Slave 的资源利用。 优点 1、通过读写分离实现横向扩展的能力,写入和更新操作在源服务器上进行,从服务器中进行数据的读取操作,通过增大从服务器的个数,能够极大的增强数据库的读取能力; 2、数据安全,因为副本可以暂停复制过程,所以可以在副本上运行备份服务而不会破坏相应的源数据; 3、方便进行数据分析,可以在写库中创建实时数据,数据的分析操作在从库中进行,不会影响到源数据库的性能; 实现原理 在主从复制中,从库利用主库上的 binlog 进行重播,实现主从同步,复制的过程中蛀主要使用到了
复制的流程 1、主库收到更新命令,执行更新操作,生成 binlog; 2、从库在主从之间建立长连接; 3、主库 dump_thread 从本地读取 binlog 传送刚给从库; 4、从库从主库获取到 binlog 后存储到本地,成为 5、sql_thread 线程读取 主从延迟 不过 因为数据是进行主从同步的,那么就会遇到主从同步延迟的情况。 为什么会出现主从延迟? 1、从库机器的性能比主库差; 2、从库的压力大; 大量查询放在从库上,可能会导致从库上耗费了大量的 CPU 资源,进而影响了同步速度,造成主从延迟。 3、大事务的执行; 有事务产生的时候,主库必须要等待事务完成之后才能写入到 binlog,假定执行的事务是一个非常大的数据插入,这些数据传输到从库,从库同步这些数据也需要一定的时间,就会导致从节点出现数据延迟。 4、从库的复制能力较差; 如果从库的复制能力,低于主库,那么在主库写入压力很大的情况下,就会造成从库长时间数据延迟的情况出现。 如何解决主从延迟 1、优化业务逻辑,避免出现多线程大事务的并发场景; 2、提高从库的机器性能,减少主库写 binlog 和从库读 binlog 的效率差; 3、保证主库和从库的网络连接,避免出现网络延迟导致的 binlog 传输延迟; 4、强行读主库; 5、配合 semi-sync 半同步复制; semi-sync 半同步复制 MySQL 有三种同步模式,分别是: 1、异步复制:MySQL 中默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并且处理。存在问题就是,如果主库的日志没有及时同步到从库,然后主库宕机了,这时候执行故障转移,在从库冲选主,可能会存在选出的主库中数据不完整; 2、全同步复制:指当主库执行完一个事务,并且等到所有从库也执行完成这个事务的时候,主库在提交事务,并且返回数据给客户端。因为要等待所有从库都同步到主库中的数据才返回数据,所以能够保证主从数据的一致性,但是数据库的性能必然受到影响; 3、半同步复制:是介于全同步和全异步同步的一种,主库至少需要等待一个从库接收并写入到 MySQL 中默认的复制是异步的,所以主库和从库的同步会存在一定的延迟,更重要的是异步复制还可能引起数据的丢失。全同步复制的性能又太差了,所以从 半同步复制潜在的问题 在传统的半同步复制中,主库写数据到 binlog,并且执行 commit 提交事务后,会一直等待一个从库的 ACK。从库会在写入 这样会存在问题就是,主库已经将该事务的 commit 存储到了引擎层,应用已经可以看到数据的变化了,只是在等待从库的返回,如果此时主库宕机,可能从库还没有写入 RelayLog,就会发生主从库数据不一致。 为了解决这个问题, 不过看下来增强半同步复制,在同步给从库之后,因为自己的数据还没有提交,然后宕机了,主库中也是会存在数据的丢失,不过应该想到的是,这时候主库宕机了,是会重新在从库中选主的,这样新选出的主库数据是没有发生丢失的。 二,MySQL Group Replication
引入复制组主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。 MGR 由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点 当客户端发起一个更新事务时,该事务先在本地执行,执行完成之后就要发起对事务的提交操作。在还没有真正提交之前,需要将产生的复制写集广播出去,复制到其它成员。因为事务是通过原子广播发送的,所以组中的成员要么都接收事务,要么都不接收事务。如果组中的所有成员收到了该广播消息(事务),那么他们会按照之前发送事务的相同顺序收到该广播消息。因此,所有组成员都以相同的顺序接收事务的写集,并为事务建立全局顺序。因此,所有组成员都以相同的顺序接收事务的写集,并为事务建立全局顺序。 在不同组成员并发执行的事务可能存在冲突。冲突是通过检查和比较两个不同并发事务的 最终,所有组内成员以相同的顺序接收同一组事务。因此组内成员以相同的顺序应用相同的修改,保证组内数据强一致性。 有下面的几种特性: 1、避免脑裂:MGR 中不会出现脑裂的现象; 2、数据一致性保障:MGR 的冗余能力很好,能够保证 3、多节点写入支持:多写模式下支持集群中的所有节点都可以写入。 组复制的应用场景 1、弹性复制:需要非常灵活的复制基础设施的环境,其中MySQL Server的数量必须动态增加或减少,并且在增加或减少Server的过程中,对业务的副作用尽可能少。例如,云数据库服务; 2、高可用分片:分片是实现写扩展的一种流行方法。基于 组复制 实现的高可用分片,其中每个分片都会映射到一个复制组上(逻辑上需要一一对应,但在物理上,一个复制组可以承载多个分片); 3、替代主从复制:在某些情况下,使用一个主库会造成单点争用。在某些情况下,向整个组内的多个成员同时写入数据,对应用来说可能伸缩性更强; 4、自治系统:可以利用组复制内置的自动故障转移、数据在不同组成员之间的原子广播和最终数据一致性的特性来实现一些运维自动化。 三,InnoDB Cluster
1、 2、 3、
优点: 1、高可用性:通过 2、简单易用: 3、全自动故障转移: 缺点: 1、复杂性: 2、性能影响:由于自动复制和高可用性的要求, 3、限制: 四,InnoDB ClusterSet
InnoDB ClusterSet 的特点: 1、主集群和副本集群之间的紧急故障转移可以由管理员通过 2、InnoDB ClusterSet 部署中可以拥有的副本集群的数量没有定义的限制; 3、异步复制通道将事务从主集群复制到副本集群。 4、每个 InnoDB ClusterSet 的限制: 1、InnoDB ClusterSet 只支持异步复制,不能使用半同步复制,无法避免异步复制的缺陷:数据延迟、数据一致性等; 2、InnoDB ClusterSet 仅支持Cluster实例的单主模式,不支持多主模式。 即只能包含一个读写主集群, 所有副本集群都是只读的, 不允许具有多个主集群的双活设置,因为在集群发生故障时无法保证数据一致性; 3、已有的 InnoDB Cluster 不能用作 InnoDB ClusterSet 部署中的副本集群。副本集群必须从单个服务器实例启动,作为新的 InnoDB 集群; 4、只支持 MySQL 8.0。 五,InnoDB ReplicaSet
与
1、没有自动故障转移,在主节点不可用的情况下,需要使用 AdminAPI 手动触发故障转移,然后才能再次进行任何更改。但是,辅助实例仍可用于读取; 2、由于意外停止或不可用,无法防止部分数据丢失:在意外停止时未完成的事务可能会丢失; 3、在意外退出或不可用后无法防止不一致。如果手动故障转移提升了一个辅助实例,而前一个主实例仍然可用,例如,由于网络分区,裂脑情况可能会导致数据不一致; 4、InnoDB ReplicaSet 不支持多主模式。允许写入所有成员的经典复制拓扑无法保证数据一致性; 5、读取横向扩展是有限的。 6、一个 ReplicaSet 最多由一个主实例组成。支持一个或多个辅助。尽管可以添加到 ReplicaSet 的辅助节点的数量没有限制,但是连接到 ReplicaSet 的每个 MySQL Router 都必须监视每个实例。因此,一个 ReplicaSet 中加入的实例越多,监控就越多。 使用 六,MMMMMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和管理 双主模式,业务上同一时刻只能一个主库进行数据的写入。另一个主备库,会在主服务器失效时,进行主备切换和故障转移。 MMM 中是通过一个 VIP(虚拟 IP) 的机制来保证集群的高可用的。整个集群中,在主节点会提供一个 VIP 地址来提供数据读写服务,当出现故障的时候,VIP 就会从原来的主节点便宜到其他节点,由其他节点提供服务。 MMM无法完全的保证数据一致性,所以适用于对数据的一致性要求不是很高的场景。(因为主备上的数据不一定是最新的,可能还没从库的新。解决方法:开启半同步)。 MMM 的优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证数据的一致性。 缺点:无法完全保数据的一致性,建议采用半同步复制方式,减少失败的概率;目前 MMM 社区已经缺少维护,不支持基于 GTID 的复制。 适用场景: MMM的适用场景为数据库访问量大,业务增长快,并且能实现读写分离的场景。 七,MHAMaster High Availability Manager and Tools for MySQL,简称 MHA 。是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。 这个工具专门用于监控主库的状态,当发现 master 节点故障的时候,会自动提升其中拥有新数据的 slave 节点成为新的 master 节点,在此期间,MHA 会通过其他从节点获取额外的信息来避免数据一致性问题。MHA 还提供了 mater 节点的在线切换功能,即按需切换 master-slave 节点。MHA 能够在30秒内实现故障切换,并能在故障切换过程中,最大程度的保证数据一致性。 MHA 由两部分组成; MHA Manager(管理节点)和MHA Node(数据节点)。
整个故障转移过程对应用程序完全透明。 在 MHA 自动故障切换过程中,MHA 试图从宕机的主服务器上最大限度的保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,主服务器硬件故障或无法通过 ssh 访问,MHA 没法保存二进制日志,只进行故障转移而丢失了最新的数据。 使用 目前 MHA 主要支持一主多从的架构,要搭建 MHA,要求一个复制集群中必须最少有三台数据库服务器 ,一主二从,即一台 master,一台充当备用 master,另外一台充当从库,因为至少需要三台服务器。 MHA 工作原理总结如下: 1、从宕机崩溃的 master 保存二进制日志事件(binlog events); 2、识别最新更新的 slave; 3、应用差异的中继日志(relay log) 到其他slave; 4、应用从master保存的二进制日志事件(binlog events); 5、提升一个 slave 为新master; 6、使用其他的 slave 连接新的 master 进行复制。 优点: 1、可以支持基于 GTID 的复制模式; 2、MHA 在进行故障转移时更不易产生数据丢失; 3、同一个监控节点可以监控多个集群。 缺点: 1、需要编写脚本或利用第三方工具来实现 Vip 的配置; 2、MHA 启动后只会对主数据库进行监控; 3、需要基于 SSH 免认证配置,存在一定的安全隐患。 八,Galera Cluster
其本身具有 multi-master 特性,支持多点写入, 主要功能 1、同步复制; 2、真正的 multi-master,即所有节点可以同时读写数据库; 3、自动的节点成员控制,失效节点自动被清除; 4、新节点加入数据自动复制; 5、真正的并行复制,行级; 6、用户可以直接连接集群,使用感受上与 MySQL 完全一致。 优势 1、数据一致:同步复制保证了整个集群的数据一致性,无论何时在任何节点执行相同的select查询,结果都一样; 2、高可用性:由于所有节点数据一致,单个节点崩溃不需要执行复杂耗时的故障切换,也不会造成丢失数据或停止服务; 3、性能改进:同步复制允许在集群中的所有节点上并行执行事务,从而提高读写性能; 4、更小的客户端延迟; 5、同时具有读和写的扩展能力。 分析下原理
异步复制,主库将数据更新传播给从库后立即提交事务,而不论从库是否成功读取或重放数据变化,所以异步复制会存在短暂的,主从数据同步不一致的情况出现。 不过同步复制的缺点也是很明显的,同步复制协议通常使用两阶段提交或分布式锁协调不同节点的操作,也及时说节点越多需要协调的节点也就越多,那么事务冲突和死锁的概率也就会随之增加。 我们知道 MGR 组复制的引入也是为了解决传统异步复制和半同步复制可能产生数据不一致的问题,MGR 中的组复制,基于 Paxos 协议,原则上事务的提交,主要大多数节点 ACK 就可以提交了。
Galera 复制是一种基于验证的复制,基于验证的复制使用通信和排序技术实现同步复制,通过广播并发事务之间建立的全局总序来协调事务提交。简单的讲就是事务必须以相同的顺序应用于所有实例。 事务现在本地执行,然后发送的其他节点做冲突验证,没有冲突的时候所有节点提交事务,否则在所有节点回滚。 当客户端发出 commit 命令时,在实际提交之前,对数据所做的更改都会收集到一个写集合中,写集合中包含事务信息和所更改行的主键,数据库将写集发送到其它节点。 节点用写集中的主键与当前节点中未完成事务的所有写集的主键比较,确定节点是否可以提交事务,同时满足下面三个条件会被任务存在冲突,验证失败: 1、两个事务来源于不同节点; 2、两个事务包含相同的主键; 3、老事务对新事务不可见,即老事务未提交完成。新老事务的划定依赖于全局事务总序,即 GTID。 验证失败,节点将删除写集,集群将回滚原始事务,对于所有的节点都是如此,每个节点单独进行验证。因为所有节点都以相同的顺序接收事务,它们对事务的结果都会做出相同的决定,要么全成功,要么都失败。成功后自然就提交了,所有的节点又会重新达到数据一致的状态。节点之间不交换“是否冲突”的信息,各个节点独立异步处理事务。 九,MySQL Cluster
NDB 是一种内存性的存储引擎,使用 Sarding-Nothing 的无共享的架构。Sarding-Nothing 指的是每个节点有独立的处理器,磁盘和内存,节点之间没有共享资源完全独立互不干扰,节点之间通过告诉网络组在一起,每个节点相当于是一个小型的数据库,存储部分数据。这种架构的好处是可以利用节点的分布性并行处理数据,调高整体的性能,还有就是有很高的水平扩展性能,只需要增加节点就能增加数据的处理能力。
其中数据节点会存储集群中的数据分区和分区的副本,来看下 节点组(Node Group): 一组数据节点的集合。节点组的个数= 比如有集群中 4 个节点,副本数为 2(对应 NoOfReplicas 的设置),那么节点组个数为2。 另外,在可用性方面,数据的副本在组内交叉分配,一个节点组内只有要一台机器可用,就可以保证整个集群的数据完整性,实现服务的整体可用。 分区(Partition): 副本(Replica):分区数据的备份,有几个分区就有几个副本,为了避免单点,保证 栗如,上面的例子,有四个数据节点(使用ndbd),副本数为2的集群,节点组被分为2组(4/2),数据被分为4个分区,数据分配情况如下: 分区0(Partition 0)保存在节点组 0(Node Group 0)中,分区数据(主副本 — Primary Replica)保存在节点1(node 1) 中,备份数据(备份副本,Backup Replica)保存在节点2(node 2) 中; 分区1(Partition 1)保存在节点组 1(Node Group 1)中,分区数据(主副本 — Primary Replica)保存在节点3(node 3) 中,备份数据(备份副本,Backup Replica)保存在节点4(node 4) 中; 分区2(Partition 2)保存在节点组 0(Node Group 0)中,分区数据(主副本 — Primary Replica)保存在节点2(node 2) 中,备份数据(备份副本,Backup Replica)保存在节点1(node 1) 中; 分区3(Partition 2)保存在节点组 1(Node Group 1)中,分区数据(主副本 — Primary Replica)保存在节点4(node 4) 中,备份数据(备份副本,Backup Replica)保存在节点3(node 3) 中; 这样,对于一张表的一个 Partition 来说,在整个集群有两份数据,并分布在两个独立的 Node 上,实现了数据容灾。同时,每次对一个 Partition 的写操作,都会在两个 Replica 上呈现,如果
1、99.999%的高可用性; 2、快速的自动失效切换; 3、灵活的分布式体系结构,没有单点故障; 4、高吞吐量和低延迟; 5、可扩展性强,支持在线扩容。
1、存在很多限制,比如:不支持外键,数据行不能超过8K(不包括BLOB和text中的数据); 2、部署、管理、配置很复杂; 3、占用磁盘空间大,内存大; 4、备份和恢复不方便; 5、重启的时候,数据节点将数据 load 到内存需要很长时间。 十,MySQL Fabric
1、高可用; 2、使用数据分片的横向功能。
同时,每一个分片组,可以又多个一个服务器组成,构成主从结构,当主库挂掉的时候,又会重新在从库中选出一个主库。保证节点的高可用。
缺点 事务及查询只支持在同一个分片内,事务中更新的数据不能跨分片,查询语句返回的数据也不能跨分片。 总结1、 2、 3、 4、 5、 6、MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master(双主)复制,可以说是 MySQL 主主复制管理器; 7、 8、 9、 10、 |
原文地址:https://blog.csdn.net/echizao1839/article/details/131634231
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://www.msipo.com/article-151.html 如若内容造成侵权/违法违规/事实不符,请联系MSIPO邮箱:3448751423@qq.com进行投诉反馈,一经查实,立即删除!
Copyright © 2024, msipo.com