2016-04-26 16 views
6

Tôi gặp lỗi socket 110 (Kết nối hết thời gian) khi cơ sở dữ liệu Mongo (phiên bản 3.0.5) được nhân rộng từ máy chủ DB chính sang nô lệ, chính xác hơn tại thời điểm cam kết sao chép của cơ sở dữ liệu đó (nhật ký của nô lệ là dưới đây). Tôi đoán có lẽ lý do cho rằng đó là cơ sở dữ liệu lớn và gửi hoạt động để cam kết phải mất quá nhiều thời gian.Cách xác định thời gian chờ socket cho bản sao nô lệ máy chủ MongoDB

Tôi có thể chỉ định thời gian chờ socket khác nhau cho máy chủ mongo như thế nào? Nếu không thể, có cách nào khác để sửa chữa sao chép không?

Tôi đã tìm thấy tùy chọn như vậy chỉ dành cho khách hàng mongo (tùy chọn chuỗi kết nối socketTimeoutMS) nhưng nó không hỗ trợ máy chủ Mongo.

2016-04-26T13:36:34.693+0100 I INDEX [rsSync]   done building bottom layer, going to commit  
2016-04-26T13:36:34.693+0100 I INDEX [rsSync] build index done. scanned 30980334 total records. 4072 secs  
2016-04-26T13:36:34.772+0100 I REPL  [rsSync] initial sync cloning db: {skipped db name}  
2016-04-26T13:36:34.823+0100 I NETWORK [rsSync] Socket say send() errno:110 Connection timed out {skipped ip}:27017  
2016-04-26T13:36:34.828+0100 E REPL  [rsSync] 9001 socket exception [SEND_ERROR] server [{skipped ip}:27017]  
2016-04-26T13:36:34.828+0100 E REPL  [rsSync] initial sync attempt failed, 9 attempts remaining 

Cập nhật. Tôi đã yêu cầu đầu ra của rs.status() trong ý kiến:

{  "set" : "<skippedsetname>", 
     "date" : ISODate("2016-05-04T15:35:06.717Z"), 
     "myState" : 5, 
     "syncingTo" : "<skipped domain name of other server>:27017", 
     "members" : [ 
       { 
         "_id" : 0, 
         "name" : "<skipped domain name of this server>:27017", 
         "health" : 1, 
         "state" : 5, 
         "stateStr" : "STARTUP2", 
         "uptime" : 29, 
         "optime" : Timestamp(0, 0), 
         "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 
         "syncingTo" : "<skipped domain name of other server>:27017", 
         "configVersion" : 9, 
         "self" : true 
       }, 
       { 
         "_id" : 2, 
         "name" : "10.0.1.7:27017", 
         "health" : 1, 
         "state" : 7, 
         "stateStr" : "ARBITER", 
         "uptime" : 26, 
         "lastHeartbeat" : ISODate("2016-05-04T15:35:05.859Z"), 
         "lastHeartbeatRecv" : ISODate("2016-05-04T15:35:06.347Z"), 
         "pingMs" : 3, 
         "configVersion" : 9 
       }, 
       { 
         "_id" : 3, 
         "name" : "<skipped domain name of other server>:27017", 
         "health" : 1, 
         "state" : 1, 
         "stateStr" : "PRIMARY", 
         "uptime" : 26, 
         "optime" : Timestamp(1462376105, 196), 
         "optimeDate" : ISODate("2016-05-04T15:35:05Z"), 
         "lastHeartbeat" : ISODate("2016-05-04T15:35:05.859Z"), 
         "lastHeartbeatRecv" : ISODate("2016-05-04T15:35:06.086Z"), 
         "pingMs" : 4, 
         "electionTime" : Timestamp(1461688501, 1), 
         "electionDate" : ISODate("2016-04-26T16:35:01Z"), 
         "configVersion" : 9 
       } 
     ], 
     "ok" : 1 } 

Update. Tôi nên nhưng không đề cập đến lưu trữ được sử dụng là Azure. Answer and explanation là hoàn toàn googled bởi truy vấn "azure mongodb kết nối timeout". Lỗi của tôi.

+1

Bạn đang yêu cầu một giải pháp dựa trên phỏng đoán của bạn "Tôi đoán có lẽ lý do là cơ sở dữ liệu lớn và gửi hoạt động để cam kết mất quá nhiều thời gian". Tôi đoán điều này là không đúng, và bạn vấn đề là một vấn đề mạng. Bạn có thể 'telnet {skipped ip} 27017' không? –

+0

