Подключение к нешардированному MongoDB-кластеру
Подключение из графических IDE
Подключения проверялись в следующем окружении:
- MacOS Big Sur 11.3.
- JetBrains DataGrip:
2021.1
. - DBeaver Enterprise:
21.0
.
Подключаться из графических IDE можно только к хостам кластера в публичном доступе с использованием SSL-сертификата.
Чтобы избежать ошибок при подключении, сохраните сертификат в локальную папку, для доступа к которой не требуются права администратора.
- Создайте источник данных:
- Выберите в меню File → New → Data Source → MongoDB.
- На вкладке General:
-
Укажите параметры подключения:
-
User, Password — имя и пароль пользователя БД;
-
URL — строка подключения:
mongodb://<FQDN хоста 1 MongoDB>:27018,..,<FQDN хоста N MongoDB>:27018/<имя БД>
-
-
Нажмите ссылку Download, чтобы загрузить драйвер соединения.
-
- На вкладке SSH/SSL:
- Включите настройку Use SSL.
- В поле CA file укажите путь к файлу SSL-сертификата для подключения.
- Нажмите ссылку Test Connection для проверки подключения. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
- Нажмите кнопку OK, чтобы сохранить источник данных.
Поддержка подключения к MongoDB-кластеру доступна только в коммерческих редакциях DBeaver.
Чтобы подключиться к кластеру:
- Создайте новое соединение с БД:
- Выберите в меню База данных пункт Новое соединение.
- Выберите из списка БД MongoDB.
- Нажмите кнопку Далее.
- Настройте параметры подключения на вкладке Главное:
-
В блоке Адрес переключите Type на
URL
и укажите строку подключения:mongodb://<FQDN хоста 1 MongoDB>:27018,..,<FQDN хоста N MongoDB>:27018/<имя БД>
-
В списке Устройство выберите значение
SCRAM-SHA-256
(тип шифрования пароля при подключении). -
В блоке Полномочия укажите имя и пароль пользователя БД.
-
- На вкладке SSL:
- Включите настройку Использовать SSL.
- В поле Корневой сертификат укажите путь к сохраненному файлу SSL-сертификата.
- В блоке Настройки включите Пропустить валидацию имени хоста.
- Нажмите кнопку Тест соединения ... для проверки подключения. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
- Нажмите кнопку Готово, чтобы сохранить настройки соединения с БД.
Примеры строк подключения
Примеры для Linux проверялись в следующем окружении:
- Виртуальная машина в Yandex Cloud с Ubuntu 20.04 LTS.
- Bash:
5.0.16
. - Python:
3.8.2
; pip3:20.0.2
. - PHP:
7.4.3
. - OpenJDK:
11.0.8
; Maven:3.6.3
. - Node.JS:
10.19.0
, npm:6.14.4
. - Go:
1.13.8
. - Ruby:
2.7.0p0
. - unixODBC:
2.3.6
.
Примеры для Windows проверялись в следующем окружении:
- Локальная машина с Windows 10 Pro build
19042.1052
. - PowerShell:
5.1.19041
. - cURL:
7.55.1 WinSSL
.
Пример команды с заполненным FQDN хоста доступен в консоли управления по нажатию кнопки Подключиться на странице кластера.
В примерах ниже предполагается, что SSL-сертификат root.crt
расположен в директории:
/home/<домашняя директория>/.mongodb/
для Ubuntu;$HOME\.mongodb
для Windows.
При успешном подключении к кластеру и выполнении тестового запроса будут выведены:
- для примеров на PHP — результат выполнения команды
ping
; - для других примеров — имя БД, к которой было выполнено подключение.
Bash
Перед подключением установите утилиту MongoDB Shell.
mongosh --norc \
--tls \
--tlsCAFile /home/<домашняя директория>/.mongodb/root.crt \
--host '<FQDN хоста 1 MongoDB>:27018,...,<FQDN хоста N MongoDB>:27018' \
--username <имя пользователя БД> \
--password <пароль пользователя БД> \
<имя БД>
mongosh --norc \
--ssl \
--sslCAFile /home/<домашняя директория>/.mongodb/root.crt \
--host '<FQDN хоста 1 MongoDB>:27018,...,<FQDN хоста N MongoDB>:27018' \
--username <имя пользователя БД> \
--password <пароль пользователя БД> \
<имя БД>
mongosh --norc \
--host '<FQDN хоста 1 MongoDB>:27018,...,<FQDN хоста N MongoDB>:27018' \
--username <имя пользователя БД> \
--password <пароль пользователя БД> \
<имя БД>
После подключения выполните команду db
.
Go
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes golang git && \
go get go.mongodb.org/mongo-driver/mongo
connect.go
package main
import (
"fmt"
"strings"
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
const DB_RS = "<имя набора реплик>"
const DB_NAME = "<имя БД>"
DB_HOSTS := []string {"<FQDN хоста 1 MongoDB>:27018",
...,
"<FQDN хоста N MongoDB>:27018"}
const DB_USER = "<имя пользователя БД>"
const DB_PASS = "<пароль пользователя БД>"
const CACERT = "/home/<домашняя директория>/.mongodb/root.crt"
url := fmt.Sprintf("mongodb://%s:%s@%s/%s?replicaSet=%s&tls=true&tlsCaFile=%s",
DB_USER,
DB_PASS,
strings.Join(DB_HOSTS, ","),
DB_NAME,
DB_RS,
CACERT)
conn, err := mongo.Connect(context.Background(), options.Client().ApplyURI(url))
if err != nil {
panic(err)
}
defer conn.Disconnect(context.Background())
fmt.Println(conn.Database(DB_NAME).Name())
}
connect.go
package main
import (
"fmt"
"strings"
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
const DB_RS = "<имя набора реплик>"
const DB_NAME = "<имя БД>"
DB_HOSTS := []string {"<FQDN хоста 1 MongoDB>:27018",
...,
"<FQDN хоста N MongoDB>:27018"}
const DB_USER = "<имя пользователя БД>"
const DB_PASS = "<пароль пользователя БД>"
url := fmt.Sprintf("mongodb://%s:%s@%s/%s?replicaSet=%s&tls=false",
DB_USER,
DB_PASS,
strings.Join(DB_HOSTS, ","),
DB_NAME,
DB_RS)
conn, err := mongo.Connect(context.Background(), options.Client().ApplyURI(url))
if err != nil {
panic(err)
}
defer conn.Disconnect(context.Background())
fmt.Println(conn.Database(DB_NAME).Name())
}
Подключение:
go run connect.go
Java
Перед подключением:
-
Установите зависимости:
sudo apt update && sudo apt install --yes default-jdk maven
-
Добавьте SSL-сертификат в хранилище доверенных сертификатов Java (Java Key Store), чтобы драйвер MongoDB мог использовать этот сертификат при защищенном подключении к хостам кластера. При этом задайте пароль в параметре
-storepass
для защиты хранилища:cd ~/.mongodb && \ sudo keytool -importcert \ -alias YandexCA -file root.crt \ -keystore ssl -storepass <пароль хранилища сертификатов, не короче 6 символов> \ --noprompt
-
Создайте директорию для проекта Maven:
cd ~/ && \ mkdir --parents project/src/java/com/example && \ cd ~/project
-
Создайте конфигурационный файл для Maven:
pom.xml<?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>app</artifactId> <packaging>jar</packaging> <version>0.1.0</version> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.30</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}-${project.version}</finalName> <sourceDirectory>src</sourceDirectory> <resources> <resource> <directory>src</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <goals> <goal>attached</goal> </goals> <phase>package</phase> <configuration> <descriptorRefs> <descriptorRef> jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
Актуальные версии зависимостей для Maven:
src/java/com/example/App.java
package com.example;
import java.util.*;
import com.mongodb.*;
import com.mongodb.client.*;
public class App {
public static void main(String[] args) {
System.setProperty("javax.net.ssl.trustStore", "/home/<домашняя директория>/.mongodb/YATrustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "<пароль хранилища сертификатов>");
final Integer DB_PORT = 27018;
List DB_HOSTS = new ArrayList<ServerAddress>();
DB_HOSTS.add(new ServerAddress("<FQDN хоста 1 MongoDB>", DB_PORT));
...,
DB_HOSTS.add(new ServerAddress("<FQDN хоста N MongoDB>", DB_PORT));
final String DB_NAME = "<имя БД>";
final String DB_USER = "<имя пользователя БД>";
final String DB_PASS = "<пароль пользователя БД>";
MongoClient conn = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder -> builder.hosts(DB_HOSTS))
.applyToSslSettings(builder -> builder.enabled(true))
.credential(MongoCredential.createCredential(DB_USER, DB_NAME, DB_PASS.toCharArray()))
.build());
System.out.println(conn.getDatabase(DB_NAME).getName());
conn.close();
}
}
src/java/com/example/App.java
package com.example;
import java.util.*;
import com.mongodb.*;
import com.mongodb.client.*;
public class App {
public static void main(String[] args) {
final Integer DB_PORT = 27018;
List DB_HOSTS = new ArrayList<ServerAddress>();
DB_HOSTS.add(new ServerAddress("<FQDN хоста 1 MongoDB>", DB_PORT));
...,
DB_HOSTS.add(new ServerAddress("<FQDN хоста N MongoDB>", DB_PORT));
final String DB_NAME = "<имя БД>";
final String DB_USER = "<имя пользователя БД>";
final String DB_PASS = "<пароль пользователя БД>";
MongoClient conn = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder -> builder.hosts(DB_HOSTS))
.credential(MongoCredential.createCredential(DB_USER, DB_NAME, DB_PASS.toCharArray()))
.build());
System.out.println(conn.getDatabase(DB_NAME).getName());
conn.close();
}
}
Подключение:
mvn clean package && \
java -jar target/app-0.1.0-jar-with-dependencies.jar
Node.js
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes nodejs npm && \
npm install mongodb
app.js
const util = require('util');
const MongoClient = require('mongodb').MongoClient;
const DB_RS = '<имя набора реплик>'
const DB_NAME = '<имя БД>'
const DB_HOSTS = ['<FQDN хоста 1 MongoDB>:27018',
...,
'<FQDN хоста N MongoDB>:27018']
const DB_USER = '<имя пользователя БД>'
const DB_PASS = '<пароль пользователя БД>'
const CACERT = '/home/<домашняя директория>/.mongodb/root.crt'
const url = util.format('mongodb://%s:%s@%s/', DB_USER, DB_PASS, DB_HOSTS.join(','))
const options = {
useNewUrlParser: true,
useUnifiedTopology: true,
tls: true,
tlsCAFile: CACERT,
replicaSet: DB_RS,
authSource: DB_NAME
}
MongoClient.connect(url, options, function(err, conn) {
if (conn.isConnected()) {
const db = conn.db(DB_NAME)
console.log(db.databaseName)
}
conn.close()
})
app.js
const util = require('util');
const MongoClient = require('mongodb').MongoClient;
const DB_RS = '<имя набора реплик>'
const DB_NAME = '<имя БД>'
const DB_HOSTS = ['<FQDN хоста 1 MongoDB>:27018',
...
'<FQDN хоста N MongoDB>:27018']
const DB_USER = '<имя пользователя БД>'
const DB_PASS = '<пароль пользователя БД>'
const url = util.format('mongodb://%s:%s@%s/', DB_USER, DB_PASS, DB_HOSTS.join(','))
const options = {
useNewUrlParser: true,
useUnifiedTopology: true,
replicaSet: DB_RS,
authSource: DB_NAME
}
MongoClient.connect(url, options, function(err, conn) {
if (conn.isConnected()) {
const db = conn.db(DB_NAME)
console.log(db.databaseName)
}
conn.close()
})
Подключение:
node app.js
PHP
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes php php-mongodb
connect.php
<?php
$DB_RS = '<имя набора реплик>';
$DB_NAME = '<имя БД>';
$DB_HOSTS = '<FQDN хоста 1 MongoDB>:27018,...,<FQDN хоста N MongoDB>:27018';
$DB_USER = '<имя пользователя БД>';
$DB_PASS = '<пароль пользователя БД>';
$CACERT = '/home/<домашняя директория>/.mongodb/root.crt';
$uri = sprintf(
'mongodb://%s:%s@%s/%s?replicaSet=%s',
$DB_USER,
$DB_PASS,
$DB_HOSTS,
$DB_NAME,
$DB_RS
);
$conn = new \MongoDB\Driver\Manager($uri, ["tls" => "true", "tlsCAFile" => $CACERT], []);
$command = new MongoDB\Driver\Command(array("ping" => 1));
try {
$cursor = $conn->executeCommand($DB_NAME, $command);
$response = $cursor->toArray()[0];
} catch(MongoDB\Driver\Exception $ex) {
echo "$ex->getMessage()";
exit;
}
var_dump($response);
?>
connect.php
<?php
$DB_RS = '<имя набора реплик>';
$DB_NAME = '<имя БД>';
$DB_HOSTS = '<FQDN хоста 1 MongoDB>:27018,...,<FQDN хоста N MongoDB>:27018';
$DB_USER = '<имя пользователя БД>';
$DB_PASS = '<пароль пользователя БД>';
$uri = sprintf(
'mongodb://%s:%s@%s/%s?replicaSet=%s',
$DB_USER,
$DB_PASS,
$DB_HOSTS,
$DB_NAME,
$DB_RS
);
$conn = new \MongoDB\Driver\Manager($uri);
$command = new MongoDB\Driver\Command(array("ping" => 1));
try {
$cursor = $conn->executeCommand($DB_NAME, $command);
$response = $cursor->toArray()[0];
} catch(MongoDB\Driver\Exception $ex) {
echo "$ex->getMessage()";
exit;
}
var_dump($response);
?>
Подключение:
php connect.php
PowerShell
Перед подключением установите утилиту MongoDB Shell.
mongosh.exe --norc `
--host '<FQDN хоста 1 MongoDB>:27018,...,<FQDN хоста N MongoDB>:27018' `
--tls `
--tlsCAFile $HOME\.mongodb\root.crt `
--username <имя пользователя БД> `
--password <пароль пользователя БД> `
<имя БД>
mongosh.exe --norc `
--host '<FQDN хоста 1 MongoDB>:27018,...,<FQDN хоста N MongoDB>:27018' `
--username <имя пользователя БД> `
--password <пароль пользователя БД> `
<имя БД>
После подключения выполните команду db
.
Python
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes python3 python3-pip && \
pip3 install pyMongo
connect.py
import ssl
import pymongo
from urllib.parse import quote_plus as quote
CACERT = '/home/<домашняя директория>/.mongodb/root.crt'
DB_RS = '<имя набора реплик>'
DB_NAME = '<имя БД>'
DB_HOSTS =','.join([
'<FQDN хоста 1 MongoDB>:27018',
...,
'<FQDN хоста N MongoDB>:27018'
])
DB_USER = '<имя пользователя БД>'
DB_PASS = '<пароль пользователя БД>'
url = 'mongodb://{user}:{pw}@{hosts}/?replicaSet={rs}&authSource={auth_src}'.format(
user=quote(DB_USER),
pw=quote(DB_PASS),
rs=DB_RS,
hosts=DB_HOSTS,
auth_src=DB_NAME)
conn = pymongo.MongoClient(
url,
tls=True,
tlsCAFile=CACERT)
db = conn[DB_NAME]
print(db.name)
conn.close()
connect.py
import ssl
import pymongo
from urllib.parse import quote_plus as quote
DB_RS = '<имя набора реплик>'
DB_NAME = '<имя БД>'
DB_HOSTS =','.join([
'<FQDN хоста 1 MongoDB>:27018',
...,
'<FQDN хоста N MongoDB>:27018'
])
DB_USER = '<имя пользователя БД>'
DB_PASS = '<пароль пользователя БД>'
url = 'mongodb://{user}:{pw}@{hosts}/?replicaSet={rs}&authSource={auth_src}'.format(
user=quote(DB_USER),
pw=quote(DB_PASS),
rs=DB_RS,
hosts=DB_HOSTS,
auth_src=DB_NAME)
conn = pymongo.MongoClient(url)
db = conn[DB_NAME]
print(db.name)
conn.close()
Подключение:
python3 connect.py