关于四个数据库扩展解决方案

文摘   2024-07-28 07:30   云南  

背景

      一个直观的、用户友好的用户界面的应用程序。但是,如果你的应用程序遇到性能负载问题,这将使你的终端客户在使用它时感到沮丧。很有可能问题不在应用程序内部,而是在数据库。根据一项调查,38%的数据库专业人员报告说数据库停机是让他们夜不能寐的重要问题。停机可能是由于任何数量的问题,包括不当的数据库配置、不良的负载处理、数据库查询超时,等等。在这篇文章中,我们将讨论你是否需要扩展你的数据库以及如何解决数据库的可扩展性问题。让我们从最明显的问题开始--为什么要进行数据库扩展?

为什么要扩展你的数据库?


      应用程序的数据库应该能够扩展或收缩其计算资源,以配合应用程序的动态需求。例如,你的数据库应该能够扩大规模以处理突然激增的流量。另外,当不在状态时,你的数据库应该能够收缩以节省资源。确保良好的数据库扩展性的最好方法之一是根据你的要求选择合适的数据库。对于物理服务器,数据库的扩展和收缩可能是一个令人头痛的问题。云数据库解决方案可以做到这一点。

数据库的可扩展性是一项资源密集型和挑战性的任务。因此,在开始项目之前,你需要确保你的产品需要一个可扩展的数据库。首先,确定产品在可预见的未来是否会出现流量激增的情况。如果没有,仍然可以用你的旧数据库来做。如果是一个初创企业,那么在获取可扩展数据库方面投入资源是没有意义的。你可以在你的应用程序达到临界质量并期待流量的良好激增时再这样做。

下面是一些需要数据库可扩展性的情况:

应用已经过时了,你想迁移到云系统上
应用程序经历高负荷
应用程序需要符合法规的要求
希望有一个平衡的工作负载,可以为世界各地的用户提供服务

数据库扩展解决方案


一. 缓存数据库查询


提高数据库负载处理能力的最直接的方法之一是缓存数据库查询。通常情况下,一个应用程序只有少数几个查询构成了大部分的请求。你可以对这些查询进行缓存,这样在将来,这些请求就可以从缓存中读取。这样就不需要每次都从数据库中获取数据了。用户很快就能得到所需的数据。这样一来,缓存有助于提高数据库的性能。

亚马逊ElastiCache是一种缓存服务,可以帮助你缓存数据库。有了Amazon ElastiCache,你可以通过内存缓存进行扩展。Amazon ElastiCache支持实时用例。以下是Amazon ElastiCache的理想用例:

游戏排行榜
分析
流媒体

缓存的基本原理是将频繁访问的数据存储在一个快速访问的介质(如内存)中,以减少数据库的负载和响应时间。具体来说:

  • 缓存命中:
    当应用程序请求数据时,首先检查缓存是否有对应的数据。如果缓存中有数据(命中),则直接返回缓存中的数据。

  • 缓存未命中:
    如果缓存中没有数据(未命中),则从数据库中查询数据。将查询到的数据存储在缓存中,以备下次请求使用。

  • 缓存失效:
    缓存中的数据通常会设置一个过期时间(TTL),以保证数据的新鲜度。过期的数据会被自动移除或更新。

  • 缓存更新:
    当数据库中的数据发生变化时,需要同步更新缓存中的数据,以保证数据一致性。通过以上方式,可以有效地提高应用程序的性能和可扩展性。


Amazon ElastiCache 的一些关键特点:

1) 完全托管服务
自动化管理:ElastiCache 提供自动化的管理功能,包括硬件设置、配置、软件修补、监控和故障修复。高可用性:支持多可用区部署和自动故障转移,以提高服务的可靠性和可用性。

2) 高性能和低延迟
内存存储:数据存储在内存中,提供亚毫秒级的延迟,适合高性能和低延迟的应用场景。水平扩展:通过分片(sharding)来分布数据和负载,实现水平扩展,满足高吞吐量需求。

3) 可扩展性
弹性伸缩:支持在线扩展和缩减缓存集群,满足动态变化的工作负载需求。多节点集群:可以配置多节点集群,以提高可用性和吞吐量。

4) 安全性
VPC 集成:可以在 Amazon VPC 内部署,提供网络隔离和访问控制。加密:支持静态和传输中的数据加密,确保数据安全。

