Mnesia: lợi thế và sự khác biệt


22

Những lợi thế của Mnesia so với các triển khai cơ sở dữ liệu SQL chính và nó khác với chúng như thế nào?

Tôi có thể sử dụng cơ sở dữ liệu để chứa lượng dữ liệu thực sự lớn mà không làm giảm hiệu suất đáng chú ý không?


4
Tôi nghĩ rằng câu hỏi này cần tập trung hơn một chút. Bạn có thể liệt kê các tiêu chí bạn sẽ sử dụng để đánh giá lợi thế hoặc sự khác biệt từ các triển khai cơ sở dữ liệu khác không? Điều này thực sự có vẻ giống như một ứng cử viên cho một bài viết / danh sách wikipedia, không thực sự là một cái gì đó có thể được trả lời ở đây. Ngoài ra, xem xét cách Mnesia thực sự giống với CouchDB, thật không công bằng khi hỏi nó so sánh với các triển khai SQL "chính" như thế nào mà không đặt tên cho các ứng dụng bạn muốn so sánh. So với SQLServer hay Oracle, nó thậm chí không đóng nút-to-nút để thực hiện.
jcolebrand

Câu trả lời:


31

Xin lỗi vì đến bữa tiệc muộn. :) Đây là câu trả lời của tôi, dựa trên việc sử dụng Mnesia từ năm 1996 và các công nghệ cơ sở dữ liệu khác từ năm 1988.

Mnesia và MySQL thực sự là những con thú khác nhau, và con nào là tốt nhất phụ thuộc rất nhiều vào cách bạn định sử dụng nó.

Nếu ứng dụng của bạn được viết bằng Erlang, Mnesia cho phép bạn lưu trữ dữ liệu trong cùng một không gian bộ nhớ với ứng dụng của bạn, điều đó có nghĩa là bạn có thể tìm nạp một đối tượng dữ liệu nhanh chóng trong vài micrô giây. Điều này là không thể trong MySQL, vì ứng dụng của bạn và cơ sở dữ liệu sẽ được phân tách trong bộ nhớ. Lý do tại sao Mnesia có thể làm điều này mà vẫn mạnh mẽ, là vì Erlang thực hiện 'bảo vệ' bộ nhớ ở cấp độ ngôn ngữ.

Nhìn chung, cơ sở dữ liệu SQL có xu hướng ủng hộ thông lượng hơn độ trễ và khi nói đến độ trễ, Mnesia + Erlang thường nổi bật. Bạn cần phải quyết định cái nào là quan trọng nhất với bạn. Như đã nói trong các tài liệu (ở trên), các ứng dụng mục tiêu của Mnesia là các ứng dụng chuyển mạch viễn thông, trong đó yêu cầu về thời gian đáp ứng, ví dụ như thiết lập cuộc gọi là khoảng 20 ms. Điều này về cơ bản có nghĩa là bạn chỉ có thể đọc từ cơ sở dữ liệu nếu dữ liệu nằm trong bộ nhớ dùng chung, nhưng sẽ tránh ghi vào bộ lưu trữ liên tục trên cơ sở mỗi cuộc gọi thiết lập. OTOH, các ứng dụng này thực tế không cần hỗ trợ truy vấn đặc biệt và không sử dụng các tập dữ liệu rất lớn. Một số công việc đã được thực hiện để mở rộng sự phù hợp của Mnesia cho các miền khác, nhưng đó không phải là ưu tiên của nhóm phát triển Erlang / OTP. Mnesia là những gì nó có, và có khả năng giữ nguyên như vậy.

Trong liên kết ở trên, nơi Mnesia và MySQL được so sánh về tốc độ, người ta cần nhớ rằng đó là trong eJabberd, nó chạy với một máy chủ duy nhất nếu đó là MySQL và chạy một cơ sở dữ liệu được sao chép hoàn toàn nếu đó là Mnesia - và các cụm eJabberd lớn có thể có nhiều như 10 nút erlang trở lên (và do đó, 10 hoặc nhiều bản sao Mnesia). Từ quan điểm dư thừa, điều này khá vô lý và tốn kém, và Mnesia không có nghĩa là buộc bạn phải làm như vậy. Nó rõ ràng cho phép đọc nhanh trên mỗi nút, nhưng ghi sẽ rất tốn kém. Một số so sánh tôi đã đọc đã kết thúc so sánh Mnesia phân tán với MySQL một nút; nếu không cần dự phòng cho MySQL, thì nó cũng không cần thiết cho Mnesia. Mnesia khá linh hoạt trong việc cho phép bạn chọn các mẫu sao chép và vị trí dữ liệu trong suốt đối với ứng dụng.

