当前位置: 首页 > 知识库问答 >
问题:

保证MongoDB中微服务访问共享集群数据的一致性

慕俊迈
2023-03-14

我的应用程序本质上是一堆跨Node.js实例部署的微服务。一个服务可能会写入一些数据,而另一个服务将读取这些更新。(具体的例子是,我正在使用处理管道处理入站到解决方案中的数据。阶段1对相同的数据执行某些操作,阶段2对相同的数据执行其他操作,等等。这是一个相当常见的模式

因此,我有一个很大的数据集(现在大约250GB,我读到过,一旦数据库变得比这个大得多,就不可能在数据库中引入分片,至少不是没有一些大的跳圈)。我想有一个高可用的数据库,所以我计划在一个副本集,至少有一个辅助和仲裁器。

我仍然在研究我的“分片”选项,但我认为我可以通过它所属的“客户端”分片我的数据,所以我认为有3个分片是有意义的。

第三个问题...我假设,只要我在“多数”认可的情况下写,并从所有初选中读,我就不需要担心因果一致的数据?我读到过,从“次要”节点执行读操作是不值得的。如果从第二级读取,您必须担心“最终的一致性”,由于写入是同步的,第二级基本上看到的流量与第一级相同。所以从二年级开始阅读没有任何好处。如果是这种情况,我可以从原稿中执行所有的读取(使用“多数”读关注),并确保我总是得到一致的数据,并且我正在执行的分片给了我一些好处,因为我在分片中分配了负载。这是正确的吗?

第四个(也是最后一个)问题...什么时候因果一致的会议是值得的?如果我理解正确,但我不确定我是否理解正确,那么我认为是当我有一个典型的web应用程序(而不是一些分布式应用程序,如我当前的应用程序)时,只有一个(或两个)节点执行读写操作。在这种情况下,我将使用因果一致的会话,并对主服务器执行写操作,从次服务器执行读操作。但是,在这种情况下,从中学阅读有什么好处呢?我错过了什么?因果一致会话的用例是什么?

共有1个答案

幸越泽
2023-03-14

如果我有3个碎片,并且我的副本集是Primary/secondary/Arbiter(在Primary上运行仲裁器),我将有6个MongoDB实例在运行。将有三个初选和三个次要(仲裁器在每个初选上运行)。这是正确的吗?

副本集仲裁器仍然是mongodhtml" target="_blank">实例。只是仲裁者没有数据的副本,不能成为主要的。每个碎片应该有3个实例,这意味着总共有9个实例。

既然您提到您希望有一个高可用的数据库部署,请注意生产部署的最小推荐副本集成员将是一个主要成员和两个次要成员。

    null

这是因为仲裁器不携带数据,不能确认写入,但仍被计算为投票成员。另请参见编写副本集的关注点。

我可以从原稿进行所有读取(使用“多数”读关注),并确保我总是得到一致的数据,我正在做的分片给了我一些好处,因为在分片上分配负载

正确的,MongoDB Sharding是水平伸缩,以在碎片之间分配负载。而MongoDB复制是为了提供高可用性。

 类似资料:
  • 当前体系结构: 问题: 我们在前端和后端层之间有一个两步流程。 null 微服务2(MS2)需要验证I1的完整性,因为它来自前端。如何避免对MS1进行新的查询?最好的办法是什么? 我试图优化的流删除了步骤1.3和2.3 流程1: null 流程2: 2.1用户X已在本地/会话存储中存储了数据(MS2_Data) 2.2用户X在MS1上保留数据(MS2_Data+MS1_Data) 2.3 MS1使

  • 主要内容:1、再回顾:什么是服务注册中心?,2、Consul服务注册中心的整体架构,3、Consul如何通过Raft协议实现强一致性?,4、Consul如何通过Agent实现分布式健康检查?1、再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相调用。 举个现实点的例子吧,比如电商系统里的订单服务需要调用库存服务,如下图所示。 现在的问题在于,订单服务在192.168.31.1

  • 我正在设计一个微服务架构中的评审分析平台。 应用程序如下所示; null null 问题在于,验证服务需要获取site-a的所有评论,应用验证规则并生成错误(如果有的话)。我知道共享数据库模式和实体打破了微服务体系结构。 一个可能的解决方案是 每当验证服务需要对站点进行审查时,它就会请求网关,网关会将请求重定向到审查服务并采取响应。 这种方法的两个可能缺点是 验证服务是否知道网关?是否会带来依赖?

  • 虽然每个微服务通常都有自己的数据,但某些实体需要在多个服务之间保持一致。 对于高度分布式环境(如微服务体系结构)中的这种数据一致性要求,设计的选择是什么?当然,我不想要共享数据库体系结构,即单个数据库管理所有服务的状态。这违反了孤立和不共享的原则。 我明白,微服务可以在创建、更新或删除实体时发布事件。对该事件感兴趣的所有其他微服务可以相应地更新各自数据库中的链接实体。 这是可行的,但是它会导致跨服

  • 在所有情况下,重要的是,如果允许用户Y访问该公司,微服务本身仍然必须检查是否允许用户Y对该公司进行某种操作。因此,此用户到公司的匹配仅用于确保用户对公司有访问权限。 我并不是真的很喜欢这些方法,因为将消息放入队列(1)意味着每个服务都必须被告知一个更改。使用Zuul验证(2)也不是真正实用的,因为它应该只是一个网关。

  • 我不清楚如何取回购买服务不保存的数据--例如:用户的全名。当试图通过购买用户名进行更复杂的搜索购买时,问题会变得更严重。 我认为,显然可以通过在两个服务之间同步用户来解决这个问题,方法是在用户创建时广播某种类型的事件(并在购买服务端只保存相关的用户属性)。在我看来,这远非理想。当你有数百万用户时,你如何处理这个问题?您会在每个使用用户数据的服务中创建数百万条记录吗? 另一个明显的选择是在用户服务端