주요 SQL 데이터베이스 구현에 비해 Mnesia의 장점과 차이점은 무엇입니까?
눈에 띄는 성능 저하없이 데이터베이스를 사용하여 방대한 양의 데이터를 보유 할 수 있습니까?
주요 SQL 데이터베이스 구현에 비해 Mnesia의 장점과 차이점은 무엇입니까?
눈에 띄는 성능 저하없이 데이터베이스를 사용하여 방대한 양의 데이터를 보유 할 수 있습니까?
답변:
파티에 늦어서 미안해 :) 다음은 1996 년부터 Mnesia를 사용하고 1988 년 이후 다양한 데이터베이스 기술을 사용한 것에 대한 나의 대답입니다.
Mnesia와 MySQL은 실제로 다른 짐승이며, 어느 것이 가장 좋은지는 당신이 그것을 사용하려는 방법에 달려 있습니다.
응용 프로그램이 Erlang으로 작성된 경우 Mnesia를 사용하면 응용 프로그램과 동일한 메모리 공간에 데이터를 저장할 수 있습니다. 즉, 몇 마이크로 초만큼 빠르게 단일 데이터 개체를 가져올 수 있습니다. 애플리케이션과 데이터베이스가 메모리에서 분리되므로 MySQL에서는 불가능합니다. Mnesia가이를 수행하고 여전히 강력한 이유는 Erlang이 언어 수준에서 메모리 '보호'를 구현하기 때문입니다.
전반적으로 SQL 데이터베이스는 대기 시간보다 처리량을 선호하는 경향이 있으며 대기 시간과 관련하여 Mnesia + Erlang이 일반적으로 뛰어납니다. 어느 것이 가장 중요한지 결정해야합니다. 위의 문서에서 말했듯이 Mnesia의 대상 응용 프로그램은 통신 스위칭 응용 프로그램으로, 예를 들어 호출 설정에 대한 응답 시간 요구 사항은 약 20ms였습니다. 이는 본질적으로 데이터가 공유 메모리에있는 경우에만 데이터베이스에서 읽을 수 있지만 호출마다 설정에 따라 영구 저장소에 쓰는 것을 피할 수 있음을 의미했습니다. OTOH에서 이러한 응용 프로그램은 사실상 임시 쿼리 지원이 필요하지 않으며 매우 큰 데이터 세트를 사용하지 않습니다. 다른 도메인에 대한 Mnesia의 적합성을 확장하기 위해 일부 작업이 수행되었지만 Erlang / OTP 개발 팀에게는 우선 순위가 아닙니다. Mnesia는 그것이 무엇이며, 그런 식으로 유지 될 것입니다.
위의 링크에서 Mnesia와 MySQL을 속도와 비교하면 eJabberd에 있다는 것을 기억해야합니다 .eJabberd는 MySQL 인 경우 단일 서버에서 실행되고 Mnesia 인 경우 완전히 복제 된 데이터베이스를 실행합니다. 대규모 eJabberd 클러스터는 최대 10 개 이상의 에를 랑 노드 (따라서 10 개 이상의 Mnesia 복제본). 이중화 관점에서 볼 때 이것은 상당히 말도 안되고 비용이 많이 들며 Mnesia는 결코 그렇게하지 않습니다. 분명히 각 노드에서 악의적 인 빠른 읽기를 제공하지만 쓰기는 매우 비쌉니다. 내가 읽은 몇 가지 비교는 분산 Mnesia를 단일 노드 MySQL과 비교하는 것으로 끝났습니다. MySQL에 중복성이 필요하지 않은 경우 Mnesia에도 필요하지 않습니다. Mnesia는 복제 패턴을 선택할 수있는 유연성이 뛰어나고 데이터 위치는 애플리케이션에 투명합니다.
Mnesia는 테이블 당 2GB로 제한되지 않습니다 (특정 스토리지 옵션 이 있더라도 ). 내가 아는 가장 큰 Mnesia 데이터베이스에는 (64 비트) RAM + 디스크에 약 600GB의 데이터가 있지만 권장하지는 않습니다. 최신 하드웨어에서는 최대 10-20GB까지 완벽하게 사용할 수 있지만 disc_only_copies를 완전히 건너 뛰고 disc_copies를 사용하십시오. 필요한 경우 RAM을 더 구입하십시오. 샤딩 지원 (mnesia_frag)을 사용하기 전에 두 번 생각할 것입니다. 작동하지만 문제가 거의 없습니다.
아마도 Mnesia와 MySQL의 가장 큰 차이점은 SQL 자체 일 것입니다. Mnesia는 실제로 비슷한 기능이 없습니다. QLC는 임시 쿼리에 대한 일부 지원을 제공하지만 SQL과 같은 리그에 있지 않으며 쿼리 최적화 수준도 아닙니다. 툴링 및 프로비저닝에서 MySQL 또한 우수하며 분석이 필요한 경우 어떤 것을 선택해야하는지 의심 할 여지가 없습니다 (예 : NOT Mnesia).
Mnesia를 보는 가장 좋은 방법은 Erlang 언어의 확장입니다. 손끝에 바로 데이터를 넣을 수 있으며 데이터 구조와 액세스 패턴이 잘 알려진 소규모 데이터 세트에 적합합니다. 이를 위해 MySQL을 사용하는 것은 MySQL이 가장 잘 작동하는 것에 Mnesia를 사용하는 것만 큼 불편합니다.
대부분의 응용 프로그램은 그 사이 어딘가에 있으며, 이것이 판단 요청이되는 곳입니다. 둘 다 사용하여 끝날 수 있습니다 ...
로부터 문서 :
Mnesia는 분산 데이터베이스 관리 시스템으로, 통신 응용 프로그램 및 기타 Erlang 응용 프로그램에 적합하며 지속적인 운영 및 소프트 실시간 속성이 필요합니다. 통신 애플리케이션을 구축하기위한 제어 시스템 플랫폼 인 OTP (Open Telecom Platform)의 한 섹션입니다.
특히 많은 논스톱 시스템에서 요구되는 매우 높은 수준의 내결함성, 응용 프로그램과 동일한 주소 공간에서 실행되는 DBMS의 요구 사항과 함께 새로운 DBMS를 구현하게되었습니다. Mnesia라고합니다. Mnesia는 프로그래밍 언어 Erlang으로 구현되고 매우 견고하게 연결되어 있으며 내결함성 통신 시스템의 구현에 필요한 기능을 제공합니다. Mnesia는 특수 프로그래밍 언어 Erlang으로 작성된 산업용 통신 응용 프로그램을 위해 특별히 제작 된 다중 사용자 분산 DBMS로, 대상 언어이기도합니다. Mnesia는 일반적인 통신 시스템에 필요한 모든 데이터 관리 문제를 해결하려고 시도하며 일반적으로 기존 데이터베이스에는없는 많은 기능을 가지고 있습니다.
통신 애플리케이션에서는 기존 DBMS에서 제공하는 기능과는 다른 요구가 있습니다. 현재 Erlang 언어로 구현 된 응용 프로그램에는 일반적으로 기존 DBMS에서는 만족하지 못하는 광범위한 기능이 혼합되어 있어야합니다. Mnesia는 다음과 같은 요구 사항을 염두에두고 설계되었습니다.
빠른 실시간 키 / 값 조회
주로 운영 및 유지 관리를위한 복잡한 비 실시간 쿼리
분산 응용 프로그램으로 인한 분산 데이터
높은 내결함성
동적 재구성
복잡한 객체
Mnesia를 다른 대부분의 DBMS와 차별화하는 것은 통신 애플리케이션의 일반적인 데이터 관리 문제를 염두에두고 설계되었다는 것입니다. 따라서 Mnesia는 트랜잭션 및 쿼리와 같은 기존 데이터베이스에서 발견 된 많은 개념과 매우 빠른 실시간 운영, 구성 가능한 수준의 내결함성 (복제를 통해) 및 통신 능력과 같은 통신 애플리케이션의 데이터 관리 시스템에서 발견 된 개념을 결합합니다. 시스템을 중지하거나 일시 중단하지 않고 재구성하십시오. Mnesia는 Erlang과 프로그래밍 언어가 밀접하게 결합되어있어 Erlang을 데이터베이스 프로그래밍 언어로 거의 바꾸어 놓음으로써 흥미 롭습니다. 여기에는 많은 이점이 있습니다. 무엇보다도 DBMS에서 사용하는 데이터 형식과 프로그래밍 언어에서 사용하는 데이터 형식 사이의 임피던스 불일치가
ejabberd는 내부 Mnesia를 사용할 때보 다 일부 * SQL 데이터베이스를 사용할 때 계산 리소스를 덜 소비합니다. 동시 사용자가 많은 경우 (예 : 1000 명 이상) 해당 주제에 관심이있을 수 있습니다. 동시 사용자가 거의 없으므로 ejabberd의 CPU 소비는 무시할 수 있으므로 소규모 서버 관리자는 외부 SQL 서버 및 데이터베이스를 설정하지 않아도됩니다.
CouchDB v. Mnesia, V. MySQL 및 기타 Mnesia 주제 :
즉시 생각 나는 한 가지 통찰력은 MySQL의 데이터를 구성하는 방법이 나에게 명백한 반면 Mnesia의 경우는 덜하지만 CouchDB의 경우 여전히 최선의 접근 방법을 아직 완전히 확신하지 못한다는 것입니다. 지금은 몇 가지 더 분명한 점이 있습니다.
'레코드'에는 'numplays'필드가있어 몇 번이나 연주했는지 분명히 알 수 있습니다. 이것은 MySQL에서는 괜찮지 만이 필드를 CouchDB의 문서에 통합하면이 숫자가 변경 될 때마다 데이터베이스에서 문서의 완전한 복제본을 얻을 수 있습니다.
MySQL의 레코드, 태그 및 그 사이의 링크 테이블 (테이블이 명확하지 않은 경우 스크립트 참조)의 3 테이블 레이아웃은 (적어도) 올바른 솔루션이지만 분명히이 작업을 수행 할 수있는 많은 방법이 있습니다 Mnesia와 CouchDB 모두에서 직관적으로 답변을 얻지 못했습니다.
요컨대, 그것은 매우 구체적인 목적을 위해 설계되었으며 목적에 맞게 잘 설계 된 것 같습니다. 어떤 데이터베이스도 추상적으로 다른 데이터베이스와 비교할 수 없습니다. 요구 사항의 사용을 통해서만 조화성 요소가 유도 될 수있다.
아니요, Mnesia가 많은 양의 데이터에 적합하다고 말하지는 않습니다. Ets 또는 Dets 를 백엔드 로 사용하도록 선택할 수 있습니다 . Ets를 선택하면 데이터베이스는 메모리 내에서 매우 빠르지 만 데이터는 영구적이지 않습니다. 또한 데이터를 디스크에 저장하여 영구 저장하려면 2GB 제한 이있는 Dets를 사용해야 하므로 데이터베이스에서 2GB 이상의 데이터를 보유 할 수 없습니다.
Riak NoSQL 데이터베이스 에서 사용되는 innostore 와 같은 사용자 정의 백엔드를 사용할 수 있습니다 .
Mnesia의 장점은 분산 데이터베이스이므로 둘 이상의 컴퓨터가있는 경우 내결함성 시스템을 매우 쉽게 수행 할 수 있다는 것입니다. Erlang은 언어 데이터베이스이므로 "함수처럼"작동하기 때문에 Erlang에서 사용하기가 매우 쉽습니다. 캐시와 같은 인 메모리 데이터베이스 만 필요한 경우에도 매우 빠릅니다.