首页 > 解决方案 > 两台服务器之间的 Mongo DB 通信问题

问题描述

我有 2 台服务器。

  1. 服务器 A
  2. 服务器 B

服务器 A 是一个 mongo 服务器,我在 docker image 的帮助下设置了 mongo DB。现在我想使用在服务器 B 上运行的 python 脚本将值插入 mongo。我在互联网上尝试了很多东西添加 ssh 密钥,禁用 IP 表在 IP 表中添加规则,添加别名但没有得到任何解决方案。

在服务器 A 上设置 Mongo 服务器。

首先,我们将设置我们的 mongo 服务器和 mongo 副本。我们需要 mongo 副本,因为 mongo 需要首先构建数据库的副本以侦听触发器。因此,让我们构建 Mongo 服务器。

  1. 拉蒙戈图像
docker pull mongo:4
  1. 创建 Docker 网络
docker network create mongo-cluster-dev
  1. 运行 mongo 容器
docker run -d --net mongo-cluster-dev -p 27017:27017 --name mongoset1 mongo:4 mongod --replSet mongodb-replicaset --port 27017
docker run -d --net mongo-cluster-dev -p 27018:27018 --name mongoset2 mongo:4 mongod --replSet mongodb-replicaset --port 27018
docker run -d --net mongo-cluster-dev -p 27019:27019 --name mongoset3 mongo:4 mongod --replSet mongodb-replicaset --port 27019
  1. 将此添加到您的 /etc/hosts 文件中
sudo nano /etc/hosts
Append in the end of file:

127.0.0.1       mongoset1 mongoset2 mongoset3

  1. 将副本信息添加到您的主节点
docker exec -it mongoset1 mongo

# Run this after getting into the mongo container

db = (new Mongo('localhost:27017')).getDB('test')
config={"_id":"mongodb-replicaset","members":[{"_id":0,"host":"mongoset1:27017"},{"_id":1,"host":"mongoset2:27018"},{"_id":2,"host":"mongoset3:27019"}]}
rs.initiate(config)

你会得到这样的结果

{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1567674525, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1567674525, 1)
}
  1. Ok Now 您可以将此字符串用作连接字符串
mongodb://<hostname>:27017,<hostname>:27018,<hostname>:27019/<Your database name>?replicaSet=mongodb-replicaset

服务器 B Python 脚本

import pymongo

myclient = pymongo.MongoClient("your url")

print(myclient.list_database_names())

我期待 mongo 服务器内的数据库总数但是得到以下错误。

>>> print(myclient.list_database_names())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sohaib/anaconda3/envs/mongo_testing/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1918, in list_database_names
    for doc in self.list_databases(session, nameOnly=True)]
  File "/home/sohaib/anaconda3/envs/mongo_testing/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1899, in list_databases
    res = admin._retryable_read_command(cmd, session=session)
  File "/home/sohaib/anaconda3/envs/mongo_testing/lib/python3.6/site-packages/pymongo/database.py", line 756, in _retryable_read_command
    _cmd, read_preference, session)
  File "/home/sohaib/anaconda3/envs/mongo_testing/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1461, in _retryable_read
    read_pref, session, address=address)
  File "/home/sohaib/anaconda3/envs/mongo_testing/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1278, in _select_server
    server = topology.select_server(server_selector)
  File "/home/sohaib/anaconda3/envs/mongo_testing/lib/python3.6/site-packages/pymongo/topology.py", line 243, in select_server
    address))
  File "/home/sohaib/anaconda3/envs/mongo_testing/lib/python3.6/site-packages/pymongo/topology.py", line 200, in select_servers
    selector, server_timeout, address)
  File "/home/sohaib/anaconda3/envs/mongo_testing/lib/python3.6/site-packages/pymongo/topology.py", line 217, in _select_servers_loop
    (self._error_message(selector), timeout, self.description))
