写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下!
GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master
一.什么是高可用性
高可用性=可靠性,它的本质就是通过技术和工具提高可靠性,尽可能长时间保持数据可用和系统运行,实现高可用性的原则,首先要消除单点故障,其次通过冗余机制实现快速恢复,还有就是实现容错。
二.我们在考虑数据库的高可用方案时,应该考虑几个方面
1.若数据库发生了宕机或者意外中断等故障,能够尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的中断而中断
2.用作备份,只读副本等功能的非主流节点的数据应该和主节点的数据实时或者始终保持一致
3.当业务发生数据库切换的时候,切换前后的数据库的内容应该保持一致,不会因为数据缺失或者数据不一致而影响业务
三.高可用方案
1.主从复制
2.半同步复制
3.MHA+多节点集群
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
- MHA Manager: 可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
- MHA Node: 行在每台MySQL服务器上。
MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
MHA Node运行在每台MySQL服务器上,主要作用是切换时处理二进制日志,确保切换尽量少丢数据。
MHA也可以扩展到如下的多节点集群:
优点:
- 可以进行故障的自动检测和转移;
- 可扩展性较好,可以根据需要扩展MySQL的节点数量和结构;
- MySQL发生不可用的概率相对更低
缺点:
- 逻辑较为复杂,发生故障后排查问题,定位问题更加困难;
- 数据一致性仍然靠原生半同步复制保证,仍然存在数据不一致的风险;
- 可能因为网络分区发生脑裂现象;
4.MGR
MySQL官方推荐的一款高可用集群方案MySQL Group Replication,基于Paxos协议的状态机复制,彻底解决了基于传统的异步复制和半同步复制中数据一致性问题无法保证的情况,也让MySQL数据库涉及的领域更广,打开互联网金融行业的大门。
MGR提供了高可用分布式MySQL数据库服务,它可以实现服务器自动故障转移,分布式容错能力,支持多主更新的架构,自动重配置()加入/移除节点,崩溃等),并且可以自动侦测和处理冲突。
MGR适用的场景包括:
(1)弹性复制:复制架构下,服务器的数量动态增加或缩减时,使影响降到最低。
(2)分片高可用:用户可以利用MGR实现单一分片的高可用,每个分片都具有一个复制组。
(3)主从复制的替代选择:可以使用单主模式避免发生冲突检测,以替代传统的主从复制。
下图为MGR的架构图:
下边分别介绍里边的内容:
MySQL Group Replication插件
该插件主要负责:
- 维护分布式执行内容
- 侦测和处理冲突
- 处理分布式集群的恢复(侦测成员的变化,在必要时作为贡献者提供数据,在必要时收集状态)
- 推送事务给其他组员
- 接受其他成员的事务并处理
- 决定事务最终的结果(提交/回滚)
5.zookeeper+proxy
Zookeeper使用分布式算法保证集群数据的一致性,使用zookeeper可以有效的保证proxy的高可用性,可以较好的避免网络分区现象的产生。
优点:
- 较好的保证了整个系统的高可用性,包括proxy、MySQL;
- 扩展性较好,可以扩展为大规模集群;
缺点:
- 数据一致性仍然依赖于原生的mysql半同步复制;
- 引入zk,整个系统的逻辑变得更加复杂;
欢迎关注微信公众号【慕容千语】