为分布式系统设计数据库
【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三…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...