Mnesia cũng không giới hạn ở mức 2 GB mỗi bảng (mặc dù tùy chọn lưu trữ cụ thể là). Cơ sở dữ liệu Mnesia lớn nhất mà tôi biết có khoảng 600 GB dữ liệu trong (64-bit) RAM + đĩa - mặc dù tôi không khuyến nghị điều này. Mặc dù vậy, mọi thứ lên tới 10-20 GB đều hoàn toàn ổn với phần cứng hiện đại, nhưng bỏ qua hoàn toàn Disc_only_copies và sử dụng Disc_copies - mua thêm RAM nếu bạn phải. Tôi đã suy nghĩ hai lần trước khi sử dụng hỗ trợ shending (mnesia_frag) - nó hoạt động, nhưng hiếm khi gây rắc rối.

Có lẽ sự khác biệt lớn nhất giữa Mnesia và MySQL là chính SQL: Mnesia không thực sự có chức năng tương đương; QLC cung cấp một số hỗ trợ cho các truy vấn đặc biệt, nhưng nó không nằm trong cùng một liên kết với SQL và cũng không phải là mức độ tối ưu hóa truy vấn. Trong công cụ và cung cấp, MySQL cũng vượt trội và nếu bạn cần phân tích, không có câu hỏi nào bạn nên chọn (tức là KHÔNG Mnesia).

Cách tốt nhất để xem Mnesia là một phần mở rộng cho ngôn ngữ Erlang. Nó đặt dữ liệu ngay trong tầm tay của bạn và rất tuyệt vời cho các tập dữ liệu nhỏ nơi cấu trúc dữ liệu và các mẫu truy cập được biết đến. Với mục đích này, sử dụng MySQL cũng khó chịu như sử dụng Mnesia cho những thứ mà MySQL hoạt động tốt nhất.

Hầu hết các ứng dụng nằm ở đâu đó ở giữa và đây là nơi nó trở thành một lời kêu gọi phán xét. Bạn cũng có thể kết thúc bằng cả hai ...


3
Cảm ơn câu trả lời. Đó là lời giải thích tốt nhất mà tôi đã đọc về mnesia.
Akshat Jiwan Sharma

1
Cảm ơn vì đã chia sẻ kinh nghiệm của bạn với chúng tôi, nó có giá trị hơn nhiều so với việc đọc bất kỳ blog nào.
Rahul Gautam

Câu trả lời tuyệt vời, nhưng tôi thậm chí còn bối rối hơn bây giờ.
HIRA THAKUR

Câu trả lời rất kỹ lưỡng. Vì vậy, nếu tôi hiểu chính xác Mnesia này - sẽ hoàn hảo cho một số người trong bộ nhớ Khóa / Giá trị lưu trữ thay vì Memcached hoặc Redis hoặc giải pháp tương tự, nơi bạn chỉ muốn tốc độ và không cần phân tích hoặc lưu trữ "khả năng truy vấn SQL" liên tục? Đối với mọi thứ khác, tôi tốt hơn khi sử dụng một cái gì đó như MariaDB / Postgres hoặc Mongo / Cassandra / RIAK? Để làm rõ - tôi đang học Elixir, không thực sự là Erlang (đến từ nền tảng Ruby / Perl) và cố gắng tìm ra ngăn xếp tốt nhất cho tôi để thay thế Rails / Sinatra bằng MariaDB & Redis
konung

13

Từ tài liệu :

Mnesia là một Hệ thống quản lý cơ sở dữ liệu phân tán, thích hợp cho các ứng dụng viễn thông và các ứng dụng Erlang khác yêu cầu hoạt động liên tục và các thuộc tính thời gian thực mềm. Đây là một phần của Nền tảng viễn thông mở (OTP), là một nền tảng hệ thống điều khiển để xây dựng các ứng dụng viễn thông.

Đặc biệt, mức độ chịu lỗi rất cao được yêu cầu trong nhiều hệ thống không dừng, kết hợp với các yêu cầu trên DBMS để chạy trong cùng một không gian địa chỉ với ứng dụng, đã khiến chúng tôi triển khai một DBMS hoàn toàn mới. gọi là Mnesia. Mnesia được triển khai và kết nối rất chặt chẽ với ngôn ngữ lập trình Erlang và nó cung cấp các chức năng cần thiết để thực hiện các hệ thống viễn thông chịu lỗi. Mnesia là một DBMS phân tán nhiều người dùng đặc biệt dành cho các ứng dụng viễn thông công nghiệp được viết bằng ngôn ngữ lập trình tượng trưng Erlang, cũng là ngôn ngữ mục tiêu dự định. Mnesia cố gắng giải quyết tất cả các vấn đề quản lý dữ liệu cần thiết cho các hệ thống viễn thông điển hình và nó có một số tính năng thường không được tìm thấy trong cơ sở dữ liệu truyền thống.

Trong các ứng dụng viễn thông, có các nhu cầu khác nhau từ các tính năng được cung cấp bởi các DBMS truyền thống. Các ứng dụng hiện được triển khai bằng ngôn ngữ Erlang cần một hỗn hợp gồm nhiều tính năng, thường không được thỏa mãn bởi các DBMS truyền thống. Mnesia được thiết kế với các yêu cầu như sau:

Tra cứu khóa / giá trị thời gian thực nhanh

