当前位置: 首页 > news >正文

为分布式系统设计数据库

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等

数据库设计是微服务和云原生解决方案的关键因素,因为基于微服务的架构导致了数据的分布式。数据管理不再在一个单一的过程中发生,而是可以通过多个过程来操作数据。云计算的兴起使得数据更加分布式。

为了应对这种复杂性,微服务和云原生解决方案已经出现了几种数据管理模式。在这篇文章中,我们将看到一些可以帮助我们在分布式环境中管理数据的最重要的模式。

微服务和云数据库设计的挑战 

在我们深入了解具体的数据管理模式之前,理解微服务和云数据库设计的主要挑战是很重要的:

  • 在微服务架构中,数据分布在不同的节点上。其中一些节点可能位于世界上完全不同的地理区域的不同数据中心中。在这种情况下,很难保证所有节点之间数据的一致性。在任何给定的时间点,各个节点之间的数据状态可能会有所不同。这也被称为最终一致性的问题。 

  • 由于数据是分布式的,没有像单节点单体系统中那样管理数据的中央权威。对于各种参与系统来说,使用一种机制(例如,共识算法)进行数据管理非常重要。 

  • 在微服务架构中,恶意行为者的攻击面更大,因为有多个活动部件。这意味着我们需要在构建微服务时建立更为强大的安全态势。 

  • 微服务和云的主要承诺是可伸缩性。尽管扩展应用程序过程变得更容易,但水平扩展数据库节点却并不容易。如果没有适当的可伸缩性,数据库可能会成为性能瓶颈。 

深入数据管理模式 

考虑到相关的挑战,有几种模式可用于管理微服务和云原生应用程序中的数据。这些模式的主要任务是帮助开发人员解决上述各种挑战。让我们逐一看看这些模式。

每个服务一个数据库 

顾名思义,这种模式建议每个微服务管理其自己的数据。这意味着没有其他微服务可以直接访问或操作由另一个微服务管理的数据。任何数据的交换或操作只能通过一组明确定义的API来完成。下图显示了一个每个服务一个数据库模式的例子。

图片

图1: 每个服务一个数据库模式

表面上看,这种模式似乎相当简单。当我们从一个全新的应用程序开始时,可以相对容易地实施它。然而,当我们将现有的单体应用程序迁移到微服务架构时,服务之间的划分并不是那么清晰。

大多数功能都是以一种不同系统部件非正式访问其他部件数据的方式编写的。

在使用每个服务一个数据库模式时,我们需要关注两个主要领域:

  • 为每个服务定义有界上下文 

  • 管理跨多个微服务的业务事务

共享数据库 

下一个重要的模式是共享数据库模式。尽管此模式支持微服务架构,但它通过使用可供多个微服务访问的共享数据库采取了一种更为宽松的方法。对于正在过渡到微服务架构的现有应用程序,这是一个更安全的模式,因为我们可以慢慢地发展应用程序层,而无需更改数据库设计。然而,这种方法削减了微服务的一些优势:

跨团队的开发人员需要协调表格的模式更改。当多个服务试图访问相同的数据库资源时,可能会出现运行时冲突。

CQRS 和事件溯源 

在命令查询责任分离(CQRS)模式中,应用程序监听来自其他微服务的域事件,并更新一个单独的数据库以支持视图和查询。然后,我们可以从这个单独的数据库中服务复杂的聚合查询,同时根据需要优化性能并按需扩展。

事件溯源通过将实体或聚合的状态存储为事件序列来更进一步。每当我们对对象进行更新或插入时,都会创建一个新事件并存储在事件存储中。我们可以一起使用CQRS和事件溯源来解决围绕事件处理和维护单独查询数据的许多挑战。这样,您可以根据各自的需求单独扩展写入和读取。

图片

图2: 事件溯源和CQRS一起执行

不足之处在于,对于大多数开发人员来说,这是一种不熟悉的构建应用程序的方式,并且有更多的移动部件需要管理。

Saga 模式 

Saga模式是处理跨多个微服务的业务事务的另一个解决方案。例如,在食品配送应用上下订单是一项业务事务。在Saga模式中,我们将此业务事务分解为由不同服务处理的一系列本地事务。对于每个本地事务,执行事务的服务都会发布一个事件。

事件触发另一个服务中的后续事务,并且链条持续下去,直到整个业务事务完成。如果链条中的任何特定事务失败,Saga将通过执行一系列补偿事务来回滚,以撤销所有先前事务的影响。

Saga实现有两种类型:

  • 基于编排的Saga 

  • 基于编舞的Saga

分片 