5) 兼容性
Redis 和 Memcached:完全兼容开源 Redis 和 Memcached,便于迁移现有应用程序。丰富的功能:支持 Redis 的高级功能,如数据持久化、发布订阅、Lua 脚本和 Redis Cluster。

6) 监控和管理
Amazon CloudWatch 集成:可以使用 Amazon CloudWatch 监控缓存集群的性能指标,并设置警报。自动备份和恢复:支持自动备份和恢复功能,确保数据的持久性和可靠性。

7)高可用性和故障转移
Multi-AZ 部署:支持多可用区部署,通过主从复制实现高可用性。自动故障转移:在节点故障时,ElastiCache 可以自动执行故障转移,最小化停机时间。


二. 数据库索引Index


     扩展数据库并不总是意味着在现有设置中增加更多的数据库。有时,通过优化当前的数据库,你可以在一定程度上进行扩展。这就是数据库索引发挥作用的地方。使用数据库索引技术,你正在构建数据,以提高从数据库表中检索数据的速度。

数据库索引的原理
定义:数据库索引是一种数据结构,用于提高数据库查询的速度。它类似于书籍的索引,通过快速定位数据的位置,减少查询所需的时间。

数据结构:
B-树(B-Tree)索引:最常见的索引类型,适用于大多数情况。B-树索引保持数据的排序,可以快速执行查找、插入、删除和范围查询操作。
哈希索引(Hash Index):基于哈希表实现,适用于精确匹配查询,但不适合范围查询。
全文索引(Full-Text Index):用于全文搜索,可以快速搜索文本字段中的关键词。
空间索引(Spatial Index):用于地理数据的快速查询。

工作原理:
查找:通过索引结构快速定位所需数据的位置,减少全表扫描的时间。
维护:在数据插入、更新和删除时,索引需要进行相应的维护,以保持数据结构的有效性和性能。

索引与数据库扩展的相关性

提高查询性能:
索引可以显著提高查询性能,尤其是在处理大量数据时。通过使用索引,可以避免全表扫描,减少I/O操作,提升查询速度。

减少缓存压力:
由于索引加快了查询速度,减少了数据库缓存的压力。高效的查询意味着更少的缓存命中和缓存失效,进一步提升整体系统性能。

三. 数据复制Replication


MySQL复制


数据复制是一种策略,用于制作相同的数据库副本以创建额外的机器。复制策略有利于解决峰值负载问题。由于数据被复制,查询可以分散在多个数据库中,这反过来会减少单个数据库的负载。此外,万一存储设备发生故障,复制的数据就会派上用场,系统仍然可以全面运作。

MySQL数据复制(Replication)

    MySQL数据复制是实现高可用性和可扩展性的关键技术之一,通过将数据从一个MySQL服务器(主服务器)复制到一个或多个MySQL服务器(从服务器)来实现。以下是MySQL数据复制的原理以及一些流行的开源项目解决方案:

MySQL数据复制的原理

主从复制(Master-Slave Replication):

主服务器:处理写操作(插入、更新、删除),并将这些操作记录到二进制日志(binary log)中。

从服务器:读取主服务器的二进制日志,并重放这些日志以使数据保持同步。

复制过程:

步骤1:记录二进制日志:主服务器在执行写操作时,将这些操作记录到二进制日志文件中。

步骤2:读取二进制日志:从服务器通过IO线程连接到主服务器,并读取二进制日志。

步骤3:重放二进制日志:从服务器的SQL线程将读取到的二进制日志重放,从而使数据与主服务器同步。

复制类型:

异步复制(Asynchronous Replication):从服务器异步读取和重放二进制日志,存在一定延迟。

半同步复制(Semi-Synchronous Replication):主服务器在提交事务时,至少等待一个从服务器确认接收到日志,以减少数据丢失风险。

同步复制(Synchronous Replication):所有从服务器都必须确认接收到日志后,主服务器才能提交事务,确保数据一致性但性能较低。

GTID(全局事务标识符,Global Transaction Identifier):

GTID是一种全局唯一的事务标识符,用于简化复制的管理和故障恢复。

每个事务都有一个唯一的GTID,从服务器通过GTID来确保事务按顺序重放。

行业内的MySQL项目解决方案

1)MySQL Group Replication:

