2011-06-23 47 views
5

Tôi đang làm việc trên một dự án là chúng tôi đang tải hàng loạt và lưu trữ khối lượng lớn dữ liệu trong cơ sở dữ liệu Oracle liên tục được truy vấn qua Hibernate so với bảng 100 triệu bản ghi này. thường xuyên hơn nhiều so với viết). Để tăng tốc mọi thứ, chúng tôi đang sử dụng Lucene cho một số truy vấn (đặc biệt là các truy vấn hộp giới hạn địa lý) và bộ nhớ cache cấp hai Hibernate nhưng điều đó vẫn chưa đủ. Chúng tôi vẫn có nút cổ chai trong các truy vấn Hibernate đối với Oracle (chúng tôi không lưu trữ 100 triệu triệu thực thể bảng trong bộ đệm ẩn cấp độ Hibernate thứ hai do thiếu bộ nhớ đó nhiều).Cách tiếp cận NoSQL tốt nhất để xử lý hơn 100 triệu bản ghi

Giải pháp NoSQL bổ sung nào (ngoài Lucene) tôi có thể tận dụng trong trường hợp này?

Một số tùy chọn Tôi đang nghĩ đến là:

  1. Sử dụng phân phối ehcache (Terracotta) cho Hibernate mức thứ hai để tận dụng thêm bộ nhớ trên máy và giảm lưu trữ trùng lặp (ngay bây giờ mỗi VM có bộ nhớ cache riêng của mình).

  2. Để sử dụng hoàn toàn trong bộ nhớ cơ sở dữ liệu SQL như H2 nhưng tiếc là các giải pháp đó yêu cầu tải 100+ triệu bảng vào một máy ảo.

  3. Sử dụng Lucene để truy vấn và BigTable (hoặc hashmap được phân phối) để tra cứu thực thể theo id. Việc triển khai BigTable nào sẽ phù hợp với điều này? Tôi đang xem xét HBase.

  4. Sử dụng MongoDB để lưu trữ dữ liệu và để truy vấn và tra cứu theo id. nhóm

+1

Bạn có thể phân phát dữ liệu không? –

+2

Nếu tra cứu bằng ID là một lựa chọn tiềm năng với BigTable hoặc MongoDB, tại sao nó không phải là một lựa chọn tiềm năng với SQL? –

+0

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

Trả lời

0

bạn có thể yêu cầu & chia chúng đặc trưng cho một tập hợp các dữ liệu & có một duy nhất (hoặc một nhóm các máy chủ) quá trình đó, ở đây bạn có thể có các dữ liệu có sẵn trong bộ nhớ cache để cải thiện hiệu suất.

ví dụ

nói, nhân viên & dữ liệu sẵn có được xử lý bằng 10 bảng, chúng có thể bị xử lý b một nhóm nhỏ các máy chủ (s) khi bạn cấu hình bộ nhớ cache hibernate để tải & yêu cầu xử lý.

để làm việc này, bạn cần cân bằng tải (cân bằng tải theo kịch bản kinh doanh).

không chắc chắn có thể triển khai bao nhiêu ở đây.

6

đề xuất Cassandra với ElasticSearch cho hệ thống có thể mở rộng (100 triệu không có gì cho chúng). Sử dụng cassandra cho tất cả dữ liệu của bạn và ES cho các truy vấn đặc biệt và địa lý. Sau đó, bạn có thể giết toàn bộ ngăn xếp cũ của mình. Bạn có thể cần một hệ thống MQ như rabbitmq để đồng bộ dữ liệu giữa Cass. và ES.

0

Tại bản ghi 100M, nút cổ chai của bạn có khả năng Hibernate chứ không phải Oracle. Khách hàng của chúng tôi thường xuyên có hàng tỷ hồ sơ trong các bảng thực tế cá nhân của kho dữ liệu dựa trên Oracle của chúng tôi và nó xử lý chúng tốt.

Bạn thực hiện loại truy vấn nào trên bảng của mình?

+0

Đây là ví dụ về thời gian chạy của cùng một phương thức được sửa đổi để sử dụng trong cơ sở dữ liệu bộ nhớ so với Oracle: 116,201ms so với 20ms (116201ms được sử dụng trên oracle.jdbc.driver.OraclePreparedStatement.executeQuery() theo yourkit). Mục tiêu của tôi là đến càng nhiều càng tốt gần 20ms. – tsolakp

+0

@Tsolak Petrosian: Nếu mục tiêu hiệu suất của bạn là hàng chục mili giây cho các tìm kiếm trên một bản ghi 100 triệu lớn vừa phải, bạn có thể nên xem xét cơ sở dữ liệu trong bộ nhớ hoặc bộ đệm thay vì chỉ NoSQL. – Olaf

0

Như bạn đề xuất MongoDB (hoặc bất kỳ giải pháp lưu trữ NoSQL tương tự) nào phù hợp với bạn. Chúng tôi đã chạy thử nghiệm với các tập dữ liệu lớn hơn đáng kể so với bộ dữ liệu bạn đang đề xuất trên MongoDB và nó hoạt động tốt.Đặc biệt là nếu bạn đang đọc shod MongoDB nặng và/hoặc phân phối lần đọc trên các thành viên thiết lập nhân rộng sẽ cho phép bạn tăng tốc độ truy vấn của bạn đáng kể. Nếu usecase của bạn cho phép giữ chỉ mục của bạn đúng cân bằng, mục tiêu của bạn nhận được gần 20ms truy vấn sẽ trở thành khả thi mà không cần thêm bộ nhớ đệm.

1

Bạn cũng nên xem dự án Lily (lilyproject.org). Họ đã tích hợp HBase với Solr. Trong nội bộ họ sử dụng hàng đợi tin nhắn để giữ Solr đồng bộ với HBase. Điều này cho phép họ có tốc độ lập chỉ mục solr (sharding và replication), được hỗ trợ bởi một hệ thống lưu trữ dữ liệu có độ tin cậy cao.

2

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ừ trang 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 Oracle 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.Nhìn vào;

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

VoltDB - Một thực sự tốt tìm sản phẩm, một cơ sở dữ liệu quan hệ được phân phối và có thể làm việc cho bạn trường hợp (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.

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