Các truy vấn phức tạp không theo thời gian thực chủ yếu để vận hành và bảo trì

Dữ liệu phân tán do các ứng dụng phân tán

Khả năng chịu lỗi cao

Cấu hình lại động

Đối tượng phức tạp

Điều khiến Mnesia khác biệt so với hầu hết các DBMS khác là nó được thiết kế với các vấn đề quản lý dữ liệu điển hình của các ứng dụng viễn thông. Do đó Mnesia kết hợp nhiều khái niệm được tìm thấy trong cơ sở dữ liệu truyền thống, chẳng hạn như giao dịch và truy vấn với các khái niệm được tìm thấy trong hệ thống quản lý dữ liệu cho các ứng dụng viễn thông, chẳng hạn như hoạt động thời gian thực rất nhanh, mức độ chịu lỗi có thể định cấu hình (bằng phương pháp sao chép) và khả năng sao chép cấu hình lại hệ thống mà không dừng hoặc tạm dừng nó. Mnesia cũng thú vị do sự kết hợp chặt chẽ với ngôn ngữ lập trình Erlang, do đó gần như biến Erlang thành ngôn ngữ lập trình cơ sở dữ liệu. Điều này có nhiều lợi ích, điều quan trọng nhất là sự không khớp trở kháng giữa định dạng dữ liệu được sử dụng bởi DBMS và định dạng dữ liệu được sử dụng bởi ngôn ngữ lập trình,

Mnesia so với MySQL, hiệu suất :

ejabberd tiêu thụ ít tài nguyên tính toán hơn khi sử dụng một số cơ sở dữ liệu * SQL so với khi sử dụng Mnesia nội bộ. Bạn có thể quan tâm đến chủ đề đó khi bạn có nhiều người dùng đồng thời (ví dụ hơn 1000). Với một vài người dùng đồng thời, mức tiêu thụ CPU của ejabberd là không đáng kể, do đó, quản trị viên của các máy chủ nhỏ không quan tâm đến việc thiết lập máy chủ và cơ sở dữ liệu SQL bên ngoài.

CouchDB v. Mnesia, V. MySQLcác chủ đề Mnesia khác :

Một cái nhìn sâu sắc ngay lập tức xuất hiện là trong khi tôi rõ ràng rõ ràng về cách cấu trúc dữ liệu cho MySQL, thì đối với Mnesia, và đối với CouchDB thì tôi vẫn chưa hoàn toàn chắc chắn về cách tiếp cận tốt nhất. Bây giờ, đây là một vài điểm rõ ràng hơn:

Một 'bản ghi' có trường 'chữ số' rõ ràng cho biết số lần nó đã được phát. Điều này tốt trong MySQL, nhưng nếu tôi kết hợp trường này vào tài liệu cho CouchDB, tôi sẽ nhận được một bản sửa đổi hoàn chỉnh của tài liệu trong cơ sở dữ liệu mỗi khi một số này thay đổi, có vẻ không hiệu quả lắm.

Bố cục ba bảng trong MySQL của các bản ghi, thẻ và bảng liên kết giữa chúng (xem tập lệnh nếu không rõ ràng) rõ ràng là (đối với tôi) rõ ràng là giải pháp đúng, nhưng có nhiều cách có thể thực hiện việc này trong cả Mnesia và CouchDB và tôi thấy tôi không có câu trả lời bằng trực giác.

Nói tóm lại, nó được thiết kế cho mục đích rất cụ thể và dường như được thiết kế phù hợp với mục đích. Không một cơ sở dữ liệu nào có thể được so sánh một cách trừu tượng với cơ sở dữ liệu khác. Chỉ thông qua việc sử dụng các yêu cầu mới có thể tạo ra các yếu tố tương xứng.


4

Không, tôi sẽ không nói rằng Mnesia tốt cho lượng dữ liệu lớn. Bạn có thể chọn sử dụng Ets hoặc Dets làm phụ trợ. Nếu bạn chọn Ets, cơ sở dữ liệu của bạn sẽ chỉ còn trong bộ nhớ và rất nhanh nhưng dữ liệu không liên tục. Và nếu bạn muốn dữ liệu của mình liên tục (được lưu trên đĩa), bạn cần sử dụng Dets, có giới hạn 2GB , vì vậy cơ sở dữ liệu của bạn không thể chứa hơn 2GB dữ liệu.

Bạn có thể sử dụng một phụ trợ tùy chỉnh, ví dụ như innostore được sử dụng trong cơ sở dữ liệu Riak NoQuery .

Ưu điểm của Mnesia là nó là một cơ sở dữ liệu phân tán nên rất dễ thực hiện các hệ thống chịu lỗi nếu bạn có nhiều hơn một máy tính. Và nó rất dễ sử dụng trong Erlang vì đây là cơ sở dữ liệu bằng ngôn ngữ và hoạt động "giống như một chức năng". Và nó cũng cực nhanh nếu bạn chỉ cần một cơ sở dữ liệu trong bộ nhớ, ví dụ như bộ đệm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.