2011-07-04 63 views
9

Tôi hiện đang chạy một trang web do MySQL cung cấp, nơi người dùng quảng cáo và kiếm doanh thu mỗi khi ai đó hoàn thành một. Chúng tôi đăng nhập mỗi lần ai đó xem quảng cáo ("lần hiển thị"), mỗi lần người dùng nhấp vào thêm ("nhấp") và mỗi lần ai đó hoàn tất quảng cáo ("khách hàng tiềm năng").Truy vấn NoSQL & AdHoc - Hàng triệu Hàng Rào

Vì chúng tôi nhận được rất nhiều lưu lượng truy cập, chúng tôi có hàng triệu bản ghi trong mỗi bảng tương ứng. Sau đó, chúng tôi phải truy vấn các bảng này để cho phép người dùng xem số tiền họ kiếm được, vì vậy, chúng tôi sẽ thực hiện nhiều truy vấn trên các bảng với hàng triệu và hàng triệu lần nhiều lần trong một yêu cầu, hàng trăm lần đồng thời.

Chúng tôi đang tìm cách di chuyển khỏi MySQL và đến kho khóa-giá trị hoặc một thứ gì đó dọc theo các dòng đó. Chúng tôi cần thứ gì đó sẽ cho phép chúng tôi lưu trữ tất cả hàng triệu hàng này, truy vấn chúng theo mili giây và QUAN TRỌNG, sử dụng truy vấn adhoc nơi chúng tôi có thể truy vấn bất kỳ cột nào, vì vậy chúng tôi có thể thực hiện những việc như:

FROM FROM WHERE country = 'Mỹ' VÀ user_id = 501 (các NoSQL tương đương, rõ ràng)

TỪ nhấp chuột ĐÂU ad_id = 1952 VÀ user_id = 200 VÀ country = 'GB'

, vv

có ai có bất cứ đề nghị tốt ? Tôi đã xem xét MongoDB hoặc CouchDB nhưng tôi không chắc liệu họ có thể xử lý truy vấn hàng triệu bản ghi nhiều lần trong một giây hay không và loại truy vấn adhoc chúng tôi cần.

Cảm ơn!

+0

Dữ liệu của bạn trông như thế nào? – NightWolf

+0

