python - 两台服务器之间的 Mongo DB 通信问题
问题描述
我有 2 台服务器。
- 服务器 A
- 服务器 B
服务器 A 是一个 mongo 服务器,我在 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)
}
- 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',)>]>
解决方案
实际上我使用的是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)
推荐阅读
- package - LoadError:预期要注册的包`Execute [ef016c93]`
- testing - 在 Gradle 项目中跨不同类型的测试模块共享 Java 测试助手类
- kubernetes - 有没有办法安装最新的 Spinnaker/Helm/K8s 组合?
- excel - 根据单元格中的特定条件格式化行
- python - Python:如何根据单独列表中的项目将文件从目录移动到另一个目录?
- python - OneHotEncoder 输入不能作为数组工作
- javascript - 无法在 React Native 中输入文本输入
- android - 如何使用 Firebase Recycler View 使用 onBindViewHolder 从不同节点检索 Firebase 数据库中的数据
- authentication - Apache Mina 客户端公钥认证
- java - 静态方法与实例方法中的泛型类型