分片有助于构建云原生应用程序。它涉及将一张表的行分隔到多张不同的表中。这也被称为水平分区,但是当分区位于不同的节点上时,它们被称为分片。分片帮助我们提高数据库的读写可伸缩性。同时,它还提高了查询的性能,因为由于分片,特定的查询必须处理更少的记录。

复制 

复制是一个非常重要的数据管理模式。它涉及创建数据库的多个副本。每个副本都是相同的,并运行在不同的服务器或节点上。对一个副本所做的更改将传播到其他副本。这就是所谓的复制。有几种类型的复制方法,例如:

  • 单领导者复制

  • 多领导者复制

  • 无领导者复制

复制帮助我们实现高可用性和提高可靠性,并且它让我们扩展读取操作,因为读取请求可以转发到多个服务器。下面的图3显示了分片和复制的组合运作。

图片

图3: 使用分片和复制一起

云原生环境中数据库设计的最佳实践 

虽然这些模式可以在很大程度上解决微服务和云原生架构中的数据管理问题,但我们还需要遵循一些最佳实践以简化操作。

以下是一些最佳实践:

  • 我们必须尝试为弹性设计解决方案。这是因为在微服务架构中,故障是不可避免的,设计应适应故障,并在不中断业务的情况下从中恢复。

  • 当过渡到其中一个模式时,我们必须实施适当的迁移策略。一些常见的可以评估的策略包括模式优先与数据优先,蓝绿部署,或使用扼杀者模式。

  • 不要忽视备份和经过良好测试的灾难恢复系统。这些事情对于单节点数据库来说也很重要。然而,在分布式数据管理方法中,灾难恢复变得更为重要。

  • 在微服务或云原生应用程序中,持续监控和可观察性同样重要。例如,分片技术可能会导致不平衡的分区和热点。如果没有适当的监控解决方案,对这种情况的任何反应可能都为时已晚,并可能使业务面临风险。

结论 

我们可以得出结论,良好的数据库设计在微服务和云原生环境中绝对是至关重要的。没有适当的设计,应用程序将因分布式数据的固有复杂性而面临多个问题。存在多种数据管理模式,以帮助我们以更可靠和可扩展的方式处理数据。然而,每种模式都有自己的挑战和一组优势和劣势。没有哪种模式适合所有可能的情景,我们应该在处理了各种权衡后才选择特定的模式。

作者:Saurabh Dashora

更多内容请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

相关文章:

为分布式系统设计数据库

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 数据库设计是微服务和云原生解决方案的关键因素,因为基于微服务的架构导致了数据的分布式。数据管理不再在一个单一的过程中发生,而是可以通过多…...

Programming abstractions in C阅读笔记:p179-p180

《Programming Abstractions In C》学习第60天,p179-p180总结。 一、技术总结 1.palindrome(回文) (1)包含单个字符的字符串(如"a"),或者空字符串(如" ")也是回文。 (2)示例:“level”、“noon”。 2.predicate fun…...

在 VSCode 中使用 PlantUML

最近,因为工作需要绘制一些逻辑图,我自己现在使用的是 PlantUML 或者 mermaid,相比之下前者更加强大。不过它的环境也麻烦一些,mermaid 在一些软件上已经内置了。但是 PlantUML 一般需要自己本地安装或者使用远程服务器&#xff0…...

css3过渡属性属性名:transition

CSS3的过渡属性属性名是transition,它允许我们在状态改变时为元素添加过渡效果,例如在元素从一种样式变为另一种样式时添加平滑的过渡效果。 transition的语法如下: transition: property duration timing-function delay;其中,…...

关于数据链路层(初步)

以太网帧格式: 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固 化的; 帧协议类型字段有三种值,分别对应载荷的形式,有IP、ARP、RARP; …...

诊断DLL——CAPL_DLL集成安全访问算法

文章目录 前言一、CAPL DLL简介DLL生成C2338报错解决方案:二、添加27服务解锁算法三、CAPL调用dll前言 在实际诊断工程应用中,如UDS刷写——27服务,经常会遇到一些Seed2Key的算法问题,为了安全保密,这个算法的源码不便公开,我们可以将其打包成DLL,然后在CANoe诊断控制面…...

集合元素处理(传统方式和Stream方式)

1、集合元素处理(传统方式) 现在有两个ArrayList集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行一下若干操作步骤: 第一个队伍只要 名字为 3 个字 的成员姓名;存…...

亲测好用,这3款免费高清录屏软件,效果惊人!

在当今社会上,录屏软件已经成为了人们日常生活中不可或缺的一部分。无论是在工作还是学习中,我们都需要使用录屏软件来录制屏幕上的内容。然而,许多录屏软件都是收费的,这对于那些想要尝试录屏软件但又不想花钱的人来说&#xff0…...

