微服务横向扩展数据库的最佳实践或设计

2024-02-02

微服务的主要好处是可以通过使用多个容器实例和负载平衡来扩展一种服务“类型”以提高吞吐量。

但有一件事是,“服务类型”的多个实例(即容器)共享同一个数据库实例;当多个实例在该数据库实例上写入/读取时,这可能会造成性能瓶颈。

传统上,我们会扩展该数据库实例的处理能力来满足高需求。

对我来说,主要问题是,当前横向扩展/水平扩展的最佳实践/设计/解决方案是什么,以便我们可以拥有该数据库的多个实例并提高性能?

特别是,我想要存档的是:

  • 一个实例关闭,另一个实例可以处理负载 -> 高 可用性

  • 可以负载平衡读取,甚至可以写入多个数据库 实例

  • 维护数据的持久性和一致性,以防万一 创建更多数据库实例

据我所知,

解决方案之一是 Microsoft SQL Server 为 SQL Server 容器提供高可用性,可以满足上述大部分要求(https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-container-ha-overview?view=sql-server-2017 https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-container-ha-overview?view=sql-server-2017)。但我想知道是否有更好的解决方案来避免技术锁定?

我正在考虑的另一个解决方案是:通过使用 CDC Stream Data 从主数据库实例复制到多个实例。这允许复制读取。

但我仍然不相信,因为为了保证一致性,每个服务实例都应该写入主数据库实例,这也可能成为主数据库实例上的瓶颈。


从广义上讲,数据库有 3 种可能的架构:

  1. 单一领导者(例如 RDBMS)
  2. 多领导者(例如多个 DC 中的 RDBMS)
  3. 无领导者(例如 Riak、Cassandra)

当您在上面的列表中从上到下查看时,水平可扩展性潜力会增加,但一致性会变弱。

可扩展性潜力增加,因为随着您沿着列表向下移动,更多节点可以接受写入。由于写入需要时间才能传播或复制到负责数据的所有节点,因此一致性会变弱。当相同的记录几乎同时写入两个不同的节点时,就会出现冲突,因此在复制时,系统不知道哪一个是正确的。

