数据库系列:数据库高可用及无损扩容

数据库,系列,可用,无损,扩容 · 浏览次数 : 394

小编点评

**数据库存储层实现可用性** **1. 高可用架构** * 使用 双主或主从同步 + keepalived + vip 的模式来保证存储层的好可用性。 * 分片分库模式下的高可用性可以继续从2.3演化出分片分库模式下的高可用架构。 **2. 可扩展性** * 使用多个数据库实例来存储数据,以便在需要时扩展处理量。 * 使用多主复制的模式实现高可用性。 * 使用 分片分库模式可以根据流量进行自动扩展。 **3. 可恢复** * 使用主从或主主 + Keepalived 架构实现全面的可恢复性。 * 使用分片分库模式可以实现部分可恢复性。 **4. 可平滑扩容** * 通过增加数据库分片来平滑扩容数据库。 * 通过添加新的数据库实例来平滑扩容数据库。 * 通过使用无损、透明、平滑的数据库扩容技术实现数据库扩容。 **5. 总结** * 数据库存储层实现可用性有很多种办法,包括主从、分片、多主复制、分片分库等。 * 选择最适合项目的架构取决于具体需求。

正文

1 背景

在大型互联网场景中,数据库的高可用性显得尤为重要,为了保证稳定性,一般需要采用强化的架构模式,以保证数据层能够提供持续有效的稳定支撑。

2 高可用架构的基本演进过程

2.1 基本的数据库架构

每个服务对应一个存储服务实例(基本是数据库单实例模式),使用 IP+Port 进行连接和调用,这就是大家常见的数据库直连。
image
用户计算服务(svc) 配置IP+端口指向数据库实例地址,进行访问和操作。

2.1 Scale Up + Scale Out 模式

互联网场景下,理论上访问量和数据量都是不断膨胀的过程。随着数据量的增大,数据库一般要进行纵向(Scale Up)和 横向(Scale Out) 的拆分,
分库分表之后可能会将数据拆分到不同的数据库实例,甚至不同的IDC上,这样可以 降低数据量,提高执行性能的目的。详细参考笔者这篇《MySQL全面瓦解28:分库分表》。

image

如上图,库表拆分之后,使用不同的条件可以路由到不同的IP,这样来实现业务上的数据隔离,这种条件可以是用户的角色,业务的类别,
甚至直接对数据取模或者hash,只要确保链接到对应的数据库上即可。这边举个例子:(value % 2 == 0) = condition1,(value % 2 == 1) = condition2

2.3 主从或主主 + Keepalived 架构

以上只是解决了数据库大容量的问题,将数据库的风险降低,性能提升。并没有实质的解决可用性问题,如果其中一个数据库实例出现故障,
依然会造成大面积的不可用。
在互联网架构中,比较常见的一种方式就是,使用 双主或者主从同步 + keepalived + vip的模式来保证存储层的好可用性:
image
如上图,两个库(主主或者主从)使用相同的虚拟IP,当主库挂掉的时候,虚ip自动转移到另一个主库(或者转移到从库上,并将从库切为主库),这个切换过程对业务应该是透明无感的,也不会造成使用上的异常,以此保证数据库的高可用性。

2.4 分片分库模式下的高可用性

可以继续从2.3演化出分片分库模式下的高可用架构,如下:
image
如果数据库继续膨胀,流量继续扩展,还可以继续扩容,找到最恰当的分片模式。

2.5 其他常见的高可用模式

2.5.1 MHA

MHA(Master High Avaliable) 是一款 MySQL 开源高可用程序,MHA 在监测到主实例无响应后,会自动将同步最靠前(即数据偏移量最少)的 Slave 提升为 Master,然后其他所有的 Slave 重新指向新 Master。架构模式如下:
image

2.5.2 PXC

PXC(Percona XtraDB Cluster)是一种开源的 MySQL 高可用解决方案。它将 Percona Server、Percona XtraBackup 与 Galera 库集成在一起,以实现多主复制的 MySQL 集群。
缺点是只支持InnoDB引擎模式,且多主数据同步必然会有性能损耗、同步延迟和数据差异风险。
另外,这种多主同步模式具有典型的木桶效应,系统的吞吐被最差的节点左右。
架构如下:
image

2.5.3 MGR/InnoDB Cluster

