2010-02-25 40 views
56

Đối với một chút nền - câu hỏi này đề cập đến một dự án đang chạy trên một cá thể EC2 nhỏ và sắp chuyển sang một phương tiện trung bình. Các thành phần chính là Django, MySQL và một số lượng lớn các công cụ phân tích tùy chỉnh được viết bằng python và java, làm việc nâng hạng nặng . Cùng một máy đang chạy Apache.Chuyển từ MySQL sang Cassandra - Ưu điểm/Nhược điểm?

Mô hình dữ liệu trông giống như sau - một lượng lớn dữ liệu thời gian thực được truyền trực tiếp từ các cảm biến mạng khác nhau và lý tưởng là tôi muốn thiết lập một cách tiếp cận thăm dò ý kiến ​​dài hơn là cuộc thăm dò hiện tại mỗi 15 phút tiếp cận (giới hạn số liệu thống kê máy tính và viết vào cơ sở dữ liệu). Khi dữ liệu xuất hiện, tôi lưu trữ phiên bản thô trong MySQL, để các công cụ phân tích mất dữ liệu này và lưu trữ số liệu thống kê trong một vài bảng khác. Tất cả điều này được trả lại bằng cách sử dụng Django.

tính năng Relational tôi sẽ cần -

  • Sắp xếp theo [SliceRange trong API Cassandra dường như satisy này]
  • Đoàn tự do
  • quan hệ Manytomany giữa nhiều bảng [Cassandra SuperColumns dường như làm tốt cho một đến nhiều]
  • Nhân sư trên điều này mang lại cho tôi một công cụ văn bản đầy đủ, vì vậy đó cũng là một điều cần thiết. [Trên Cassandra, dự án Lucandra dường như đáp ứng nhu cầu này]

Vấn đề chính của tôi là đọc dữ liệu cực kỳ chậm (và viết không nóng). Tôi không muốn ném rất nhiều tiền và phần cứng vào nó ngay bây giờ, và tôi muốn cái gì đó có thể mở rộng dễ dàng theo thời gian. Theo chiều dọc mở rộng MySQL không phải là tầm thường theo nghĩa đó (hoặc rẻ).