pymongo.errors.ServerSelectionTimeoutError: mongoset1:27017: [Errno -2] Name or service not known,mongoset3:27019: [Errno -2] Name or service not known,mongoset2:27018: [Errno -2] Name or service not known, Timeout: 30s, Topology Description: <TopologyDescription id: 60e18ff06e255b716eba4783, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('mongoset1', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('mongoset1:27017: [Errno -2] Name or service not known',)>, <ServerDescription ('mongoset2', 27018) server_type: Unknown, rtt: None, error=AutoReconnect('mongoset2:27018: [Errno -2] Name or service not known',)>, <ServerDescription ('mongoset3', 27019) server_type: Unknown, rtt: None, error=AutoReconnect('mongoset3:27019: [Errno -2] Name or service not known',)>]>

标签: pythonlinuxmongodbdockernetworking

解决方案


实际上我使用的是URI

connectionString = "mongodb://192.168.18.14:27017,192.168.18.14:27018,192.168.18.14:27019/magic_shop?replicaSet=mongodb-replicaset";

但是当我从 URI 中删除副本集的东西现在它工作正常并且值也在其他副本上复制。但我不知道它是否合适

connectionString = "mongodb://192.168.18.14:27017/magic_shop";

从 Bash 检查

复制品 1

(mongo_testing) sohaib@sohaib-Z490-GAMING-X:/media/sohaib/additional_/DataScience/docker-swarm-testing$ mongo 192.168.18.14:27017/magic_shop --eval "db.stats()"
MongoDB shell version v4.4.6
connecting to: mongodb://192.168.18.14:27017/magic_shop?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("8ded783c-f467-4e01-87fa-914172fa4471") }
MongoDB server version: 4.4.6
{
    "db" : "magic_shop",
    "collections" : 1,
    "views" : 0,
    "objects" : 5000,
    "avgObjSize" : 163.2624,
    "dataSize" : 816312,
    "storageSize" : 4096,
    "indexes" : 1,
    "indexSize" : 4096,
    "totalSize" : 8192,
    "scaleFactor" : 1,
    "fsUsedSize" : 133435932672,
    "fsTotalSize" : 491180957696,
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1625399948, 49),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1625399948, 49)

复制品 2

(mongo_testing) sohaib@sohaib-Z490-GAMING-X:/media/sohaib/additional_/DataScience/docker-swarm-testing$ mongo 192.168.18.14:27018/magic_shop --eval "db.stats()"
MongoDB shell version v4.4.6
connecting to: mongodb://192.168.18.14:27018/magic_shop?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("d64f9139-6951-45a3-9e22-c937a1fe7e27") }
MongoDB server version: 4.4.6
{
    "db" : "magic_shop",
    "collections" : 1,
    "views" : 0,
    "objects" : 5000,
    "avgObjSize" : 159.5258,
    "dataSize" : 797629,
    "storageSize" : 4096,
    "indexes" : 1,
    "indexSize" : 4096,
    "totalSize" : 8192,
    "scaleFactor" : 1,
    "fsUsedSize" : 133435928576,
    "fsTotalSize" : 491180957696,
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1625399945, 39),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1625399945, 39)

副本 3

(mongo_testing) sohaib@sohaib-Z490-GAMING-X:/media/sohaib/additional_/DataScience/docker-swarm-testing$ mongo 192.168.18.14:27019/magic_shop --eval "db.stats()"
MongoDB shell version v4.4.6
connecting to: mongodb://192.168.18.14:27019/magic_shop?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("be2340a9-3be6-4073-8118-97ac81b0c184") }
MongoDB server version: 4.4.6
{
    "db" : "magic_shop",
    "collections" : 1,
    "views" : 0,
    "objects" : 5000,
    "avgObjSize" : 155.048,
    "dataSize" : 775240,
    "storageSize" : 4096,
    "indexes" : 1,
    "indexSize" : 4096,
    "totalSize" : 8192,
    "scaleFactor" : 1,
    "fsUsedSize" : 133435912192,
    "fsTotalSize" : 491180957696,
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1625399941, 36),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1625399941, 36)

推荐阅读