MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB có vấn đề kết nối lại hay tôi làm sai?

CẬP NHẬT :Bài viết hỗ trợ của chúng tôi cho chủ đề này (về cơ bản là bản sao của bài đăng này) đã được chuyển đến tài liệu khắc phục sự cố kết nối của chúng tôi.

Có một vấn đề đã biết là mạng Azure IaaS thực thi thời gian chờ khoảng mười ba phút (theo kinh nghiệm). Chúng tôi đang làm việc với Azure để xem liệu chúng tôi có thể làm cho mọi thứ trở nên thân thiện hơn với người dùng hay không, nhưng trong thời gian chờ đợi, những người khác đã thành công bằng cách định cấu hình các tùy chọn trình điều khiển của họ để khắc phục sự cố.

Thời gian không hoạt động kết nối tối đa

Cách giải quyết hiệu quả nhất mà chúng tôi đã tìm thấy khi làm việc với Azure và khách hàng của chúng tôi là đặt thời gian không hoạt động của kết nối tối đa dưới bốn phút. Ý tưởng là làm cho trình điều khiển tái chế các kết nối không hoạt động trước khi tường lửa buộc sự cố. Ví dụ:một khách hàng đang sử dụng trình điều khiển C #, đặt MongoDefaults.MaxConnectionIdleTime đến một phút và nó đã giải quyết các vấn đề của họ.

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);

Bản thân mã ứng dụng không thay đổi, nhưng bây giờ đằng sau hậu trường, trình điều khiển tích cực tái chế các kết nối nhàn rỗi. Kết quả cũng có thể được nhìn thấy trong nhật ký máy chủ:rất nhiều kết nối bị gián đoạn trong thời gian không hoạt động trong ứng dụng.

Có thêm chi tiết về cách tiếp cận này trong luồng người dùng mongo có liên quan, SocketException sử dụng trình điều khiển C # trên azure.

Lưu giữ

Bạn cũng có thể giải quyết vấn đề bằng cách làm cho các kết nối của bạn ít nhàn rỗi hơn với một số loại lưu trữ. Điều này hơi khó thực hiện trừ khi trình điều khiển của bạn hỗ trợ nó ngay lập tức, thường là bằng cách tận dụng TCP Keepalive. Nếu bạn cần tự di chuyển, hãy đảm bảo lấy từng kết nối nhàn rỗi từ nhóm vài phút một lần và đưa ra một số lệnh đơn giản và rẻ tiền, có thể là ping.

Xử lý ngắt kết nối

Đôi khi, việc ngắt kết nối có thể xảy ra ngay cả khi không có thiết lập tường lửa tích cực. Trước khi đi vào sản xuất, bạn muốn đảm bảo xử lý chúng một cách chính xác.

Đầu tiên, hãy đảm bảo bật tự động kết nối lại. Cách thực hiện khác nhau giữa các trình điều khiển, nhưng khi trình điều khiển phát hiện ra rằng một hoạt động không thành công do kết nối bị lỗi, việc bật tự động kết nối lại sẽ yêu cầu người lái cố gắng kết nối lại.

Nhưng điều này không hoàn toàn giải quyết được vấn đề. Bạn vẫn còn vấn đề về việc phải làm gì với thao tác không thành công đã kích hoạt kết nối lại. Tự động kết nối lại không tự động thử lại các thao tác không thành công. Điều đó sẽ rất nguy hiểm, đặc biệt là đối với những bài viết. Vì vậy, thường một ngoại lệ được đưa ra và ứng dụng được yêu cầu xử lý nó. Thường thì việc thử lại các lần đọc là điều không cần bàn cãi. Nhưng việc viết thử lại cần được xem xét cẩn thận.

Phiên shell mongo bên dưới giải thích sự cố. Theo mặc định, shell mongo đã được bật tự động kết nối lại. Tôi chèn một tài liệu vào một bộ sưu tập có tên là stuff sau đó tìm tất cả các tài liệu trong bộ sưu tập đó. Sau đó, tôi đặt hẹn giờ trong ba mươi phút và thử lại cùng một tìm kiếm. Nó không thành công, nhưng shell tự động kết nối lại và khi tôi thử lại ngay lập tức, tôi thấy nó hoạt động như mong đợi.

% mongo ds012345.mongolab.com:12345/mydatabase -u *** -p *** 
MongoDB shell version: 2.2.2 
connecting to: ds012345.mongolab.com:12345/mydatabase 
> db.stuff.insert({}) 
> db.stuff.find() 
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") } 
> db.stuff.find() 
Fri Jan 18 13:29:28 Socket recv() errno:60 Operation timed out 192.168.1.111:12345 
Fri Jan 18 13:29:28 SocketException: remote: 192.168.1.111:12345 error: 9001 socket exception [1] server [192.168.1.111:12345] 
Fri Jan 18 13:29:28 DBClientCursor::init call() failed 
Fri Jan 18 13:29:28 query failed : mydatabase.stuff {} to: ds012345.mongolab.com:12345 
Error: error doing query: failed 
Fri Jan 18 13:29:28 trying reconnect to ds012345.mongolab.com:12345 
Fri Jan 18 13:29:28 reconnect ds012345.mongolab.com:12345 ok 
> db.stuff.find() 
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }

Chúng tôi ở đây để trợ giúp

Tất nhiên, nếu bạn có bất kỳ câu hỏi nào, vui lòng liên hệ với chúng tôi theo địa chỉ [email protected] Chúng tôi sẵn sàng trợ giúp.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Chuẩn bị máy chủ MongoDB để sản xuất

  2. Làm tròn đến 2 chữ số thập phân bằng cách sử dụng khung tổng hợp MongoDB

  3. heroku mongohq và mongoid Mongo ::ConnectionFailure

  4. Lỗi PHP Mongo đọc từ ổ cắm

  5. Sao lưu MongoDB tự động