Hiện tại chúng tôi đang xem xét sự thay đổi từ Postgres sang CouchDB cho một ứng dụng giám sát sử dụng. Một số số điện thoại:Cấu trúc tài liệu được đề xuất cho CouchDB
Khoảng 2000 kết nối, được thăm dò sau mỗi 5 phút, cho khoảng 600.000 hàng mới mỗi ngày. Trong Postgres, chúng tôi lưu trữ dữ liệu này, được phân đoạn theo ngày:
t_usage {service_id, dấu thời gian, dữ liệu_in, data_out}
t_usage_20100101 kế thừa t_usage.
t_usage_20100102 kế thừa t_usage. v.v.
Chúng tôi ghi dữ liệu với một proc được lưu trữ lạc quan cho rằng phân vùng tồn tại và tạo phân vùng nếu cần. Chúng ta có thể chèn rất nhanh.
Để đọc các dữ liệu, trường hợp sử dụng của chúng tôi, theo thứ tự tầm quan trọng và hiệu suất hiện tại là:
* Dịch vụ Độc thân, Độc ngày Cách sử dụng: Tốt Performance
* Nhiều dịch vụ, Tháng Cách sử dụng: Hiệu suất nghèo
* Độc thân dịch vụ, Tháng Cách sử dụng: hiệu suất nghèo
* Nhiều dịch vụ, Nhiều tháng: Rất Poor Performance
* Nhiều dịch vụ, đơn ngày: Tốt Performance
này có ý nghĩa bởi vì các phân vùng được tối ưu hóa trong nhiều ngày, đó là cho đến nay chúng tôi nhất imp trường hợp sử dụng ortant. Tuy nhiên, chúng tôi đang xem xét các phương pháp cải thiện các yêu cầu phụ.
Chúng tôi thường cần phải tham số truy vấn theo giờ, ví dụ: chỉ cho kết quả từ 8 giờ sáng đến 6 giờ tối, vì vậy bảng tóm tắt bị hạn chế sử dụng. (Các tham số này thay đổi với tần suất đủ để tạo ra nhiều bảng tóm tắt dữ liệu bị cấm).
Với nền tảng đó, câu hỏi đầu tiên là: CouchDB có phù hợp với dữ liệu này không? Nếu có, cho các trường hợp sử dụng ở trên, làm cách nào để mô hình hóa dữ liệu tốt nhất trong các tài liệu CouchDB? Một số tùy chọn Tôi đã đi lại với nhau cho đến nay, trong đó chúng tôi đang trong quá trình chuẩn là (_id, _rev tự túc):
Một tài liệu mỗi kết nối mỗi ngày
{
service_id:555
day:20100101
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
Khoảng 60.000 tài liệu mới một tháng. Hầu hết dữ liệu mới sẽ là bản cập nhật cho các tài liệu hiện có, thay vì các tài liệu mới.
(Ở đây, các đối tượng được sử dụng được đánh dấu trên dấu thời gian của cuộc thăm dò và giá trị byte vào và ra ngoài).
Một tài liệu mỗi kết nối mỗi tháng
{
service_id:555
month:201001
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
Khoảng 2.000 tài liệu mới một tháng. Cập nhật trung bình cho các tài liệu hiện có được yêu cầu.
Một tài liệu mỗi Row của dữ liệu thu thập
{
service_id:555
timestamp:1265248762
in:584
out:11342
}
{
service_id:555
timestamp:1265249062
in:94
out:1242
}
Khoảng 15.000.000 tài liệu mới một tháng. Tất cả dữ liệu sẽ là một chèn vào một tài liệu mới. Chèn nhanh hơn, nhưng tôi có câu hỏi về mức độ hiệu quả của nó sau một năm hoặc 2 năm với hàng trăm triệu tài liệu. Các tập tin IO sẽ có vẻ prohibitive (mặc dù tôi là người đầu tiên thừa nhận tôi không hoàn toàn hiểu được cơ chế của nó).
Tôi đang cố gắng tiếp cận điều này theo cách hướng tài liệu, mặc dù phá vỡ thói quen RDMS rất khó :) Thực tế bạn chỉ có thể tối thiểu tham số hóa cũng như có chút lo ngại. Điều đó nói rằng, điều nào ở trên sẽ là thích hợp nhất? Có các định dạng khác mà tôi chưa xem xét sẽ thực hiện tốt hơn không?
Xin cảm ơn trước,
Jamie.
CouchDB sẽ khởi chạy nhiều quy trình hệ thống cho máy chủ chế độ xem để xử lý chế độ xem, do đó, quy mô này chỉ hoạt động tốt trên nhiều lõi. Phần còn lại của CouchDB là ở Erlang và rất tuyệt khi sử dụng nhiều lõi. – mikeal
Bạn nói đúng. Tôi chạy một thử nghiệm, và tôi chèn 2000 của các tài liệu lớn (20 quy trình chèn 100 mỗi, đồng thời) vào một ví dụ Couch v0.9. Trên một Mac Core 2.66G 4 lõi, chúng được chèn vào cơ bản 3m30s. Couch chiếm 350% CPU. Cuối cùng tập tin đĩa là ~ 2G. Ngay cả sau khi nén chặt, nó hầu như không thay đổi chút nào. Ngược lại, chèn 2000 tài liệu "một ngày" mất ~ 18 giây. Nhanh hơn nhiều, tất nhiên. 3m30s quá gần cửa sổ 5m mà chúng có. 18 tuổi tốt hơn nhiều. Tuy nhiên, việc thu gọn mất gần 3m. –
Cảm ơn rất nhiều vì điều này, đây là một nơi tuyệt vời để bắt đầu. Chúng tôi đã chạy một số điểm chuẩn và tìm thấy nhiều điểm giống như bạn có. Vấn đề chính chúng ta sẽ có là các cập nhật liên tục cho dữ liệu - có vẻ như nó sẽ bị chậm nghiêm trọng đối với các tài liệu "toàn bộ tháng". Miễn là chúng tôi có thể thường xuyên nhỏ gọn, hy vọng chúng tôi sẽ ổn. Đó là một sự xấu hổ chúng tôi không thể đi cho một tài liệu cho mỗi điểm dữ liệu, nhưng như bạn nghi ngờ các tập tin IO có vẻ cấm. Thật không may để cập nhật bất kỳ loại tài liệu nào khác, chúng ta cần phải đọc trước khi chúng ta có thể viết, để có được _rev ... – majelbstoat