为分布式系统设计数据库
【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 一般需要自己本地安装或者使用远程服务器࿰…...
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款免费高清录屏软件,效果惊人!
在当今社会上,录屏软件已经成为了人们日常生活中不可或缺的一部分。无论是在工作还是学习中,我们都需要使用录屏软件来录制屏幕上的内容。然而,许多录屏软件都是收费的,这对于那些想要尝试录屏软件但又不想花钱的人来说࿰…...

超声波清洗机洗眼镜真的可以洗干净吗?眼镜超声波清洗机推荐
截止2023年4月份近视眼的统计,我过近视人群高达3亿人,可想而知现在近视的群体是有多么庞大的。近视就免不了要戴眼镜,但是一副眼镜长时间的佩戴不清洗的话,镜片会不清晰,也有的朋友会眼镜脏了就去配一副新的࿰…...
centos7安装部署ElasticSearch
文章目录 ElasticSearch安装部署简介安装卸载 ElasticSearch安装部署 简介 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 es)是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、G…...

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

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

在不安全的集群上启用 Elasticsearch Xpack 安全性
本博文详细描述如何把一个没有启动安全的 Elasticsearch 集群升级为一个带有 HTTPS 访问的启用 Elasticsearch xpack 安全的集群。 为了增强 Elasticsearch 集群的安全性,你需要执行完全集群重启,并在客户端进行一些更改。 启用身份验证后,所…...
vue清除动态路由
项目中往往都是添加动态路由,如何删除已经添加进来的路由往往被忽视,为此这里做一下记录: 查看vue-router路由文档 可以看出 Vue2中是通过matcher来进行重新赋值来进行清空的。 let createRouter () > new Router({mode: history, //ha…...
rsyslog实现将日志存储到mysql中
前提:准备好msql server或mariadb server; 1、安装rsyslog连接至mysql server的驱动模块; [13:24 rootcentos6.8~]# yum install -y rsyslog-mysql [13:24 rootcentos6.8~]# rpm -ql rsyslog-mysql /lib64/rsyslog/ommysql.so /usr/…...

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

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

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

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

Hadoop3教程(一):Hadoop的定义、组成及全生态概览
文章目录 (1)定义1.1 发展历史1.2 三大发行版本1.3 Hadoop的优势1.4 Hadoop的组成 (13)HDFS概述(14)Yarn架构(15)MapReduce概述(16) HDFS、YARN、MapReduce三…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...