@ HéctorValverdePareja Có, tôi đã thử và có thể telnet trên IP và cổng đó. Hơn nữa, như tôi đã nói, lỗi được đề cập xảy ra sau khi bản sao cá thể tải xuống tất cả dữ liệu của cơ sở dữ liệu như được thấy trong nhật ký. Vì vậy, nó là lạ mà nó có thể kết nối với ổ cắm để tải dữ liệu nhưng sau đó không thể kết nối với cùng một cổng cho cam kết hoạt động đó. – boqapt

+0

Và đầu ra của 'rs.status()' là gì? –

Trả lời

2

Giả định nguyên nhân của lỗi là sai.

  • Connection timed out: Trong khi cố thiết lập kết nối TCP, không có phản hồi nào đến từ phía bên kia trong thời hạn nhất định.

Nói cách khác, đó là vấn đề trong việc thiết lập ổ cắm và không phải là vấn đề phải mất bao lâu để nhân rộng cơ sở dữ liệu.

Điều chỉnh thời gian chờ TCP là cài đặt hệ thống chứ không phải điều bạn làm trên mỗi ứng dụng. Các cài đặt, trên linux, nằm trong toàn hệ thống /etc/sysctl.conf và bạn có thể play around với net.ipv4.tcp_syn_retries - Tuy nhiên bạn hầu như không bao giờ thay đổi thời gian chờ thiết lập ổ cắm (cho bất kỳ chương trình nào, bao gồm cả mongo) và một vài lần tôi có thay đổi nó nó đã làm cho nó ngắn hơn để có được lỗi nhanh hơn, thay vì tăng nó - tăng nó không có khả năng là giải pháp đúng trong bất kỳ ứng dụng trần thế nào.

Sự cố là sự cố cấu hình - như bạn có một số địa chỉ IP xấu trong quá trình thiết lập của bạn hoặc sự cố mạng, như tường lửa xấu, bảng định tuyến hoặc công tắc mạng đôi khi không hoạt động trong 60-120 giây tại một thời điểm.

+0

Đúng, tôi hiểu sai mã lỗi. Nhưng lỗi được đề cập xảy ra sau khi bản sao cá thể tải xuống tất cả dữ liệu của cơ sở dữ liệu như được thấy trong nhật ký. Có vẻ như nó có thể kết nối với ổ cắm để tải xuống dữ liệu nhưng sau đó không thể kết nối với cùng một cổng để thực hiện thao tác đó. Đồng thời, bộ bản sao đó tồn tại trong một thời gian dài cho đến khi đồng bộ hóa bị mất. Sau đó tôi bỏ DB trên slave, khởi động lại nó và nó bắt đầu nhận dữ liệu từ primary nhưng không thể commit. Vì vậy, tôi nghi ngờ vấn đề mạng hoặc cấu hình của nó. Có vẻ như vấn đề được kết nối với mongodb, nhưng không phải mạng hoặc OS – boqapt

+0

Chỉ vì bạn có thể kết nối từ A đến B, không ngụ ý rằng bạn có thể kết nối từ B đến A - hướng kết nối sẽ thay đổi tùy thuộc vào người được bầu chính/nút dẫn đầu. Kiểm tra xem 'rs.status()' có giống nhau trên mọi nút hay không và kiểm tra xem bạn có thể nc (hoặc telnet) cho mỗi nút + cổng khác từ mọi máy mongo hay không - mã lỗi đề xuất rõ ràng vấn đề mạng. – Soren

0

Có thể có một số tệp khóa hệ thống tệp trong nô lệ của bạn. Nếu tôi ở nơi bạn, tôi sẽ xóa nút khỏi bản sao, sau đó xóa tất cả các tệp theo dbpath, hãy kiểm tra người dùng mongo có thể truy cập thư mục này và khởi động lại mongod. Một khi nó đang chạy, thêm nó trở lại RS và chờ đợi cho nó. Xem thêm: https://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/#mongod-lock

+0

Tôi hiểu rằng việc xóa các tệp hợp pháp dưới dbpath có liên quan đến các tệp bị khóa trên slave (đã thử điều đó). Nhưng làm thế nào để bạn biện minh cho loại bỏ nô lệ từ bản sao và thêm một lần nữa? – boqapt

+0

Tôi chỉ thấy nó an toàn (Tôi không thể cung cấp cho bạn bất kỳ tài liệu tham khảo nhưng tôi có một bộ nhớ mơ hồ tôi đã đọc nó ở nơi khác). Điều này là để sửa chữa các nút trong sự cô lập bằng cách cắt tất cả các thông tin liên lạc với phần còn lại của bộ bản sao. –

Các vấn đề liên quan