Tại sao MongoDB không kết nối?

Lỗi được báo cáo khi Máy ảo được sử dụng để kết nối với cơ sở dữ liệu MongoDB, không thể thực hiện kết nối và lời nhắc là ngoại lệ. Kết nối thất bại. Tham khảo hình dưới đây để biết lời nhắc cụ thể

Phân tích vấn đề

Nguyên nhân có thể là do liên kết giữa Máy ảo và phiên bản MongoDB bị chặn

Xử lý sự cố

  1. Xác nhận xem địa chỉ kết nối của phiên bản MongoDB có chính xác hay không

    Tìm phiên bản trong Bảng điều khiển MongoDB, kiểm tra địa chỉ kết nối MongoDB trong Chi tiết phiên bản. - Ví dụ kết nối

  2. Xác nhận xem Máy ảo được sử dụng để kết nối có trong cùng một VPC với phiên bản MongoDB hay không

    Kiểm tra xem Máy ảo và phiên bản MongoDB có nằm trong cùng một VPC trên bảng điều khiển JD Cloud không. Nếu cả hai ở các VPC khác nhau và chúng không được kết nối thông qua kết nối ngang hàng VPC, thì không thể kết nối mạng nội bộ. Vui lòng thay thế Máy ảo được sử dụng để kết nối với phiên bản MongoDB

  3. Xác nhận xem danh sách trắng của phiên bản MongoDB có hạn chế IP của Máy ảo không?

    Tìm phiên bản MongoDB trên bảng điều khiển MongoDB và xem cài đặt danh sách trắng của nó. Kiểm tra xem IP mạng nội bộ của Máy ảo có bị hạn chế bởi danh sách trắng hay không. Thêm nó vào danh sách trắng nếu nó bị hạn chế

  4. Kiểm tra xem các quy tắc nhóm bảo mật của Máy ảo có bị hạn chế không

    Tìm Máy ảo trên bảng điều khiển và xem các quy tắc nhóm bảo mật của nó. Nếu quy tắc gửi đi không mở cổng 27017, vui lòng thêm quy tắc

    • Kiểu. TCP tùy chỉnh
    • cảng đích. 27017
    • IP đích. 0. 0. 0. 0/0. Vui lòng kích hoạt tất cả các IP vì IP của phiên bản MongoDB có thể thay đổi trong quá trình chuyển đổi tự động khắc phục sự cố hoặc mở rộng dung lượng
  5. Xác nhận xem ACL mạng được sử dụng bởi mạng con nơi đặt Máy ảo và MongoDB có bị hạn chế hay không

    Tìm ACL mạng được sử dụng bởi mạng con nơi đặt Máy ảo và MongoDB trên bảng điều khiển mạng riêng và xác nhận xem các quy tắc gửi đi và quy tắc gửi đến có được bật trên cổng 27017 hay không. Vui lòng thêm quy tắc nếu nó chưa được kích hoạt

    • Kiểu. TCP tùy chỉnh
    • cảng đích. 27017
    • IP đích. 0. 0. 0. 0/0. Vui lòng kích hoạt tất cả các IP vì IP của phiên bản MongoDB có thể thay đổi trong quá trình chuyển đổi tự động khắc phục sự cố hoặc mở rộng dung lượng

Xử lý theo dõi

Nếu vấn đề vẫn không được giải quyết thông qua các bước nêu trên, vui lòng Gửi Lệnh sản xuất hoặc gọi cho nhân viên dịch vụ khách hàng 400-615-1212

Từ phiên bản trình điều khiển 1. 2, chúng tôi đã giới thiệu một Lớp kết nối mới có cùng tên trên tất cả các trình điều khiển chính thức của chúng tôi. Điều này là để đảm bảo rằng chúng tôi trình bày một mặt trận dễ nhận biết cho tất cả các API của chúng tôi. Điều này không có nghĩa là ứng dụng hiện tại của bạn sẽ bị hỏng, mà đúng hơn là chúng tôi khuyến khích bạn sử dụng api kết nối mới để đơn giản hóa quá trình phát triển ứng dụng của bạn

Hơn nữa, lớp kết nối mới MongoClient thừa nhận tất cả các ghi vào MongoDB, trái ngược với lớp kết nối hiện tại Db đã tắt xác nhận. Hãy tham quan các chức năng MongoClient

MongoClient = function(server, options);

MongoClient.prototype.open

MongoClient.prototype.close

MongoClient.prototype.db

MongoClient.connect

Phác thảo ở trên là giao diện MongoClient hoàn chỉnh. Các phương thức mở, đóng và db hoạt động rất giống với các phương thức hiện có trên lớp Db. Sự khác biệt chính là hàm tạo thiếu tên cơ sở dữ liệu từ Db. Hãy hiển thị một kết nối đơn giản bằng cách sử dụng mã mở như một ví dụ về một nghìn từ