有多种冲突解决策略。不同的数据库使用不同的策略。您需要研究这些策略,以了解哪一种策略适合您的用例,并据此选择数据库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务横向扩展数据库的最佳实践或设计 的相关文章

  • 从数据库中删除重复的行

    我需要从数据库中删除重复的行 我可以用简单的sql查询来完成吗 如果没有 请告诉我一些快速算法来做到这一点 Example id field one field two 1 0000000 11111111 2 2222222 333333
  • Postgres - 如何在插入时自动调用 ST_SetSRID(ST_MakePoint(lng, lat), 4326)?

    我正在使用postGIS 并且我对SQL不是很熟悉 我可以成功插入到我的markers表只要我做这样的事情 伪代码 INSERT INTO markers created by title description lat lng geogr
  • 时间序列数据的键值存储?

    我一直在使用 SQL Server 存储数十万个对象的历史时间序列数据 每天观察大约 100 次 我发现查询 给我时间 t1 和时间 t2 之间对象 XYZ 的所有值 太慢 对于我的需要 慢超过一秒 我按时间戳和对象 ID 建立索引 我考虑
  • 使用 Greasemonkey 时存储数据

    使用 Greasemonkey 时是否有存储大量数据的好方法GM setValue只是没有削减它 那么这里有一些选项 设置服务器来保存数据 对于用户 并使用 xhr 来 创建 编辑 删除数据 谷歌应用程序 发动机 GAE http code
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • 什么是数据库池?

    我只是想了解数据库连接池的概念以及它是如何实现的 数据库联系池是一种用于保持数据库连接打开的方法 以便其他人可以重用它们 通常 打开数据库连接是一项昂贵的操作 尤其是在数据库位于远程的情况下 您必须打开网络会话 进行身份验证 检查授权等等
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 在标准化数据库模式中是否可以有多个外键?

    Address addressID houseNumber postcode roadName city county Reservation reservationID roomNo leadGuestID guest2ID guest3
  • 使用Python将文本文件导入Access 2003数据库

    我正在尝试使用我正在开发的 Python 3 4 应用程序将管道分隔的文本文件导入到具有现有表的 Access 数据库中 但遇到了一些麻烦 该应用程序将用于导入不同的文本文件 因此我使用条目小部件来写入文件名 并且我希望将输入的文件的内容加
  • 用于捕获审计跟踪的数据库设计的想法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何维护数据库中的数据日志 我必须维护对每一行所做的每次更改的日志 这意味着我不能允许DELETE and UPDATE待执行 我怎样才能保留这
  • 有没有多核利用NoSQL系统?

    我从昨天开始就开始使用 MongoDB 并且非常喜欢它 我正在尝试导入大量数据 20 亿行 并为其建立索引 但它似乎没有使用我的系统拥有的 8 个核心 并且导入以正常速率 60000 条记录 秒 进行 我只能想象索引这个集合中的两列可能需要
  • @GenerateValue(strategy = GenerationType.SEQUENCE) 和 startVaule

    当在 Hibernate 中使用 GeneeratedValue Annotation 并向数据库添加新实体时 它的 id 为 1 n 是否可以设置第一个值 以便获得 id 例如10000 n 序列样式生成器应该做到这一点 Generate
  • PostgreSQL 中“-”处或附近的语法错误

    我正在尝试运行查询来更新用户密码 alter user dell sys with password Pass 133 但因为 它给了我这样的错误 ERROR syntax error at or near LINE 1 alter use
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • 无法在 Sqlite3 中添加默认值为 NULL 的 NOT NULL 列

    尝试将 NOT NULL 列添加到现有表时出现以下错误 为什么会发生这种情况 我尝试了 rake db reset 认为现有记录是问题所在 但即使重置数据库后 问题仍然存在 你能帮我解决这个问题吗 迁移文件 class AddDivisio
  • 如何从子查询 SQLite 接收两个值

    我是一个自学的 SQLite 新手 我有三个表 person pet person pet schema 是 CREATE TABLE person id INTEGER PRIMARY KEY first name TEXT last n
  • 为什么 PostgreSQL 会重新分配角色命令,更改模板数据库的所有者

    想象一下现有的数据库称为store a与一表产品 还有一个用户叫store a user 数据库 表 数据 对象等都属于store a user 我现在创建一个名为的新用户store b user和一个名为的新数据库store b通过模板化
  • 使用默认路径中的文件创建数据库

    我想创建一个创建数据库的 SQL 脚本 现在 我有这个 CREATE DATABASE Documents ON PRIMARY NAME N Documents FILENAME N Documents mdf LOG ON NAME N
  • 为 WPF DataGrid 行一一着色

    我正在制作一个 WPF 程序 它能够为 a 中的行着色DataGrid一个接一个地使用红色for循环 我遇到了一些奇怪的事情 如果DataGrid数据库表中有 40 多行数据 它不会对所有行进行着色 这是我正在使用的代码 private v

