业务飞速发展导致数据规模急速膨胀,单机的数据库已经无法满足互联网业务的发展。
传统的将数据集中存储单一数据结节的方案,在容量、性能、可用性和可维护性方面已经难以满足互联网海量数据的场景。
从容量方面考虑,单机数据库容量有限,难以扩容。
从性能方面来说,由于关系型数据库大多数采用B+树类型索引,在数据量超过一定的阈值后,索引的深度增加导致对磁盘的随机IO次数增加,进而导致性能问题。
从可用性方面来说,服务通常设计成无状态的,这必然导致系统的存储压力都集中在数据库层面,而单一的数据节点,或者简单的主从架构,已经越来越难以承担。
从运维角度来看,当数据都集中在一个节点上时,数据备份和恢复的时间成本也随之数据量上升变得不可控。同时数据丢失导致影响的范围也会被放大。
主从复制
binlog日志格式
2000年,MySQL3.23.15版本引入复制功能,采用异步复制的方式,当网络或者机器故障,会导致数据不一致。
半同步复制
2010年, MySQL 5.5版本引入半同步复制, 半同步复制是指只要一个salve节点返回ack,master节点就可以提交事务了,保证数据库至少有一个节点完成了数据的同步。
组复制
2016年,MysQL在5.7.17中引入InnoDB Group Replication,该方案基于paxos协议实现组内复制,保证数据一致性,paxos协议核心在于过半选举。
主从复制的问题
高可用意味着,更少的服务不可用的时间,一般用SLA(服务级别协议)衡量。
1年 = 365天 = 8760小时
99 = 8760 * 1% = 8760 * 0.01 = 87.6小时
99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
为什么要做高可用?通过故障转移,提供failover的能力,加上业务侧连接池的心跳重试,实现断线重连,业务不间断,降低RTO(Recovery Time Objective,复原时间目标)和RPO(Recovery Point Objective,复原点目标)。
常见的策略:
即如果主节点宕机,手动将某个从节点修改成主节点。
存在的问题:
MHA全称叫做MySQL Master High Availability,是由Facebook工程师 Yoshinori Matsunobu开发的一款MySQL高可用框架,基于Perl语言开发,一般能在30秒内实现主从切换,切换时通过SSH复制主节点的日志信息。
MHA负责MySQL主库的高可用,当主库发生故障时,MHA会选择一个数量最接近原主库的候选节点作为新的主节点,并且补齐和之前宕机的Master差异的Binlog。数据补齐后,即将写VIP漂移到新的主库上。具体的架构图如下:
优点
缺点:
MGR是数据库支持的,只需要配置插件即可,如果主节点挂掉,将自动选择某个从改为主。无需人工干预,并且基于组复制(paxos算法),保证数据一致性。
MGR的特点
MySQL InnoDb Cluster,一个完整的数据库高可用解决框架,由多个组件组成
Orchestrator
一款MySQL高可用和复制拓扑管理工具,支持复制拓扑结构的调整,自动故障迁移和手动切换的功能等,直接拖拽UI,就可以实现主从切换。
分库分表分库分表通常是指垂直分库和水平分表,对于垂直分表其实就是将宽表拆分成小表,没有太多的技术挑战,这里侧重讲讲垂直分库和水平分表。
垂直分库垂直分库是指将数据库进行纵向切分,通常按照业务的维度进行划分。
如典型的微服务的架构,将系统按照业务维度垂直拆分,划分成多个服务。如一个电商网站可以拆分成:订单、商品、会员、支付等服务。
垂直分库后业务更加单纯,职责单一,同时可以解决部分数据库容量问题,但是同时也引入了新的技术复杂度,如下:
水平分表是指,将表按照某种规则分成多张表,拆分后的表结构和拆分前完全一致,但是数据分散到多张表中,也可以成为数据分片。
通过水平分表,解决了单表的容量和性能问题。但同时,水平分表后,引入了新的技术复杂度,主要有以下几点:
从单节点数据库到主从复制,再到数据库高可用,再到分库分表,很好的解决了数据的性能、容量、高可用、运维性等问题,但是会带来分布式事务、复杂SQL难以操作、SQL路由等问题。
架构设计应该遵循:"简单性"、"合适性"、"演化性"的原则,符合当前的业务发展,所以系统设计没有必要一上来就考虑分库分表,而应该是数据量达到一定的量,出现性能瓶颈的时候再对系统进行改造和优化。
原文链接:https://juejin.cn/post/6932298813453369358
如果觉得本文对你有帮助,可以关注一下我公众号,回复关键字【面试】即可得到一份Java核心知识点整理与一份面试大礼包!另有更多技术干货文章以及相关资料共享,大家一起学习进步!