MySQL官方提供的高可用性和可扩展性解决方案。
支持多主复制、自动故障转移和分布式事务。
结合了复制和分布式一致性协议(Paxos),确保数据一致性和高可用性。

2) Percona XtraDB Cluster (PXC):

基于Galera Cluster的Percona解决方案。
提供同步复制、自动故障转移和读写扩展。
适用于高可用性和高性能的数据库集群。

3) MariaDB Galera Cluster:

基于Galera Cluster的MariaDB解决方案。
提供多主复制、同步复制和自动故障转移。
适用于需要高可用性和一致性的应用场景。

4) Vitess:

开源的分布式数据库解决方案,最初由YouTube开发。
通过分片(Sharding)实现MySQL数据库的水平扩展。
提供复制、故障转移和自动化管理功能,适用于大规模分布式系统。

5) MaxScale:

MariaDB提供的数据库代理(Proxy)解决方案。
支持读写分离、负载均衡和高可用性。
通过MaxScale,可以轻松实现主从复制和故障转移。

6)阿里巴巴的Canal

Canal是一种基于MySQL二进制日志(binlog)的增量订阅和消费组件,主要用于实现数据库的实时同步和数据集成。以下是对Canal方案的评价,包括其特点、优点、缺点和适用场景。

Canal的特点

基于MySQL Binlog:

Canal模拟MySQL从服务器协议,获取MySQL的二进制日志。
支持多种MySQL版本和分支,如MySQL、MariaDB、Percona等。

实时数据捕获:

可以实时捕获MySQL数据库的变更数据,包括插入、更新、删除操作。适用于对实时性要求高的应用场景。

数据解析和格式化:

Canal解析binlog日志,并将其转换为通用的事件格式。可以输出JSON、Avro等多种格式,便于数据处理和消费。

高扩展性:

支持水平扩展,可以部署在多台服务器上,实现高吞吐量的数据捕获和处理。提供多种消息队列的集成(如Kafka、RocketMQ),便于数据的进一步处理和传输。

Canal的优点

高实时性:

Canal能够实时捕获并解析MySQL的binlog日志,保证数据变更的低延迟同步。适用于需要实时数据处理和分析的场景,如实时数据仓库、实时监控和报警等。

兼容性强:

支持多种MySQL版本和分支,适应性强。兼容多种数据格式和消息队列,便于集成和使用。

易于扩展:

Canal可以部署在多个节点上,实现负载均衡和高可用性。支持插件机制,可以根据需要扩展功能和数据处理逻辑。

社区活跃:

Canal是一个开源项目,拥有活跃的社区支持,文档齐全,使用和维护相对简单。

Canal的缺点

学习曲线:

虽然Canal的基本使用相对简单,但要完全理解其内部机制和优化配置,仍需要一定的学习成本。尤其是在处理复杂数据解析和高并发场景时,需要深入了解其工作原理和最佳实践。

依赖性:

Canal依赖MySQL的binlog日志,因此需要开启binlog,并且可能会增加一定的存储和I/O负担。对于某些数据库操作,如DDL操作,Canal的处理能力可能有限,需要额外的处理逻辑。

监控和运维:

Canal本身没有提供非常完善的监控和运维工具,需要结合其他工具和平台进行监控和管理。在大规模部署时,运维复杂度可能增加,需要投入更多的资源进行维护。

国产数据库复制方案

以达梦数据库为例

1) 使用达梦数据库的自带工具

达梦数据库本身提供了一些数据同步工具,可以用于数据库之间的数据同步。

DMDSync(达梦数据同步工具):
功能:实现达梦数据库与其他数据库(包括达梦、Oracle、MySQL等)之间的数据同步。
优势:专门为达梦数据库设计,支持达梦数据库的各种特性和功能。

实现步骤:
配置数据源和目标数据库。设置同步规则和策略。启动同步任务。

2) 使用Apache Kafka + CDC工具

利用Apache Kafka和其他开源的CDC(Change Data Capture)工具,可以实现达梦数据库的数据同步。

Debezium:

功能:Debezium是一个开源的CDC平台,可以捕获数据库的变更并将其推送到Kafka。
限制:目前Debezium不直接支持达梦数据库,但可以通过扩展和自定义实现支持。