超声波清洗机洗眼镜真的可以洗干净吗?眼镜超声波清洗机推荐

截止2023年4月份近视眼的统计,我过近视人群高达3亿人,可想而知现在近视的群体是有多么庞大的。近视就免不了要戴眼镜,但是一副眼镜长时间的佩戴不清洗的话,镜片会不清晰,也有的朋友会眼镜脏了就去配一副新的&#xff0…...

centos7安装部署ElasticSearch

文章目录 ElasticSearch安装部署简介安装卸载 ElasticSearch安装部署 简介 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 es)是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、G…...

websocket+node+vite(vue)实现一个简单的聊天

1.前端逻辑 本项目基于之前搭建的vite环境&#xff1a;https://blog.csdn.net/beekim/article/details/128083106?spm1001.2014.3001.5501 新增一个登录页和聊天室页面 <template><div>登录页</div><div>用户名:<input type"text" pl…...

YApi和Swagger接口管理

这篇博客针对苍穹外卖而写 YApi 之前的官网&#xff1a;yapi.smart-xwork.cn 由于之前的网址访问不了&#xff0c;现在我用的是这个网址&#xff1a;YApi Pro-高效、易用、功能强大的可视化接口管理平台 登录之后如下 创建两个工作空间 用户端接口也是如法炮制 Swagger 使用…...

在不安全的集群上启用 Elasticsearch Xpack 安全性

本博文详细描述如何把一个没有启动安全的 Elasticsearch 集群升级为一个带有 HTTPS 访问的启用 Elasticsearch xpack 安全的集群。 为了增强 Elasticsearch 集群的安全性&#xff0c;你需要执行完全集群重启&#xff0c;并在客户端进行一些更改。 启用身份验证后&#xff0c;所…...

vue清除动态路由

项目中往往都是添加动态路由&#xff0c;如何删除已经添加进来的路由往往被忽视&#xff0c;为此这里做一下记录&#xff1a; 查看vue-router路由文档 可以看出 Vue2中是通过matcher来进行重新赋值来进行清空的。 let createRouter () > new Router({mode: history, //ha…...

rsyslog实现将日志存储到mysql中

​ 前提&#xff1a;准备好msql server或mariadb server&#xff1b; ​ 1、安装rsyslog连接至mysql server的驱动模块&#xff1b; [13:24 rootcentos6.8~]# yum install -y rsyslog-mysql [13:24 rootcentos6.8~]# rpm -ql rsyslog-mysql /lib64/rsyslog/ommysql.so /usr/…...

2015架构案例(五十一)

第5题 【说明】某信息技术公司计划开发一套在线投票系统&#xff0c;用于为市场调研、信息调查和销售反馈等业务提供服务。该系统计划通过大量宣传和奖品鼓励的方式快速积累用户&#xff0c;当用户规模扩大到一定程度时&#xff0c;开始联系相关企业提供信息服务&#xff0c;并…...

亚马逊测评安全吗?

测评可以说是卖家非常宝贵的财富&#xff0c;通过测评和广告相结合&#xff0c;可以快速有效的提升店铺的产品销量&#xff0c;提高转化&#xff0c;提升listing权重&#xff0c;但现在很多卖家找真人测评补单后店铺出现问题导致大家对测评的安全性感到担忧&#xff0c;因为真人…...

VS2022新建项目时没有ASP.NET Web应用程序 (.NET Framework)

问题&#xff1a;如图&#xff0c;VS2022新建项目时没有“ASP.NET Web应用程序 &#xff08;.NET Framework&#xff09;”的选项解决方法&#xff1a;点击跳转至修改安装选项界面选择安装该项即可&#xff1a;...

TIA博途软件中如何设置在程序中自动显示变量的注释信息?

TIA博途软件中如何设置在程序中自动显示变量的注释信息? 本例以TIA博途V15为例进行举例说明 如下图所示,新建一个项目后,打开PLC变量表,这里我选择几个变量进行举例说明,给这几个变量添加注释信息, 打开OB1,编写一句简单的程序,如下图所示,可以看到此时变量只显示名称…...

Hadoop3教程(一):Hadoop的定义、组成及全生态概览

文章目录 &#xff08;1&#xff09;定义1.1 发展历史1.2 三大发行版本1.3 Hadoop的优势1.4 Hadoop的组成 &#xff08;13&#xff09;HDFS概述&#xff08;14&#xff09;Yarn架构&#xff08;15&#xff09;MapReduce概述&#xff08;16&#xff09; HDFS、YARN、MapReduce三…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...