2012-10-11 18 views
6

Tôi đang làm việc trên một ứng dụng thời gian thực với các đặc điểm sau:Việc chọn/cấu hình cơ sở dữ liệu cho thông lượng cao, đáng tin cậy, phù hợp ghi thông, hy sinh độ trễ

  • Hàng trăm khách hàng sẽ hàng chèn/tài liệu cùng một lúc, mỗi lần chèn một hàng mỗi vài giây.
  • Lớn nhất chỉ thêm; hầu như tất cả các hàng/tài liệu, một khi được chèn vào, sẽ không bao giờ bị thay đổi.
  • Một khách hàng chỉ nên nhìn thấy thành công khi dữ liệu đã được xóa sạch vào đĩa và sau đó đọc tính nhất quán của bạn nên giữ.
  • Khách hàng sẵn sàng chờ theo thứ tự giây để xác nhận - đủ dài để tìm kiếm và ghi nhiều đĩa xảy ra.
  • Có quá nhiều dữ liệu để phù hợp với RAM (loại trừ các tùy chọn như Redis). Nhưng các hàng đã viết trước đây hiếm khi được truy cập, vì vậy nó có thể chấp nhận để không có chúng trong bộ nhớ.
  • Lý tưởng nhất, việc ghi này không được chặn số lần đọc.
  • Cửa hàng khóa-giá trị là tốt, nhưng cần phải có ít nhất một chỉ mục tăng tự động đáng tin cậy.

Nói cách khác (và tl; dr), khách hàng có thể chịu đựng độ trễ, nhưng họ cần rất nhiều thông lượng viết đáng tin cậy - thông lượng nhiều hơn "một ghi là một thao tác đĩa."

Tôi đang hình dung một cơ sở dữ liệu sẽ được thực hiện như sau: chấp nhận (số lượng giới hạn bởi số lượng mô tả tệp) số lượng kết nối TCP, bộ đệm ghi trong bộ nhớ, lô nhật ký của chúng vào đĩa thường xuyên có thể (cùng với các bản cập nhật cho chỉ số tăng tự động) và chỉ trả lời các kết nối TCP đó khi thao tác ghi đĩa được kết hợp hoàn tất. Hoặc nó có thể đơn giản như một cơ sở dữ liệu bằng văn bản lười biếng xuất bản một thông báo rằng nó đã thực hiện ghi đĩa (khách hàng chờ phản hồi lười biếng, sau đó đợi tin nhắn viết báo cáo thành công).

Tôi nghĩ rằng với dung sai độ trễ cao như vậy, điều này không đòi hỏi quá nhiều. Và tôi tưởng tượng rằng những người khác đã gặp vấn đề này, chẳng hạn như các công ty tài chính không có khả năng mất dữ liệu, nhưng có thể đủ khả năng trì hoãn phản hồi cho bất kỳ khách hàng nào.

Thực hiện bất kỳ giải pháp cơ sở dữ liệu nào được kiểm tra chiến đấu như Postgres, CouchDB/Couchbase, hoặc các chế độ hỗ trợ MongoDB hoạt động như thế này?

Trả lời

11

PostgreSQL phải phù hợp với khối lượng công việc này khá tốt; khá nhiều thứ bạn đã chỉ định cũng nằm trong bộ tính năng bình thường của nó. Pg là ACID tuân thủ, hỗ trợ nhóm cam kết giảm chi phí đồng bộ, các nhà văn không chặn độc giả, và nó sử dụng hệ điều hành để lưu vào bộ nhớ đệm vì vậy nó sẽ tự nhiên chỉ giữ bộ dữ liệu nóng trong bộ nhớ.

"Khách hàng sẵn sàng chờ đợi vào thứ tự của giây để xác nhận - thời gian đủ dài cho nhiều đĩa tìm và viết để xảy ra"

Nếu xem xét PostgreSQL ứng dụng của bạn là lý tưởng để một thực sự lớn commit_delay, sẽ giúp ích rất nhiều với việc ghi thông lượng. Bạn không thể sử dụng synchronous_commit = off vì bạn cần xác nhận cam kết trước khi trả lời nhưng bạn chỉ có thể giữ các cam kết xếp hàng trong vài giây để tiết kiệm chi phí đồng bộ hóa.

Nếu bạn sử dụng Pg cho một công việc như thế này, bạn sẽ cần điều chỉnh điểm kiểm tra để đảm bảo rằng các trạm kiểm soát không gian hàng I/O. Hãy chắc chắn rằng các bgwriter đang tích cực viết ra bộ đệm bẩn. Đảm bảo autovaccum đang chạy thường xuyên - bạn không xóa từ các bảng, nhưng các chỉ mục vẫn cần bảo trì và do đó, thực hiện thống kê bảng.

Nếu bạn đang mong nhiều dữ liệu và truy vấn của bạn thường có một yếu tố thời gian, hãy xem xét partitioning the table vào khối của (nói) 1 tháng cho năm 1, củng cố tất cả mọi thứ lớn hơn 12 tháng vào các bảng phân vùng theo năm. Pg chỉ có phân vùng dựng sẵn giới hạn (nó bị tấn công với nhau bằng cách sử dụng thừa kế và loại trừ ràng buộc), do đó bạn phải thực hiện nó bằng tay/tập lệnh bằng trình kích hoạt, nhưng nó thực hiện công việc.

Xem:

+0

Chính xác loại câu trả lời tôi đang tìm kiếm! Tôi có một chút được đưa ra bởi tài liệu nói rằng 'Vì tất cả dữ liệu cam kết đang chờ xử lý sẽ được ghi vào mỗi lần xả bất kể cài đặt này, hiếm khi thêm trễ bằng cách tăng tham số này sẽ thực sự cải thiện hiệu suất' - nhưng tôi giả định rằng trường hợp sử dụng của tôi là một trong những trường hợp hiếm gặp? Ở mức nào, tôi sẽ cần phải làm rất nhiều việc đọc về điều này và thử nghiệm/điều chỉnh, nhưng điều này có vẻ rất hứa hẹn. – btown

+0

@btown Bạn chắc chắn cần phải kiểm tra và chuẩn bị trước khi đưa ra bất kỳ quyết định nào. Tôi thấy rằng bit trong tài liệu một chút không rõ ràng; Tôi nghi ngờ nó có thể đề cập đến thực tế là bất kỳ cam kết không trì hoãn sẽ gây ra cam kết chậm để tuôn ra đĩa quá. Tôi sẽ quan tâm đến kết quả của bạn. –

+0

@btown BTW, điều tốt nhất duy nhất bạn có thể làm cho loại khối lượng công việc này là để đảm bảo bộ nhớ của bạn có đồng bộ hóa rất nhanh. Bộ điều khiển RAID có bộ nhớ đệm được hỗ trợ bằng pin ở chế độ ghi lại là tùy chọn rẻ nhất. Bạn sẽ không tin sự khác biệt mà nó tạo ra. Một SAN tốt là lựa chọn đắt tiền hơn. Bất cứ điều gì bạn làm, làm * không * chạy loại khối lượng công việc này trên một cái gì đó như EC2. Nếu bạn sử dụng bộ điều khiển RAID với BBU, chúng không giống nhau; điểm chuẩn hoặc yêu cầu trên danh sách gửi thư chung pgsql. Kiểm tra BBU của bạn định kỳ nếu sử dụng một để đảm bảo pin vẫn hoạt động. –