实现步骤:
设置Kafka:部署Kafka集群,用于接收和传输数据变更。
自定义CDC连接器:编写自定义的Debezium连接器,捕获达梦数据库的变更数据。
推送数据到Kafka:将捕获的变更数据推送到Kafka。
消费数据:在目标系统中消费Kafka中的数据,并应用变更。

3) 使用ETL工具

利用开源或商业的ETL(Extract, Transform, Load)工具,可以实现达梦数据库的数据同步。

Apache Nifi:
功能:Nifi是一个强大的数据集成工具,支持各种数据源和目标。

实现步骤:
配置数据源:在Nifi中配置达梦数据库作为数据源。
配置数据目标:配置目标数据库(如MySQL、PostgreSQL等)。
定义数据流:定义从达梦数据库到目标数据库的数据流,包括数据提取、转换和加载。
启动数据流:启动并监控数据流,确保数据实时同步。

Talend:

功能:Talend是一个功能强大的数据集成工具,支持广泛的数据源和目标。
实现步骤:
配置数据源和目标:在Talend中配置达梦数据库和目标数据库。
设计数据流:使用Talend的图形化界面设计数据同步任务。
运行任务:执行同步任务,实现数据实时或定期同步。

四. 数据分片Sharding


扩展数据库的主要瓶颈之一是设计不当的数据库。为了确保你不面临这个瓶颈,必须从为正确的业务应用选择正确的数据库开始。比如:

一家银行应该选择关系型DBMS,以确保其结构化数据的ACID(原子性、一致性、隔离性、耐久性)。
一个在线多人游戏可以依靠键值无SQL数据库


数据分片


无论你选择哪个数据库,都要确保它有分片功能。分片是指将数据库的一个大块分割成较小的数据块,称为分片,可以跨多个数据库存储。有两种类型的分片:

水平分片
垂直分片


垂直分片


当你的数据库查询返回一个数据行的子集时,水平分片证明是有效的。这些行通常被分组。例如,数据被过滤的查询是基于短的日期范围。当你的数据库查询返回数据的列的子集时,垂直分片证明是有效的。例如,如果一些数据库查询只要求名字,而另一些只想要城市,那么垂直分片在这种情况下证明是有效的。

分片有两个主要优势:

系统的整体存储容量与数据库分片的数量成正比。
如果一个分片脱机,你仍然可以依靠分片池来检索和存储你的数据。当一个分片脱机时,目前只有整体数据集的一部分不可用。因此,它不会对系统的运行产生重大影响。

行业实例

TiDB

1. TiDB 数据分片的基本概念

数据分片(Sharding) 是将大规模的数据拆分成多个更小的、独立的部分,每个部分称为一个“分片”。每个分片可以存储在不同的物理节点上,以实现水平扩展和高可用性。

TiDB存储

2.TiDB 分片方案的实现

TiDB 使用了一种称为“Region”的数据分片机制,将数据分片并分布到集群中的不同节点上。

2.1 Region

定义:Region 是 TiDB 中的最小数据分片单元,默认大小为 96MB。

分割与合并:当一个 Region 的数据量超过设定阈值(默认 96MB)时,它会自动分裂为两个新的 Region;当两个相邻的 Region 的数据量很小且总和小于阈值时,它们会合并为一个 Region。

2.2 Raft 协议

TiDB 使用 Raft 共识算法来保证数据的一致性和高可用性。每个 Region 由多个副本(通常为 3 个)组成,通过 Raft 协议在不同的物理节点之间进行同步。

Leader:每个 Region 在集群中有一个 Leader 副本,负责处理读写请求。
Follower:其他副本称为 Follower,负责接收 Leader 的日志并应用到本地数据副本。
选举:如果 Leader 副本发生故障,会通过 Raft 协议选举新的 Leader,确保高可用性。

2.3 PD(Placement Driver)

PD 是 TiDB 集群的管理模块,负责调度和管理 Region:
Region 分裂和合并:管理 Region 的分裂和合并过程。
负载均衡:通过调度 Region,保证各节点的负载均衡。
Leader 分配:为每个 Region 分配 Leader 副本,优化读写性能。

3. 数据分片策略

TiDB 的数据分片策略基于表的主键或者唯一索引:
范围分片:根据主键或唯一索引的范围进行分片。每个 Region 负责一部分范围的数据。
散列分片:对于使用 AUTO_INCREMENT 或 AUTO_RANDOM 的主键,TiDB 可以根据散列值进行分片,避免数据热点。

