【发布时间】:2021-09-15 12:26:48
【问题描述】:
我有 2 台服务器。
- 服务器 A
- 服务器 B
Server A 是一个 mongo Server,我在 docker image 的帮助下设置了 mongo DB。现在我想使用在服务器 B 上运行的 python 脚本将值插入 mongo。我在互联网上尝试了很多东西添加 ssh 密钥,禁用 IP 表在 IP 表中添加规则,添加别名但没有得到任何解决方案。
在服务器 A 上设置 Mongo 服务器。
首先,我们将设置我们的 mongo 服务器和 mongo 副本。我们需要 mongo 副本,因为 mongo 需要首先构建数据库的副本以侦听触发器。因此,让我们构建 Mongo 服务器。
- 拉蒙戈图片
docker pull mongo:4
- 创建 Docker 网络
docker network create mongo-cluster-dev
- 运行 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
- 将此添加到您的 /etc/hosts 文件中
sudo nano /etc/hosts
Append in the end of file:
127.0.0.1 mongoset1 mongoset2 mongoset3
- 将副本信息添加到您的主节点
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)
}
- 好的,现在您可以将此字符串用作连接字符串
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',)>]>
【问题讨论】:
-
你应该映射像
27018:27017这样的端口,而不是27018:27018,因为mongodb没有监听端口27018。 -
我在步骤 3 中启动 docker mongo 映像时映射了端口。我提到了这些命令。
-
是的,我提到了这一点。我认为你应该这样做
docker run -d --net mongo-cluster-dev -p 27018:27017 ...
标签: python linux mongodb docker networking