1.) Có hàng trăm bản ghi cho mỗi người dùng hay không, mỗi người dùng chỉ có một số rất ít? 2.) Hầu hết các truy vấn có chứa điều kiện user_id không? 3.) Có phải số liệu thống kê trên toàn bộ tập dữ liệu thời gian quan trọng không? (Có lẽ không có gì người dùng được xem) 4.) Bạn có cần tập hợp kết quả được sắp xếp (ví dụ: theo thứ tự bảng chữ cái theo quốc gia) không? Dù bằng cách nào, bạn nên cung cấp cho [ArangoDB v2.6] sắp tới (http://arangodb.org/) một thử! – CoDEmanX

Trả lời

1

Nếu bộ làm việc của bạn có thể vừa với bộ nhớ và bạn lập chỉ mục các trường phù hợp trong tài liệu, bạn đã sẵn sàng. Yêu cầu của bạn không phải là một cái gì đó rất điển hình và tôi chắc chắn với phần cứng thích hợp, thiết kế bộ sưu tập đúng (denormalize!) Và lập chỉ mục bạn nên được tốt để đi. Đọc trên Truy vấn Mongo và sử dụng explain() để kiểm tra các truy vấn. Tránh xa các điều khoản INNOT IN đó là đề xuất của tôi.

+0

+1 "Phần cứng thích hợp" - một điểm tuyệt vời! Phần mềm tuyệt vời * có thể * chạy trên phần cứng humdrum, nhưng kết quả thử nghiệm đáng thất vọng không nên được ghim trên phần mềm. – JasonSmith

5

Với những yêu cầu đó, có lẽ bạn nên gắn bó với SQL và thiết lập sao chép/phân cụm nếu bạn gặp sự cố tải. Bạn có thể thiết lập lập chỉ mục trên cơ sở dữ liệu tài liệu để các truy vấn đó có thể thực hiện được, nhưng bạn không thực sự đạt được bất kỳ thứ gì trên hệ thống hiện tại của mình.

Các hệ thống NoSQL thường cải thiện hiệu suất bằng cách loại bỏ một số tính năng phức tạp hơn của các hệ thống quan hệ. Điều này có nghĩa là chúng sẽ chỉ giúp ích nếu kịch bản của bạn không yêu cầu các tính năng đó. Chạy truy vấn đặc biệt trên dữ liệu bảng là chính xác những gì SQL được thiết kế cho.

+1

+1 Công cụ thích hợp cho đúng công việc. Những người viết tiền lương thường hỏi những câu hỏi khó chịu. Họ không quan tâm nếu câu hỏi của họ là "có thể mở rộng" hay không. Cơ sở dữ liệu quan hệ thực sự nổi trội khi trả lời bất kỳ câu hỏi có thể hiểu được (được hình thành tốt) nào mà không cần cảnh báo trước. – JasonSmith

+0

Đồng ý công cụ phù hợp cho công việc. Nhưng viết một chương trình MapReduce làm những điều đặc biệt không phức tạp một khi bạn hiểu nó và vượt qua đường cong học tập. Viết công việc phân tích Ad-hoc thật tuyệt vời, bạn có thể giữ tất cả dữ liệu của mình ở một nơi, không cần phải chơi trò đố chữ với kho dữ liệu (ví dụ: di chuyển dữ liệu cũ ra vv). Với phân vùng SQL, bạn có thể quay trở lại một vài năm trước khi hiệu suất giảm xuống, với hệ thống NoSQL được thiết kế tốt, bạn có thể truy vấn hàng thập kỷ và nhận được câu trả lời trong vài giờ không phải ngày mai, trông tuyệt vời và làm cho doanh nghiệp vui vẻ & không vội vã trên dữ liệu cũ .. – NightWolf

2

Bản đồ/giảm của CouchDB là gia tăng có nghĩa là nó chỉ xử lý tài liệu một lần và lưu trữ kết quả.

Giả sử, trong một khoảnh khắc, CouchDB là cơ sở dữ liệu chậm nhất trên thế giới. Truy vấn đầu tiên của bạn với hàng triệu hàng có thể mất 20 giờ. Nghe thật kinh khủng. Tuy nhiên, truy vấn thứ hai của bạn, truy vấn thứ ba của bạn, truy vấn thứ tư của bạn và truy vấn thứ 100 của bạn sẽ mất 50 mili giây, có thể là 100 bao gồm cả độ trễ mạng và HTTP.

Bạn có thể nói CouchDB không đạt được điểm chuẩn nhưng nhận được danh dự trong trường gõ cứng.

Tôi sẽ không lo lắng về hiệu suất, mà đúng hơn là nếu CouchDB có thể đáp ứng các yêu cầu truy vấn đặc biệt của bạn. CouchDB muốn biết những truy vấn nào sẽ xảy ra, vì vậy nó có thể thực hiện công việc khó khăn trước khi truy vấn đến. Khi truy vấn không đến, câu trả lời đã được chuẩn bị sẵn sàng và hết nó!

Tất cả các ví dụ của bạn có thể với CouchDB. Một cái gọi là hợp nhất tham gia (rất nhiều điều kiện bình đẳng) là không có vấn đề gì. Tuy nhiên CouchDB không thể hỗ trợ nhiều truy vấn bất bình đẳng cùng một lúc. Bạn không thể yêu cầu CouchDB, trong một truy vấn duy nhất, cho người dùng từ 18-40 tuổi cũng đã nhấp ít hơn 10 lần.

Điều tuyệt vời về giao diện HTTP và Javascript của CouchDB là, thật dễ dàng để thực hiện một nghiên cứu khả thi nhanh chóng. Tôi đề nghị bạn thử nó!

+0

Ngoài ra, Couchbase đang làm việc trên một máy chủ CouchDB/Membase lai. Membase, cơ sở dữ liệu chạy Farmville, được ngưỡng mộ (trong số những thứ khác) kết quả truy vấn phụ phần nghìn giây. Tuy nhiên, sản phẩm lai này không tồn tại. – JasonSmith

+0

Thú vị, tôi không biết điều đó. MongoDB có cùng vấn đề với truy vấn đầu tiên không? Ngoài ra, có phải mất một thời gian trong lần đầu tiên bạn chạy truy vấn với một số cột nhất định, một số thông số nhất định cho các cột hay chỉ mỗi khi dữ liệu được cập nhật? Cảm ơn bạn đã giúp đỡ! –

+0

+1 Lập chỉ mục CouchDb không nhanh. Nhưng chỉ số được xây dựng theo từng bước và, khi được xây dựng, truy vấn sẽ rất nhanh. –

1

Nó thực sự phụ thuộc vào tập hợp dữ liệu của bạn. Quy tắc số một cho thiết kế NoSQL là xác định kịch bản truy vấn của bạn trước tiên. Một khi bạn thực sự hiểu cách bạn muốn truy vấn dữ liệu thì bạn có thể xem xét các giải pháp NoSQL khác nhau. Đơn vị phân phối mặc định là khóa. Vì vậy, bạn cần phải nhớ rằng bạn cần có khả năng tách dữ liệu giữa các nút của bạn một cách hiệu quả nếu không bạn sẽ kết thúc với một hệ thống có thể mở rộng theo chiều ngang với tất cả công việc vẫn đang được thực hiện trên một nút (mặc dù các truy vấn tốt hơn tùy thuộc vào từng trường hợp).

Bạn cũng cần suy nghĩ lại về định lý CAP, hầu hết các cơ sở dữ liệu NoSQL đều nhất quán (CP hoặc AP) trong khi DBMS quan hệ truyền thống là CA. Điều này sẽ tác động đến cách bạn xử lý dữ liệu và tạo ra một số thứ nhất định, ví dụ thế hệ khóa có thể trở nên phức tạp.

Cũng nên nhớ hơn một số hệ thống như HBase không có khái niệm lập chỉ mục. Tất cả các chỉ mục của bạn sẽ cần phải được xây dựng bởi logic ứng dụng của bạn và mọi bản cập nhật và các lần xóa sẽ cần được quản lý như vậy. Với Mongo bạn thực sự có thể tạo các chỉ mục trên các trường và truy vấn chúng một cách tương đối nhanh chóng, cũng có khả năng tích hợp Solr với Mongo. Bạn không chỉ cần truy vấn bằng ID trong Mongo như bạn làm trong HBase, đó là một họ cột (còn gọi là cơ sở dữ liệu kiểu Google BigTable), nơi bạn về cơ bản có cặp khóa-giá trị lồng nhau.

Vì vậy, một lần nữa, dữ liệu của bạn, thứ bạn muốn lưu trữ, cách bạn dự định lưu trữ và quan trọng nhất là cách bạn muốn truy cập dữ liệu đó. Dự án Lily trông rất hứa hẹn. Công việc tôi tham gia với chúng tôi lấy một lượng lớn dữ liệu từ web và lưu trữ, phân tích, phân tích, phân tích, phân tích, truyền, cập nhật, v.v. Chúng tôi không chỉ sử dụng một hệ thống mà nhiều phù hợp nhất với công việc trong tầm tay. Đối với quy trình này, chúng tôi sử dụng các hệ thống khác nhau ở các giai đoạn khác nhau vì nó cho phép chúng tôi truy cập nhanh nơi chúng tôi cần, cung cấp khả năng truyền và phân tích dữ liệu theo thời gian thực và quan trọng, theo dõi mọi thứ khi chúng tôi đi (như mất dữ liệu trong sản phẩm hệ thống là một việc lớn). Tôi đang sử dụng Hadoop, HBase, Hive, MongoDB, Solr, MySQL và thậm chí cả các tệp văn bản cũ tốt. Hãy nhớ rằng để sản xuất một hệ thống bằng cách sử dụng các kỹ thuật này là một chút khó khăn hơn so với cài đặt MySQL trên một máy chủ, một số bản phát hành không ổn định và bạn thực sự cần phải làm thử nghiệm của bạn đầu tiên. Vào cuối ngày, nó thực sự phụ thuộc vào mức độ kháng cự kinh doanh và bản chất nhiệm vụ quan trọng của hệ thống của bạn.

Một đường dẫn khác mà không ai đề cập đến là NewSQL - có nghĩa là RDBMS có thể mở rộng theo chiều ngang ... Có một vài ví dụ như cụm MySQL (tôi nghĩ) và VoltDB có thể phù hợp với nguyên nhân của bạn.

Một lần nữa nói đến việc hiểu dữ liệu của bạn và các mẫu truy cập, các hệ thống NoSQL cũng không phải là không quan hệ và có phù hợp hơn với các tập dữ liệu phi quan hệ. Nếu dữ liệu của bạn vốn có quan hệ và bạn cần một số tính năng truy vấn SQL thực sự cần làm những thứ như sản phẩm Cartesian (hay còn gọi là join) thì bạn có thể tốt hơn khi gắn bó với Oracle và đầu tư một thời gian vào việc lập chỉ mục, sharding và hiệu chỉnh.

Lời khuyên của tôi sẽ thực sự phát xung quanh với một vài hệ thống khác nhau.Tuy nhiên đối với trường hợp sử dụng của bạn, tôi nghĩ rằng một cơ sở dữ liệu Column Family có thể là giải pháp tốt nhất, tôi nghĩ có một vài nơi đã thực hiện các giải pháp tương tự cho các vấn đề tương tự (tôi nghĩ NYTimes đang sử dụng HBase để theo dõi số lần nhấp chuột của người dùng). Một ví dụ tuyệt vời khác là Facebook và thích, họ đang sử dụng HBase cho việc này. Có một bài viết thực sự tốt ở đây có thể giúp bạn trên con đường của bạn và giải thích thêm một số điểm ở trên. http://highscalability.com/blog/2011/3/22/facebooks-new-realtime-analytics-system-hbase-to-process-20.html

Điểm cuối cùng là hệ thống NoSQL không phải là tất cả và kết thúc tất cả. Đưa dữ liệu của bạn vào cơ sở dữ liệu NoSQL không có nghĩa là nó sẽ hoạt động tốt hơn MySQL, Oracle hoặc thậm chí là tệp văn bản ... Ví dụ: xem bài đăng trên blog này: http://mysqldba.blogspot.com/2010/03/cassandra-is-my-nosql-solution-but.html

Tôi có thể xem;

MongoDB - Tài liệu - CP

CouchDB - Tài liệu - AP

Redis - Trong ký ức quan trọng có giá trị (gia đình không cột) - CP

Cassandra - Cột gia đình - Có sẵn & Dung sai phân vùng (AP)

HBase - Cột Family - Phù hợp & phân vùng chịu (CP)

Hadoop/Hive - Cũng có một cái nhìn tại Hadoop trực tuyến ...

Hypertable - Một CF CP DB.

VoltDB - Một sản phẩm thực sự đẹp, cơ sở dữ liệu quan hệ được phân phối và có thể hoạt động cho trường hợp của bạn (có thể là một động thái dễ dàng hơn). Họ cũng dường như cung cấp hỗ trợ doanh nghiệp mà có thể phù hợp hơn cho một env sản (ví dụ: cung cấp cho người dùng doanh nghiệp một cảm giác an toàn).

Bất kỳ cách nào là 2c của tôi. Chơi xung quanh với các hệ thống thực sự là cách duy nhất bạn sẽ tìm hiểu những gì thực sự làm việc cho trường hợp của bạn.

2

Hầu hết mọi người có thể khuyên bạn nên MongoDB cho hệ thống theo dõi/phân tích như thế này, vì lý do tốt. Bạn nên đọc chương „MongoDB for Real-Time Analytics” từ sách „MongoDB Definitive Guide”. Tùy thuộc vào kích thước của dữ liệu và nhu cầu mở rộng quy mô của bạn, bạn có thể nhận được tất cả các tính năng lưu trữ, lược đồ miễn phí và tính năng truy vấn đặc biệt. Bạn sẽ cần phải quyết định cho chính mình nếu các vấn đề với độ bền và không thể đoán trước của hệ thống là nguy hiểm cho bạn hay không.

Đối với hệ thống theo dõi đơn giản, Redis sẽ là lựa chọn tốt, cung cấp chức năng phong phú, tốc độ nhanh và độ bền thực. Để có được một cảm giác như thế nào một hệ thống sẽ được thực hiện trong Redis, xem this gist. Nhược điểm là, bạn cần phải xác định tất cả các chỉ số by của chính mình, không thu được chúng „miễn phí”, như trường hợp với MongoDB. Tuy nhiên, không có bữa trưa miễn phí, và các chỉ số MongoDB chắc chắn không phải là bữa trưa miễn phí.

Tôi nghĩ bạn nên có một cái nhìn vào cách ElasticSearch sẽ cho phép bạn:

  • tốc độ Blazing
  • Schema-miễn phí lưu trữ
  • sharding và kiến ​​trúc phân phối
  • nguyên thủy phân tích mạnh mẽ trong dạng facets
  • Dễ dàng triển khai „cửa sổ trượt" -loại lưu trữ dữ liệu với chỉ mục ali ases

Nó nằm trong trái tim một công cụ tìm kiếm toàn văn ", nhưng đừng làm bạn bối rối bởi điều đó. Đọc bài viết „Data Visualization with ElasticSearch and Protovis“ cho trường hợp sử dụng trong thế giới thực của ElasticSearch như một công cụ khai phá dữ liệu.

Có giao diện trên these slides cho trường hợp sử dụng thực tế cho kịch bản cửa sổ trượt.

Có rất nhiều thư viện khách hàng cho ElasticSearch có sẵn, chẳng hạn như Tire cho Ruby, vì vậy thật dễ dàng để nhanh chóng thoát khỏi bản mẫu bằng một mẫu thử nghiệm.

Đối với hồ sơ (với tất cả sự tôn trọng đối với @jhs :), dựa trên kinh nghiệm của tôi, tôi không thể tưởng tượng một triển khai trong đó Couchdb là một lựa chọn khả thi và hữu ích. Nó sẽ là một lưu trữ sao lưu tuyệt vời cho dữ liệu của bạn, mặc dù.

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