Vì vậy, về cơ bản, sau khi đã đọc rất nhiều về NoSQL và thử nghiệm với những thứ như MongoDB, Cassandra và Voldemort, câu hỏi của tôi là,

  • Trên một thể EC2 trung bình, tôi sẽ đạt được bất kỳ lợi ích trong đọc/ghi bằng cách chuyển sang một cái gì đó như Cassandra? This article (pdf) chắc chắn dường như gợi ý điều đó. Hiện tại, tôi muốn nói vài trăm bài viết mỗi phút sẽ là chuẩn mực. Đối với các lần đọc - vì dữ liệu thay đổi sau mỗi 5 phút hoặc lâu hơn, việc mất hiệu lực bộ nhớ cache phải diễn ra khá nhanh. Tại một số điểm, nó sẽ có thể xử lý một số lượng lớn người dùng đồng thời là tốt. Hiệu suất ứng dụng hiện đang bị giết trên MySQL thực hiện một số phép nối trên các bảng lớn ngay cả khi các chỉ mục được tạo - thứ gì đó theo thứ tự của hàng 32k mất hơn một phút để hiển thị. (Đây có thể là một tạo phẩm của EC2 được ảo hóa I/O). Kích thước của bảng là khoảng 4-5 triệu hàng, và có khoảng 5 bảng như vậy.

  • Mọi người đều nói về việc sử dụng Cassandra trên nhiều nút, với định lý CAP và tính nhất quán cuối cùng. Tuy nhiên, đối với một dự án mới chỉ bắt đầu phát triển, có ý nghĩa không để triển khai một máy chủ cassandra một nút? Có bất kỳ cảnh báo nào không? Ví dụ, nó có thể thay thế MySQL như là một phụ trợ cho Django? [Đây có phải là khuyến cáo không?]

  • Nếu tôi thay đổi, tôi đoán tôi sẽ phải viết lại các phần của ứng dụng để thực hiện nhiều hơn nữa "quản trị" vì tôi phải thực hiện nhiều lần tra cứu để tìm nạp hàng .

  • Nó sẽ làm cho bất kỳ ý nghĩa để chỉ cần sử dụng MySQL như một cửa hàng giá trị quan trọng chứ không phải là một cơ quan hệ, và đi với điều đó? Bằng cách đó tôi có thể sử dụng một số lượng lớn các API ổn định có sẵn, cũng như một công cụ ổn định (và đi quan hệ khi cần thiết). (Bài đăng của Brett Taylor từ nguồn cấp dữ liệu cho bạn bè về điều này - http://bret.appspot.com/entry/how-friendfeed-uses-mysql)

Bất kỳ thông tin chi tiết nào từ những người đã thực hiện ca làm việc sẽ được đánh giá cao!

Cảm ơn.

+0

Tôi khá tò mò nếu bạn đã chuyển sang Cassandra. Tôi đã trên các tuyến đường chuyển đổi từ php và asp.net để django nhưng tôi không chắc chắn nếu là sớm để di chuyển từ mssql và mysql để Cassandra ngay bây giờ. Tôi cũng có hàng trăm bản ghi mỗi giây. – avatar

+0

@itgorilla - Tôi sử dụng cassandra cho một nhiệm vụ rất cụ thể, nơi nó đang hoạt động tốt. Tôi nhận ra rằng việc sử dụng nó cho các cơ sở dữ liệu "chuyển động" có lẽ không phải là một ý tưởng tốt, và kết quả của tôi xác nhận rằng (tôi đồng ý với câu trả lời của codemonkey dưới đây). Vì vậy, nếu bạn muốn thực sự nhanh chóng viết, tìm kiếm và dữ liệu không chuẩn hóa và bạn muốn quy mô, Cassandra là một lựa chọn khá tốt. (Số đầu sẽ được nói, một vài triệu viết một phút!) – viksit

+0

Kiểm tra dự án Django Cassandra này nếu bạn quan tâm: https://github.com/vaterlaus/django_cassandra_backend – Alex

Trả lời

38

Cassandra và các cơ sở dữ liệu được phân phối khác hiện có không cung cấp loại hỗ trợ truy vấn đặc biệt mà bạn đã sử dụng từ sql. Điều này là do bạn không thể phân phối các truy vấn có tham gia một cách hiệu quả, do đó, việc nhấn mạnh là thay đổi chuẩn hóa.

Tuy nhiên, Cassandra 0.6 (beta chính thức ra vào ngày mai, nhưng bạn có thể tự xây dựng từ nhánh 0.6 nếu bạn thiếu kiên nhẫn) hỗ trợ bản đồ/giảm Hadoop cho phân tích, điều này thực sự phù hợp với bạn.

Cassandra cung cấp hỗ trợ tuyệt vời để thêm các nút mới một cách dễ dàng, ngay cả với nhóm ban đầu.

Điều đó nói rằng, với một vài trăm ghi/phút bạn sẽ ổn định trên mysql trong một thời gian dài. Cassandra tốt hơn là một kho khóa/giá trị (thậm chí tốt hơn, key/columnfamily) nhưng MySQL tốt hơn nhiều khi là một cơ sở dữ liệu quan hệ. :)

Không có hỗ trợ django cho Cassandra (hoặc cơ sở dữ liệu nosql khác). Họ đang nói về việc làm một cái gì đó cho phiên bản tiếp theo sau 1.2, nhưng dựa trên nói chuyện với django devs tại pycon, không ai thực sự chắc chắn những gì sẽ trông như thế nào được nêu ra.

+2

