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

mongodb 本地访问与远程访问的数据一致性问题?

羊冠玉
2023-09-23

各位大佬好,我的问题是这样:
我有一个服务器,我在服务器里自己安装了一个mongodb,假设外网访问是131.131.131.131:30303. 然后我在家里通过访问这个ip就能拿到。 而我在这个服务器上部署了一个服务,连接这个mongo使用的是127.0.0.1:30303。 但发生了异常:我在家里通过ip远程(程序访问)访问,拿回来700多的数据。 但是 在服务上的程序通过127访问mongo只能拿到500多的数据。 两套配置文件除了访问的ip不同以外,其他db名,用户名密码完全一致。 更神奇的是,我在服务器上把配置文件中mongo的访问ip也改成外网ip,依然只能拿到500多的数据。 我实在高不清这个现象和原因是什么,求各位大佬指点迷津!我用的是golang。 mongo-go-driver

共有1个答案

罗和煦
2023-09-23

你的问题可能与MongoDB的连接设置和数据分片有关。在这种情况下,以下是一些可能的原因和解决方案:

  1. 数据分片:如果你的数据被分片存储在多个服务器上,那么在不同的位置访问可能会返回不同的数据量。确保你使用的是正确的分片键和查询,以便从所有相关的分片中获取数据。
  2. 连接设置:检查你的连接字符串和设置。特别是,注意以下设置:
* `readPreference`:这决定了客户端从哪些数据节点读取数据。如果你使用的是`secondaryPreferred`或`nearest`,则可能会在不同的位置看到不同的数据。* `maxStaleness`:这决定了客户端可以接受多少秒之内的数据副本。如果设置得太低,可能会看到不一致的数据。* `replicaSet`:如果你的MongoDB是一个复制集,确保你的连接字符串中包含了所有的复制节点。
  1. 网络延迟:如果你的服务器和客户端在不同的地理位置,网络延迟可能会导致数据返回的时间不同。这可能会使你看到部分结果,而其他人看到的是全量数据。
  2. 连接超时:如果你的连接超时设置得过低,可能会在获取大量数据时超时。尝试增加超时设置,看看是否解决了问题。
  3. 数据读取的并发性:如果你的数据被多个并发请求读取,那么可能会看到不同的结果。确保你的应用程序逻辑是正确的,以便正确地处理并发读取。
  4. MongoDB的复制和同步:确保你的MongoDB复制集中的所有节点都是最新的,并且同步了所有数据。如果某个节点落后于其他节点,那么可能会返回不同的数据。

最后,如果可能的话,尝试在一个地方(例如你的服务器或家里)获取所有数据,并比较结果是否一致。这将有助于确定问题是否与位置相关,而不是与你的应用程序或MongoDB相关。

 类似资料:
  • 因此,我试图从远程pc连接到我的jupyter笔记本,因为我自己的pc没有全局IP,我必须首先连接到本地网络(服务器1)中的另一台pc,然后通过ssh连接到我自己的pc,并在其上运行jupyter(服务器2),所以类似这样: 我的笔记本电脑- 我曾经这样做,当两个服务器Linux这样: 在我的笔记本电脑上: 在服务器1上: 在服务器2上: 但是现在我的服务器2是一台windows pc,我的jup

  • 我的应用程序本质上是一堆跨Node.js实例部署的微服务。一个服务可能会写入一些数据,而另一个服务将读取这些更新。(具体的例子是,我正在使用处理管道处理入站到解决方案中的数据。阶段1对相同的数据执行某些操作,阶段2对相同的数据执行其他操作,等等。这是一个相当常见的模式) 因此,我有一个很大的数据集(现在大约250GB,我读到过,一旦数据库变得比这个大得多,就不可能在数据库中引入分片,至少不是没有一

  • 我是infinispan的新手,通过实验学习。在尝试访问不同名称的远程缓存失败后,我需要一些帮助。下面是我的infinispan客户端-服务器模式未嵌入的场景。 1) 我在infinispan集群中启动了node1,并将默认远程缓存名称设置为node1\u cache--Hotrod服务器已启动 2) 已在infinispan群集中启动node2,并将默认远程缓存名称设置为node2\u cach

  • 我可以通过本地J控制台访问Mbean,但无法从远程主机访问MBEANS。 我的配置: 远程进程:服务:jmx:远程处理-jmx://10.32.222.111:4447 我将用户添加到管理和应用领域 测试=2b1be81e1da41d4ea647bd82fc8c2bc9 但当我尝试连接它说:连接失败:重试 当我使用远程进程为:10.32.222.111:4447在服务器上提示警告: 16: 29:

  • 我对php和mySQL是完全陌生的,并且正在尝试连接到远程数据库。这是我的代码:- $result=mysql_query(“Select*FROM Constants”); while($ROW=mysql_fetch_array($result)){echo$ROW['name']; echo“ ”;} mysql_close($con); 对这个问题有什么想法吗?马特·蒂亚

  • JAVA访问修饰符的可访问性 公众 在 同一班级 同一套餐 子类 宇宙/其他软件包 我在互联网上寻找这些问题的答案,因为我有多个答案。一个视频说未声明的访问修饰符是公共的,而我看到另一个书面来源说未声明的访问修饰符在子类和其他包中没有限制。试图确认哪个是真的。