4. 分片与高可用性

TiDB 通过多副本和 Raft 协议保证数据的高可用性:

多副本机制:每个 Region 有多个副本,分布在不同的节点上,保证单点故障不会导致数据丢失。
自动故障恢复:当某个副本失效时,TiDB 会自动在其他节点上创建新的副本。
Leader 迁移:当节点负载不均衡或故障时,PD 可以迁移 Leader 副本,保证集群的稳定性和高性能。

5. 数据访问与路由

TiDB Server:处理客户端的 SQL 请求,生成执行计划并与 TiKV 交互。
TiKV:分布式存储引擎,存储实际的数据和索引。
PD:提供路由信息和元数据管理。

TiDB Server 在处理查询时,会根据 PD 提供的路由信息定位数据所在的 Region,从而与相应的 TiKV 节点进行交互。

6. 优化与调优

TiDB 的分片方案通过以下方式进行优化:

负载均衡:PD 持续监控集群的负载情况,并动态调整 Region 分布,以均衡负载。
热点数据处理:对于访问频率高的热点数据,通过动态调整 Leader 副本和拆分 Region 来缓解压力。
多级缓存:利用多级缓存机制,加速数据访问,减少磁盘 I/O。


Apache Doris

Apache Doris 是一个现代化的 MPP(大规模并行处理)数据库,主要用于实时分析和报表查询。它采用了分布式存储和计算架构,数据分片是其核心机制之一。

Doris存算分离架构

Apache Doris 数据分片原理

数据分片(Sharding):

数据在 Apache Doris 中被划分为多个分片(Tablet),每个 Tablet 是一个数据存储的基本单元。
每个表的数据根据用户定义的分区和分桶策略进行分片。

分区(Partitioning):
分区是根据指定的列(如日期列)将数据划分成不同的部分,每个部分可以存储在不同的 Tablet 中。
分区可以是按范围(Range Partitioning)或按列表(List Partitioning)。

分桶(Bucketing):
分桶是在每个分区内部进一步将数据划分为多个桶(Bucket),每个桶对应一个 Tablet。
分桶是根据哈希算法(Hash Partitioning)将指定列的值进行哈希后划分到不同的桶中。

Replica:
为了实现高可用性和数据冗余,每个 Tablet 可以有多个副本(Replica),分布在不同的物理节点上。
默认情况下,每个 Tablet 有 3 个副本。

负载均衡:

Apache Doris 会自动监控各个节点的负载情况,并在需要时进行 Tablet 的迁移和重新分布,以实现负载均衡。


阿里云RDS

RDS 自动性能扩展流程

OceanBase

OceanBase 作为分布式数据库,内部把多台机器统一规划为一个资源池,资源池中又可以进一步划分一个个隔离的资源组,每个资源组就形成了一个租户的概念。租户的存在,带来数据库扩容和缩容多级弹性调整的第一级。因为租户是 OceanBase 内部资源的划分,对租户规格的调整不涉及物理层面的资源调整,完全由 OceanBase 内核完成。这就使得 OceanBase 租户规格的调整,可以秒级生效,整个过程对应用完全无感知。

OceanBase 弹性伸缩:租户规格的调整

MySQL 数据库扩容的过程就是一个主备切换的过程,会对业务有闪断的影响。而 OceanBase 是通过 Paxos 协议进行节点间的数据同步,Paxos 协议核心点是自选举,一份数据的三个副本投票表决出谁来当选 Leader,以及该日志是否提交。

OceanBase 节点间的数据同步

结论


    数据库是任何应用程序的一个重要元素。如果你想扩展你的应用程序,你不能不扩展数据库。幸运的是,由于近年来的技术进步,我们拥有所有需要的工具,使扩展过程无缝和毫不费力。人们可以利用云服务提供商,如Azure、AWS或谷歌云来扩展他们的应用程序。然而,在进入可扩展性之前,人们需要考虑某些因素。希望这篇文章能让你很好地理解与扩展相关的基本问题以及如何解决它们。


Megadotnet
为您介绍各体系平台的新闻,系统研发相关框架,组件,方法,过程,运维,设计。企业IT与互联网信息系统或产品解决方案。开源项目,项目管理。
 最新文章