var MongoClient = require('mongodb').MongoClient
  , Server = require('mongodb').Server;

var mongoClient = new MongoClient(new Server('localhost', 27017));
mongoClient.open(function(err, mongoClient) {
  var db1 = mongoClient.db("mydb");

  mongoClient.close();
});

Lưu ý rằng bạn định cấu hình MongoClient giống như bạn đã thực hiện đối tượng Db. Sự khác biệt chính là bạn truy cập các phiên bản db bằng cách sử dụng phương thức db trên đối tượng MongoClient thay vì sử dụng trực tiếp phiên bản Db như trước đây. MongoClient hỗ trợ các tùy chọn giống như phiên bản Db trước đó mà bạn đã tạo

Vì vậy, với một thay đổi tối thiểu trong ứng dụng của chúng tôi, chúng tôi có thể áp dụng mã kết nối MongoClient mới. Nhưng có nhiều và một hướng bạn có thể xem xét trong tương lai. Đó là chuỗi kết nối mongodb

Định dạng kết nối URL

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

Định dạng URL được thống nhất giữa các trình điều khiển chính thức từ 10gen với một số tùy chọn không được hỗ trợ trên một số trình điều khiển vì lý do tự nhiên. Những cái không được hỗ trợ bởi Node. trình điều khiển js bị loại bỏ vì mục đích đơn giản

Các phần cơ bản của url

  • mongodb. // là tiền tố bắt buộc để xác định rằng đây là một chuỗi ở định dạng kết nối tiêu chuẩn
  • tên tài khoản. mật khẩu @ là tùy chọn. Nếu được cung cấp, trình điều khiển sẽ cố gắng đăng nhập vào cơ sở dữ liệu sau khi kết nối với máy chủ cơ sở dữ liệu
  • host1 là phần bắt buộc duy nhất của URI. Nó xác định tên máy chủ, địa chỉ IP hoặc ổ cắm tên miền unix
  • portX là tùy chọn và mặc định là. 27017 nếu không được cung cấp
  • /database là tên của cơ sở dữ liệu để đăng nhập và do đó chỉ có liên quan nếu tên người dùng. mật khẩu @ cú pháp được sử dụng. Nếu không được chỉ định, cơ sở dữ liệu “quản trị viên” sẽ được sử dụng theo mặc định
  • ?options là các tùy chọn kết nối. Lưu ý rằng nếu không có cơ sở dữ liệu thì vẫn có / bắt buộc giữa Máy chủ cuối cùng và ? . Các tùy chọn là các cặp tên=giá trị và các cặp được phân tách bằng dấu “&”. Đối với bất kỳ tùy chọn nào không được nhận dạng hoặc không được hỗ trợ, trình điều khiển nên ghi cảnh báo và tiếp tục xử lý. Trình điều khiển không được hỗ trợ bất kỳ tùy chọn nào không được xác định rõ ràng trong thông số kỹ thuật này. Điều này là để giảm khả năng các trình điều khiển khác nhau sẽ hỗ trợ chồng chéo khác nhau theo những cách nhỏ nhưng không tương thích (như tên khác nhau, giá trị khác nhau hoặc giá trị mặc định khác nhau)

Cấu hình bộ bản sao

  • replicaSet=tên
    • Trình điều khiển xác minh rằng tên của bộ bản sao mà nó kết nối khớp với tên này. Ngụ ý rằng các máy chủ được cung cấp là một danh sách hạt giống và trình điều khiển sẽ cố gắng tìm tất cả các thành viên của tập hợp
    • Không có giá trị mặc định

Cấu hình kết nối

  • ssl=true. SAI. thích hơn
    • ĐÚNG VẬY. trình điều khiển khởi tạo từng kết nối với SSL
    • SAI. trình điều khiển khởi tạo từng kết nối không có SSL
    • thích hơn. trình điều khiển cố gắng bắt đầu từng kết nối bằng SSL và quay lại không có SSL nếu không thành công
    • Giá trị mặc định là sai
  • connectTimeoutMS=ms
    • Một kết nối có thể mất bao lâu để được mở trước khi hết thời gian chờ
    • Hành vi của trình điều khiển hiện tại đã khác về điều này, do đó, mặc định phải được để lại cho mỗi trình điều khiển. Đối với các triển khai mới, mặc định sẽ không bao giờ hết thời gian chờ
  • socketTimeoutMS=ms
    • Thời gian gửi hoặc nhận trên ổ cắm có thể mất bao lâu trước khi hết thời gian chờ
    • Hành vi của trình điều khiển hiện tại đã khác về điều này, do đó, mặc định phải được để lại cho mỗi trình điều khiển. Đối với các triển khai mới, mặc định sẽ không bao giờ hết thời gian chờ