随机推荐

  • 我可以创建一个 Android 应用程序作为模板吗?

    我不确定它的标题是否正确 但我会解释我的意思 我正在制作多个 Android 应用程序 但它们具有相同的结构 滑动菜单 列表视图 关于我 服装对话框 复制 分享 喜欢 对样式进行一些修改 颜色 背景 字体 菜单字符串 我的问题是 有没有办法
  • JSON Jackson 将不同的键解析到同一字段中

    我有一个 POJO 其中有一个字段 public class Media private Asset asset 将 json 响应解析到此资产 POJO 中时 一切正常 但该资产附带的密钥略有不同 它可以是 JsonProperty co
  • 同时进行网页插入

    我们开发了一个在线测验 用户可以注册一个团队来参加测验 在 asp 中会检查该团队名称是否已提交 如果已提交 则会生成错误 我们注意到一个问题 如果两支球队在同一时间以相同的名称注册 则两支球队都注册了 尽管这种情况不太可能发生 但我们想知
  • 如何比较以逗号分隔的两个列值?

    我有一个包含特定列的表 其中有一列包含逗号分隔的值 例如测试 考试 结果 其他 我将传递一个字符串 例如结果 样本 未知 额外作为存储过程的参数 然后我想通过检查该字符串中的每个短语来获取相关记录 例如 TableA ID Name Wor
  • GCM 不致力于姜饼,但致力于冰淇淋三明治

    我正在编写一个使用 GCM 消息的游戏 当一名玩家进入服务器的回合移动时 服务器将向其对手发送一条 GCM 消息 让该客户端知道有额外的回合数据可用 这应该很简单 我已尽可能严格地遵循示例 GCM 客户端代码 我有两台设备用于测试 带冰淇淋
  • 使用 PyCrypto AES 进行 Python 加密

    我今天刚刚发现 pycrypto 并且一直在研究我的 AES 加密课程 不幸的是 它只起到了一半的作用 self h md5 以十六进制格式输出 md5 哈希值 大小为 32 字节 这是输出 它似乎解密了消息 但它在解密后放置了随机字符 在
  • IE11 无法通过 Web 服务器显示带有对象标记的图像,但在本地正常

    问题 通过对象标签将图像设置作为数据查看时 Internet Explorer 11 在通过 Web 服务器查看时不会显示该图像 这是完整的代码 div style width 200px height 100px img src squa
  • 为什么串联的 RequireJS AMD 模块需要加载程序?

    我们在开发过程中喜欢 RequireJS 和 AMD 在这里我们可以编辑模块 在浏览器中点击重新加载 然后立即看到结果 但是 当需要将我们的模块连接到单个文件以进行生产部署时 显然必须有一个 AMD 加载器仍然存在 无论该加载器是 Requ
  • Python:查找字符串中的单词

    我想在字符串中找到这个单词 如下所示 kkk I do not like that car if like in kkk print like elif dislike in kkk print dislike elif hate in k
  • Laravel 忽略变异器

    我正在使用 Laravel 的 Mutator 功能 并且我有以下 Mutator public function setFirstNameAttribute value this gt attributes first name strt
  • systemctl 状态显示 inactive dead

    我正在尝试编写自己的 简单 systemd 服务 该服务执行一些简单的操作 例如使用 shell 脚本将数字 1 到 10 写入文件 我的服务文件如下所示 Unit Description NandaGopal Documentation
  • 如何在我的类中实现前置和后置自增/自减运算符?

    我想要超载 运算符在我的 c 类中使用运算符重载来使用预增量和后增量 但只有后增量才有效 如何使这两个功能在我的班级中起作用 假设我做了一个 ABC 类 比如 using System using System Collections Ge
  • 设置变换后图像的宽度和高度:旋转

    i have a div with width 190px and height 260px i assign img tag on that div when i upload an image that shows how the im
  • cmd编程中的速度和时间问题

    最近存在一个问题 即如何将具有用户预定义文件类型扩展名的许多文件从一个文件夹移动到许多不同的文件夹 这些文件夹是根据文件名中的密钥字符串 年份 立即创建的 此外 当移动到新创建的文件夹时 文件应在没有用户预定义文件类型扩展名的情况下保存 文
  • 指针变量只是带有一些运算符的整数还是“符号”?

    编辑 最初的单词选择令人困惑 象征性 这个词比原来的 神秘的 要好得多 在关于我之前的 C 问题的讨论中 我被告知指针是 类似于整数的简单值类型 https stackoverflow com questions 32043314 over
  • python asyncio aiohttp 超时

    注意事项 这是我第一次使用 asyncio 所以我可能做了一些非常愚蠢的事情 场景如下 我需要 http ping 一个巨大的 url 列表来检查它们是否响应 200 或任何其他值 尽管像 gobuster report 200 403 等
  • 如何使用重构从类中删除泛型类型

    我有这门课 public class TimeIntCo
  • 搜索多个字符串

    我知道在文件 kmp 中查找一个字符串或在文件 trie 中查找各种字符串的有效方法 但是 多年来 我一直想知道是否有一种方法 有时认为不可能 在多个文件中搜索多个字符串 假设我有一百万个文件 我想回答诸如 查找包含字符串 香蕉 摩托艇 和
  • Pyspark结构化流Kafka配置错误

    我之前已经成功地将 pyspark 用于 Spark Streaming Spark 2 0 2 和 Kafka 0 10 1 0 但我的目的更适合结构化流 我尝试使用在线示例 https spark apache org docs 2 1
  • 微服务横向扩展数据库的最佳实践或设计

    微服务的主要好处是可以通过使用多个容器实例和负载平衡来扩展一种服务 类型 以提高吞吐量 但有一件事是 服务类型 的多个实例 即容器 共享同一个数据库实例 当多个实例在该数据库实例上写入 读取时 这可能会造成性能瓶颈 传统上 我们会扩展该数据