2012-11-15 32 views
7

Ứng dụng của chúng tôi sử dụng bản sao được lọc CouchDB để di chuyển dữ liệu giữa cơ sở dữ liệu người dùng và cơ sở dữ liệu chính. Như chúng ta đã tăng số lượng người dùng, lặp bắt đầu thất bại với thông điệp nàyTại sao, sau khi tăng max_dbs_open, sao chép vẫn không thành công với "tăng max_dbs_open"?

Source and target databases out of sync. Try to increase max_dbs_open at both servers. 

Chúng tôi đã làm điều đó, tăng số lượng max_dbs_open một số ridiculously cao (10.000) nhưng thất bại và tin nhắn vẫn như cũ. Rõ ràng cái gì khác là sai. Có ai biết nó là gì?

Trả lời

10

Khi nó quay ra, các thông điệp tới increase max_dbs_open là lúc tốt nhất một câu trả lời một phần và lúc tồi tệ nhất là gây hiểu nhầm. Trong trường hợp của chúng tôi, vấn đề không phải là số lượng cơ sở dữ liệu được mở mà rõ ràng là số lượng kết nối HTTP được sử dụng bởi nhiều lần sao chép của chúng tôi.

Mỗi sao chép có thể sử dụng min(worker_processes + 1, http_connections) nơi worker_processes là số lượng công nhân được gán cho mỗi nhân rộng và http_connections là số lượng tối đa các kết nối HTTP được phân bổ cho mỗi nhân rộng như mô tả in this document.

Vì vậy, tổng số lượng kết nối sử dụng là

number of replications * min(worker_processes + 1, http_connections) 

Giá trị mặc định của worker_processes là 4 và giá trị mặc định của http_connections là 20. Nếu có 100 lần lặp lại, tổng số lượng kết nối HTTP được sử dụng bởi sao chép là 500. Một cài đặt khác, max_connections, xác định số lượng kết nối HTTP tối đa mà máy chủ CouchDB sẽ cho phép như được mô tả in this document. Giá trị mặc định là 2048.

Trong trường hợp của chúng tôi mỗi người dùng có hai lần nhắc lại - một từ người sử dụng cơ sở dữ liệu tổng thể và khác từ cơ sở dữ liệu tổng thể cho người dùng. Vì vậy, trong trường hợp của chúng tôi, với cài đặt mặc định, mỗi lần chúng tôi thêm người dùng, chúng tôi đã thêm 10 kết nối HTTP bổ sung cuối cùng sẽ thổi qua mặc định max_connections.

Kể từ lần lặp của chúng tôi là tối thiểu và chỉ có một lượng nhỏ dữ liệu được chuyển từ người dùng đến tổng thể và từ các bậc thầy cho người dùng, chúng tôi đã gọi lại số worker_processes, http_connections, tăng max_connections và tất cả là tốt.

CẬP NHẬT

Một vài phát hiện khác

  1. Nó là cần thiết để nâng cao ulimit về quy trình để cho phép nó có kết nối cởi mở hơn

  2. Tạo lặp quá nhanh cũng gây ra các vấn đề. Nếu tôi quay trở lại nhanh như thế nào tôi tạo ra bản sao mới nó cũng giúp giảm bớt vấn đề. ymmv.

+0

Đã được vấn đề này gây ra bởi vì các lần lặp từ mỗi cơ sở dữ liệu người dùng và các cơ sở dữ liệu tổng thể là giữa hai quá trình CouchDB khác nhau? Tôi đang cố gắng làm một cái gì đó tương tự, nhưng cơ sở dữ liệu người dùng và cơ sở dữ liệu chủ được lưu trữ trên cùng một máy chủ để hy vọng tôi tránh sử dụng bất kỳ IPC nào. – pokstad

0

Đối với tôi lỗi này được tạo bởi vì "instanceStartTime" được cơ sở dữ liệu đích trả về GET /{targetDB}/ không hợp lệ.

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