Cấu hình nhóm kết nối

  • maxPoolSize=n. Số lượng kết nối tối đa trong nhóm kết nối
    • Giá trị mặc định là 5

Viết cấu hình quan tâm

Thông tin chi tiết hơn về mối quan tâm viết có thể được tìm thấy tại http. //www. mongodb. org/display/DOCS/getLastError+Command

  • w=wGiá trị
    • Đối với các giá trị số trên 1, trình điều khiển thêm { w. wValue } vào lệnh getLastError
    • wValue thường là một số, nhưng có thể là bất kỳ chuỗi nào để cho phép các thông số kỹ thuật như “đa số”
    • Giá trị mặc định là 1
    • wValue == -1 bỏ qua lỗi mạng
    • wValue == 0 không ghi xác nhận
    • wValue == 1 thực hiện ghi nhận
    • wValue == 2 thực hiện xác nhận ghi trên chính và một phụ
    • wValue == ‘đa số’ thực hiện xác nhận ghi trên phần lớn các máy chủ trong bộ bản sao
    • wValue == ‘tên thẻ’ thực hiện xác nhận ghi đối với tên thẻ bản sao
  • wtimeoutMS=ms
    • Trình điều khiển thêm { wtimeout. ms } vào lệnh getlasterror
    • Được sử dụng kết hợp với w
    • Không có giá trị mặc định
  • tạp chí = đúng. SAI
    • ĐÚNG VẬY. Đồng bộ hóa với tạp chí
    • SAI. trình điều khiển không thêm j vào lệnh getlasterror
    • Giá trị mặc định là sai
  • fsync=true. SAI
    • ĐÚNG VẬY. Đồng bộ hóa với đĩa
    • SAI. trình điều khiển không thêm fsync vào lệnh getlasterror
    • Giá trị mặc định là sai
    • Nếu các giá trị xung đột cho fireAndForget và bất kỳ mối lo ngại ghi nào được thông qua thì trình điều khiển sẽ đưa ra một ngoại lệ về xung đột

tùy chọn xác thực

  • authSource=chuỗi. Được sử dụng khi người dùng xác thực được lưu trữ trong cơ sở dữ liệu khác bằng xác thực gián tiếp
    • Giá trị mặc định là null

đọc tùy chọn

  • nô lệOk=true. SAI. Liệu trình điều khiển được kết nối với bộ bản sao sẽ gửi các lần đọc tới nô lệ/thứ cấp hay không
    • Giá trị mặc định là sai
  • readPreference=enum. Tùy chọn đọc cho kết nối này. Nếu được đặt, nó sẽ ghi đè bất kỳ giá trị SlaveOk nào
    • Giá trị liệt kê
    • sơ đẳng
    • chínhPreferred
    • sơ trung
    • trung họcPreferred
    • gần nhất
    • Giá trị mặc định là chính
  • readPreferenceTags=chuỗi. Biểu diễn của bộ thẻ dưới dạng danh sách các cặp khóa-giá trị được phân tách bằng dấu hai chấm, e. g. dc. này, giá đỡ. 1. Các khoảng trắng phải được loại bỏ từ đầu và cuối của tất cả các khóa và giá trị. Để chỉ định danh sách các bộ thẻ, sử dụng nhiều thẻ readPreferenceTags, hãy. g. readPreferenceTags=dc. này, giá đỡ. 1&readPreferenceTags=dc. ny&readPreferenceTags=
    • Lưu ý giá trị trống, nó cung cấp dự phòng cho bất kỳ máy chủ phụ nào khác nếu không có sẵn
    • Thứ tự quan trọng khi sử dụng nhiều readPreferenceTags
    • Không có giá trị mặc định

MongoClient. kết nối

Định dạng url có thể được sử dụng với MongoClient. kết nối. Nếu có thể, MongoClient sẽ chọn các giá trị mặc định tốt nhất có thể cho các tùy chọn nhưng chúng có thể bị ghi đè. Điều này bao gồm đặt auto_reconnect thành true và native_parser thành true nếu có. Dưới đây là một số ví dụ về cách kết nối với một máy chủ, một bản sao và một hệ thống phân đoạn bằng MongoClient. kết nối

Kết nối máy chủ duy nhất

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/integration_test", function(err, db) {
  test.equal(null, err);
  test.ok(db != null);

  db.collection("replicaset_mongo_client_collection").update({a:1}, {b:1}, {upsert:true}, function(err, result) {
    test.equal(null, err);
    test.equal(1, result);

    db.close();
    test.done();
  });
});