Thx cho câu trả lời! Vài điểm - khi bạn nói nhấn mạnh là không chuẩn hóa, về cơ bản có nghĩa là bất kỳ "tham gia" nào cần được thực hiện ở cấp ứng dụng, nhưng cassandra có hiệu lực phân phối truy vấn (giả sử bạn sử dụng Phân vùng ngẫu nhiên)? Thứ hai - tôi đoán tôi đang ở một vài trăm viết ngay bây giờ, nhưng sẽ thay vì chuyển sang một cửa hàng KV vào thời điểm này hơn phải làm điều đó với một vài 100k viết :) Và cuối cùng - thậm chí giả định rằng Django-NOSQL hỗ trợ vẫn không tồn tại, có bất cứ điều gì ngăn chặn truy vấn thời gian thực của db Cassandra thông qua một API REST? – viksit

+4

Định tuyến Cassandra dựa trên khóa hàng, vì vậy bất kỳ truy vấn nào đối với một hàng đơn lẻ chỉ phải nhấn một máy và khá hiệu quả. api khách hàng REST là một người nghèo phù hợp với Cassandra vì nó cho phép dữ liệu nhị phân, nhưng rộng hơn, không có gì ngăn cản bạn sử dụng trình điều khiển Python bình thường từ django theo cách thủ công. – jbellis

19

Nếu bạn là một nhà phát triển cơ sở dữ liệu quan hệ (như tôi), tôi muốn đề nghị/chỉ ra:

  • Nhận được một số kinh nghiệm làm việc với Cassandra trước khi bạn cam kết việc sử dụng nó trên một hệ thống sản xuất .. đặc biệt nếu hệ thống sản xuất đó có thời hạn hoàn thành. Có thể sử dụng nó như là phụ trợ cho một cái gì đó không quan trọng đầu tiên.
  • Điều này chứng tỏ khó khăn hơn tôi dự đoán sẽ làm những việc đơn giản mà tôi đã dành cho các thao tác dữ liệu bằng cách sử dụng các công cụ SQL. Đặc biệt, dữ liệu lập chỉ mục và các bộ kết quả sắp xếp là không nhỏ.
  • Mô hình dữ liệu cũng đã được chứng minh là đầy thử thách. Là một nhà phát triển cơ sở dữ liệu quan hệ bạn đến bàn với rất nhiều hành lý ... bạn cần phải sẵn sàng tìm hiểu cách lập mô hình dữ liệu rất khác nhau.

Những điều này cho biết, tôi đặc biệt khuyên bạn nên xây dựng điều gì đó trong Cassandra. Nếu bạn giống như tôi, thì làm như vậy sẽ thách thức sự hiểu biết của bạn về lưu trữ dữ liệu và làm cho bạn suy nghĩ lại về triển vọng cơ sở dữ liệu quan hệ phù hợp với tất cả các tình huống mà tôi thậm chí không nhận ra rằng tôi đã nắm giữ.

Một số nguồn lực tốt tôi đã tìm thấy bao gồm:

+0

Liên kết tới WTF-is-a-SuperColumn.pdf không hoạt động, có lẽ bạn có một bản sao của nó? – Flo

1

Các Django-cassandra là một chế độ beta sớm. Ngoài ra Django đã không được thực hiện cho cơ sở dữ liệu không có sql. Chìa khóa trong Django ORM dựa trên SQL (Django khuyến cáo sử dụng PostgreSQL). Nếu bạn cần sử dụng ONLY no-sql (bạn có thể trộn sql và no-sql trong cùng một ứng dụng), bạn cần phải sử dụng rủi ro không có sql ORM (nó chậm hơn đáng kể so với SQL truyền thống hoặc sử dụng trực tiếp lưu trữ No-SQL). Hoặc bạn sẽ cần phải viết lại hoàn toàn django ORM. Nhưng trong trường hợp này tôi không thể đoán, tại sao bạn cần Django. Có lẽ bạn có thể sử dụng cái gì khác, như Tornado?

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