一个大型系统里各个环节中最容易出性能和可用性问题的往往是数据库,因此分布式设计与开发的一个重要领域就是如何让数据层具有可扩展性,数据库的扩展分为Scale Up 和Scale Out,而Scale Up说白了是通过升级服务器配置来完成,因此不在分布式设计的考虑之内。Scale Out是通过增加机器的方式来提升处理能力,一般需要考虑以下两个问题:
- 数据拆分
- 数据库高可用架构
数据拆分是最先会被想到的,原理很简单,当一个表的数据达到无法处理的时候,就需要把它拆成多个表,说起来简单,真正在项目里运用的时候有很多点是需要深入研究的,一般分为:
- 切分策略
- 与应用程序端的整合策略
切分策略
切分策略一般分为垂直切分、横向切分和两者的混搭。
1)垂直切分
垂直切分就是要把表按模块划分到不同数据库中,这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求。如下图所示:
其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝在架构不断演变过程,最重要的一环就是服务化改造,把用户、交易、店铺、宝贝这些核心的概念抽取成独立的服务,也非常有利于进行局部的优化和治理,保障核心模块的稳定性。这样一种拆分方式也是有代价的:
- 表关联无法在数据库层面做
- 单表大数据量依然存在性能瓶颈
- 事务保证比较复杂
- 应用端的复杂性增加
上面这些问题是显而易见的,处理这些的关键在于如何解除不同模块间的耦合性,这说是技术问题,其实更是业务的设计问题,只有在业务上是松耦合的,才可能在技术设计上隔离开来。没有耦合性,也就不存在表关联和事务的需求。另外,大数据瓶颈问题可以参见下面要将的水平切分。
2)水平切分
上面谈到垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题,而水平切分就是要把一个表按照某种规则把数据划分到不同表或数据库里。例如像计费系统,通过按时间来划分表就比较合适,因为系统都是处理某一时间段的数据。而像SaaS应用,通过按用户维度来划分数据比较合适,因为用户与用户之间的隔离的,一般不存在处理多个用户数据的情况,下面是一个比较简单的按user_id来水平切分的例子:
水平切分没有破坏表之间的联系,完全可以把有关系的表放在一个库里,这样就不影响应用端的业务需求,并且这样的切分能从根本上解决大数据量的问题。它的问题也是很明显的:
- 当切分规则复杂时,增加了应用端调用的难度
- 数据维护难度比较大,当拆分规则有变化时,需要对数据进行迁移
对于第一个问题,可以参考后面要讲的如何整合应用端和数据库端。对于第二个问题可以参考一致性hash的算法,通过某些映射策略来降低数据维护的成本,可参见以前的博文分布式设计与开发(二)------几种必须了解的分布式算法
3)垂直与水平联合切分
由上面可知垂直切分能更清晰化模块划分,区分治理,水平切分能解决大数据量性能瓶颈问题,因此常常就会把两者结合使用,这在大型网站里是种常见的策略,这可以结合两者的优点,当然缺点就是比较复杂,成本较高,不太适合小型网站,下面是结合前面两个例子的情况:
与应用程序端的整合策略
数据切出来还只是第一步,关键在于应用端如何方便地存取数据,不能因为数据拆分导致应用端存取数据错误或者异常复杂。按照从前往后一般说来有以下三种策略:
- 应用端做数据库路由
- 在应用端和服务器端加一个代理服务器做路由
- 数据库端自行做路由
1) 应用端做数据库路由
应用端做数据库路由实现起来比较简单,也就是在数据库调用的点通过工具包的处理,给每次调用数据库加上路由信息,也就是分析每次调用,路由到正确的库。这种方式多多少少没有对应用端透明,如果路由策略有更改还需要修改应用端,并且这种更改很难做到动态更改。最关键的是应用端的连接池设计会比较复杂,池里的连接就不是无状态了,不利于管理和扩展。
2)在应用端和服务器端加一个代理服务器做路由
通过代理服务器来做服务器做路由可以对客户端屏蔽后端数据库拆分细节,增强了拆分规则的可维护性,一般而言proxy需要提供以下features:
- 对客户端和数据库服务端的连接管理和安全认证
- 数据库请求路由可配置性
- 对调用命令和SQL的解析
- 调用结果的过滤和合并
现在有些开源框架提供了类似功能,比如ameoba,在以前博文设计与开发应用服务器(一)------常见模式 中介绍过ameoba的大致结构,在构建高性能web之路------mysql读写分离实战 介绍过如何实战ameoba,有兴趣的朋友可以参考一下。
3)数据库端自行做路由
例如MySQL就提供了MySQL Proxy的代理产品可以在数据库端做路由,结构如下所示:
这种方式的最大问题就是拆分规则配置的灵活性不好,不一定能满足应用端的多种划分需求。
以上介绍了些数据拆分的策略和相关支撑策略,随后会研究一下前面谈到的数据库高可用架构。
(很资料来源于简朝阳的《MySQL性能调优与架构设计》,需要深入学习的朋友可以参考这本书)
相关推荐
分布式系统开发实战课件主要涵盖了在信息技术领域中构建大规模、高可用、高性能的分布式系统所必备的知识和技术。这个课程可能包括了多个主题,通过PPT形式的教学资料来深入讲解。以下是一些可能涵盖的关键知识点: ...
微服务架构的核心理念是将一个大型的单体应用拆分成多个小型、独立的服务,每个服务都可以独立开发、部署和扩展。然而,这种架构也带来了新的挑战,特别是在事务处理方面。传统的事务处理方法,如本地事务,已经不再...
在实践中,分布式关系型数据库 DRDS 需要考虑到多个方面,包括数据拆分策略、事务边界、常用查询优化、异构索引和简单性策略等。只有通过综合考虑这些方面,才能设计和开发出高性能、可扩展、安全可靠的分布式关系型...
阿里云分布式关系型数据库DRDS(Distributed Relational Database Service)是一种专为大规模并发访问设计的数据库服务,它基于MySQL数据库引擎,旨在解决单机数据库在高并发、大数据量场景下的性能瓶颈问题。...
在“分布式模拟题题库-题目与答案1”中,我们可能会遇到一系列关于分布式系统设计、架构、算法以及优化的问题。由于提供的标签为空,无法给出具体的知识点分类,但我们可以根据描述推测,内容可能包含了分布式系统的...
面对存储容量瓶颈,DRDS采用数据水平拆分策略,将数据分散到多个廉价PC服务器上,实现10T、20T甚至更高容量的存储,同时减轻数据备份、管理(DDL)、检索与更新(DML)的压力。这种方式避免了单机数据库性能下降的...
《大规模分布式系统架构与设计实战》一书的附赠光盘包含了丰富的资源,旨在帮助读者深入理解和实践分布式系统的构建和优化。在这个光盘中,我们可以期待找到一系列与分布式系统相关的技术文档、案例研究、源代码示例...
《RuoYi-Vue-Plus:分布式集群与多租户场景下的全面升级》 RuoYi-Vue-Plus 是一个基于 Vue.js 框架的后台管理系统,它是 RuoYi-Vue 的全新升级版,专为分布式集群和多租户场景设计。这个项目在原有基础上进行了深度...
阿里云分布式关系型数据库DRDS (Distributed Relational Database ...DRDS API的使用,使得开发人员能够更方便地管理和操作分布式数据库,实现对数据库资源的高效利用和灵活扩展,从而更好地满足企业的业务需求。
阿里云分布式关系型数据库DRDS(Distributed Relational Database Service)是一种专为大规模并发访问设计的数据库服务,它基于MySQL数据库引擎,旨在解决单机数据库在高并发、大数据量场景下的性能瓶颈问题。...
6. 测试与优化:通过实际测试验证事务的正确性和性能,根据测试结果调整服务设计和配置。 总之,"基于Hyperf的TCC分布式事务-tcc-transaction.zip"项目为开发者提供了一个实践TCC模式的起点,通过这个项目,你可以...
Java 分布式应用程序设计是构建大型、可扩展和高可用性系统的关键技术。在现代企业级应用中,尤其是在云计算和微服务架构盛行的今天,掌握Java分布式应用的设计原则和技术至关重要。下面将详细介绍Java分布式应用...
在深入探讨《基于FPGA并行拆分查找表分布式高阶FIR的设计与实现》这一主题之前,我们首先要明确FPGA、查找表(LUT)、分布式算术(Distributed Arithmetic,简称DA)、以及有限冲激响应(Finite Impulse Response,...
#### 知识点四:设计模式与最佳实践 1. **API网关**:作为所有外部请求的入口,统一处理认证、限流、监控等通用逻辑。 2. **断路器模式**:在网络出现故障时,避免请求继续发送到失败的服务上,从而保护系统免受...
- 将大型应用拆分为小型、独立的服务,每个服务都可以独立开发、部署和扩展。 - 服务发现与注册:如Eureka、Consul,帮助服务之间找到彼此。 - 网关层:如Kong、Zuul,提供统一的入口,处理认证、限流等。 8. ...
### 软件工程中的分布式系统设计与开发 #### 第1章:软件工程概述 - **软件工程定义**:软件工程是一门集成了多种技术和管理方法的学科,旨在提高软件开发的质量、效率以及减少后期维护的成本。其核心是通过标准化...
"Go-Chiefr"项目,正是一个专门为分布式项目开发设计的模型和工具包,它为开发者提供了强大的支持,简化了复杂分布式系统的实现。 Go-Chiefr项目的核心理念是通过提供一套完整的框架和工具,使得开发者能够更加高效...
分布式系统设计是现代互联网服务和企业级应用的核心技术之一,它涉及到多个计算机节点通过网络进行协同工作,共同处理任务和数据。在这个领域,我们需要深入理解并掌握一系列关键知识点,以构建高效、可扩展且容错的...
通过课程学习,学生能够掌握分布式微服务架构的核心技术,理解微服务之间的依赖关系和通信机制,以及如何通过Spring Cloud等框架进行微服务的设计与开发。学生还可以学习到如何解决分布式系统中出现的问题,比如服务...