Theo mặc định, một bộ bản sao kết nối không sử dụng xác nhận và readPreference cho phụ

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:30000,localhost:30001/integration_test_?w=0&readPreference=secondary", function(err, db) {
  test.equal(null, err);
  test.ok(db != null);

  db.collection("replicaset_mongo_client_collection").update({a:1}, {b:1}, {upsert:true}, function(err, result) {
    test.equal(null, err);
    test.equal(1, result);

    db.close();
    test.done();
  });
});

Theo mặc định, một kết nối được phân đoạn không sử dụng xác nhận và readPreference cho phụ

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:50000,localhost:50001/integration_test_?w=0&readPreference=secondary", function(err, db) {
  test.equal(null, err);
  test.ok(db != null);

  db.collection("replicaset_mongo_client_collection").update({a:1}, {b:1}, {upsert:true}, function(err, result) {
    test.equal(null, err);
    test.equal(1, result);

    db.close();
    test.done();
  });
});

Lưu ý rằng khi kết nối với hệ thống phân mảnh, nó gần như giống với url để kết nối với bản sao. Điều này là do trình điều khiển tự xác định xem đó là một bản sao hay một bộ proxy Mongos mà nó đang kết nối với. Không cần chăm sóc đặc biệt để chỉ định nếu đó là cái này hay cái kia. Điều này trái ngược với việc phải sử dụng các phiên bản ReplSet hoặc Mongos khi sử dụng lệnh mở

Tổng hợp kết nối MongoClient

Nhóm kết nối là bộ nhớ cache của các kết nối cơ sở dữ liệu do trình điều khiển duy trì để có thể sử dụng lại các kết nối khi cần có kết nối mới với cơ sở dữ liệu. Để giảm số lượng nhóm kết nối được tạo bởi ứng dụng của bạn, chúng tôi khuyên bạn nên gọi MongoClient. kết nối một lần và sử dụng lại biến cơ sở dữ liệu được gọi lại

var express = require('express');
var mongodb = require('mongodb');
var app = express();

var MongoClient = require('mongodb').MongoClient;
var db;

// Initialize connection once
MongoClient.connect("mongodb://localhost:27017/integration_test", function(err, database) {
  if(err) throw err;

  db = database;

  // Start the application after the database connection is ready
  app.listen(3000);
  console.log("Listening on port 3000");
});

// Reuse database object in request handlers
app.get("/", function(req, res) {
  db.collection("replicaset_mongo_client_collection").find({}, function(err, docs) {
    docs.each(function(err, doc) {
      if(doc) {
        console.log(doc);
      }
      else {
        res.end();
      }
    });
  });
});

MongoClient. tùy chọn kết nối

Chức năng kết nối cũng có một hàm băm các tùy chọn được chia thành db/server/replset/mongos cho phép bạn điều chỉnh các tùy chọn không được định dạng chuỗi url hợp nhất hỗ trợ trực tiếp. Để sử dụng các tùy chọn này, bạn chuyển qua một hàm băm như thế này

Tại sao cơ sở dữ liệu MongoDB của tôi không kết nối?

Kiểm tra xem bạn có đang sử dụng đúng tên người dùng và mật khẩu cho người dùng cơ sở dữ liệu của mình không và bạn có đang kết nối với đúng cơ sở triển khai cơ sở dữ liệu không . Kiểm tra xem bạn có đang chỉ định đúng cơ sở dữ liệu authSource trong chuỗi kết nối của mình không.

MongoDB có ngừng hoạt động ngay bây giờ không?

Không có sự cố nào được báo cáo . Không có sự cố nào được báo cáo. Đã giải quyết - Sự cố này đã được giải quyết. Cập nhật - Chúng tôi đã xác định được sự cố ảnh hưởng đến một nhóm nhỏ người dùng MongoDB Atlas Data Federation và Data Lake.

Tại sao tôi không thể kết nối với cổng 27017?

0. 1. 27017 ” là thông báo lỗi chung cho biết máy khách/trình điều khiển của bạn không thể kết nối với máy chủ trên tên máy chủ/IP và cổng đã chỉ định. Trong ví dụ cụ thể này, 127. 0. 0. 1 là tên máy chủ hoặc IP và 27017 là cổng. Kết nối từ máy khách đến máy chủ của bạn bị chặn bởi tường lửa hoặc cấu hình mạng .

Chuỗi kết nối MongoDB của tôi ở đâu?

Để lấy chuỗi kết nối cho một cụm Atlas. .
Điều hướng đến chế độ xem Cụm Atlas của bạn
Nhấp vào Kết nối cho cụm mong muốn của bạn
Nhấp vào Kết nối với MongoDB Compass
Sao chép chuỗi kết nối được cung cấp