MySQL 5.7 退出了高可用的的模式 MGR(MySQL Group Replication),他具备了多节点数据写入和强一致性的特点,这一点跟与 PXC 相似。同时采用Group Communication System(GCS协议)进行数据同步来保证消息的原子性。
MGC需要使用到InnoDB Cluster模式,才能实现真正的高可用,高可用架构图参考下面:
image
备注:图片来自官网,就不再画了。

2.6 高可用模式下的平滑扩容

互联网大流量场景下我们经常会发现存储层容易出现瓶颈,这个时候就需要扩容。
相对于停服扩容来说,无损、透明、平滑的数据库扩容才是我们实际追求的目标。
image
步骤如下:

  • 增加数据库分片3,进行数据架构初始化和数据同步
  • 增加数据库主从配置,将2个库的数据库配置,改为3个库的数据库配置,并注意旧库与新库的映射关系。
  • 服务层 reload(重新加载)配置,完成扩容工作。
  • 删除分片之后的冗余数据,必要的话进行数据库缩容。
  • 服务层根据条件映射到不同的数据库实例中。

3 总结

数据库存储层实现可用性有很多种办法。除了最基本的 主从/主主 + Keepalived 架构 之外,还有 MHA 、 PXC 、MGR/InnoDB Cluster 等,后面我们一一拆解。
实现高可用,意味着后续的迁移、扩容、业务调整,都应该是可以平滑的,对业务无感的。

与数据库系列:数据库高可用及无损扩容相似的内容:

数据库系列:数据库高可用及无损扩容

# 1 背景 在大型互联网场景中,数据库的高可用性显得尤为重要,为了保证稳定性,一般需要采用强化的架构模式,以保证数据层能够提供持续有效的稳定支撑。 # 2 高可用架构的基本演进过程 ## 2.1 基本的数据库架构 每个服务对应一个存储服务实例(基本是数据库单实例模式),使用 IP+Port 进行连

数据库系列16:MyISAM与InnoDB的索引对比

相关文章 数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩容 数据库系列:使用高区分度索引列提升性能 数据库系列:前缀索引和索引长度的取舍 数据库系列:MyS

[转帖]perf学习-linux自带性能分析工具

存储技术为满足层出不穷应用的海量数据存储需求,从物理介质到技术架构也同样发生了天翻地覆的变革。无论技术如何更新换代,其目的都是为了更好的提供高性能,高容量,高可用的数据服务。本系列文章会对存储系统的测试和调试工具做一个介绍。 dd - Linux世界中的搬运工 FIO – IO压力测试工具 vdbe

GaussDB技术解读系列之应用无损透明(ALT)

当数据库集群的某个节点由于故障无法对外提供服务,若此时集群内还存在其它可用节点,则将故障节点上的会话连接自动迁移到目标节点上,客户端无需再次发出连接请求,仍然可以继续执行数据库操作。

Blazor前后端框架Known功能介绍:系统安装激活及自定义

本章介绍系统安装与激活及其自定义功能。 ## 概述 - 框架内置简单的系统安装功能。 - 录入企业编码、名称、系统名称、产品密钥、管理员密码信息完成安装。 - 可自定义高级安装功能,如安装数据库等您产品所需的安装信息。 - 框架默认无需注册产品密钥,若产品需要安装产品密钥进行激活,可进行自定义。 -

[转帖]一致性哈希 和 Redis 集群分槽

前言 伴随着系统流量的增大,出现了应用集群。在 Redis 中为了保证 Redis 的高可用也为 Redis 搭建了集群对数据进行分槽存放。在 Mysql数据库要存储的量达到一个很高的地步的时候,我们会对数据库进行分库分表操作。OK,到这儿先假设我们不知道什么是集群、什么是分库分表,我们先来看一个数

MQ系列8:数据存储,消息队列的高可用保障

MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系列6:消息的消费 MQ系列7:消息通信,追求极致性能 1 介绍 在之前的章节中,我们介绍了消息的发送

MQ系列9:高可用架构分析

MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系列6:消息的消费 MQ系列7:消息通信,追求极致性能 MQ系列8:数据存储,消息队列的高可用保障 1

Redis系列8:Bitmap实现亿万级数据计算

Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5:深入分析Cluster 集群模式 追求性能极致:Redis6.0的多线程模型 追求性能极致:客户端缓

Redis系列10:HyperLogLog实现海量数据基数统计

Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5:深入分析Cluster 集群模式 追求性能极致:Redis6.0的多线程模型 追求性能极致:客户端缓