Mnesia: ข้อดีและความแตกต่าง


22

Mnesia มีข้อได้เปรียบอะไรบ้างเกี่ยวกับการติดตั้งฐานข้อมูล SQL ที่สำคัญและมีความแตกต่างกันอย่างไร?

ฉันสามารถใช้ฐานข้อมูลเพื่อเก็บข้อมูลจำนวนมหาศาลได้โดยไม่ทำให้ประสิทธิภาพเสื่อมลงอย่างเห็นได้ชัดหรือไม่?


4
ฉันคิดว่าคำถามนี้ต้องการความสนใจมากกว่านี้เล็กน้อย คุณสามารถแสดงรายการเกณฑ์ที่คุณจะใช้เพื่อตัดสินข้อดีหรือข้อแตกต่างจากการใช้ฐานข้อมูลอื่น ๆ ได้หรือไม่? ดูเหมือนว่าผู้สมัครบทความ / รายการวิกิพีเดียไม่ใช่สิ่งที่สามารถตอบได้ที่นี่ นอกจากนี้เมื่อพิจารณาว่า Mnesia นั้นมีความคล้ายคลึงกับ CouchDB มากน้อยเพียงใดก็ไม่ยุติธรรมที่จะถามว่าจะเปรียบเทียบกับการใช้งาน SQL ที่ "สำคัญ" โดยไม่ตั้งชื่อสิ่งที่คุณต้องการเปรียบเทียบได้อย่างไร เมื่อเปรียบเทียบกับ SQLServer หรือ Oracle จะไม่ได้ปิดโหนดต่อโหนดสำหรับประสิทธิภาพ
jcolebrand

คำตอบ:


31

ขออภัยที่มาสายสำหรับปาร์ตี้ :) นี่คือคำตอบของฉันตามการใช้ Mnesia ตั้งแต่ปี 1996 และเทคโนโลยีฐานข้อมูลอื่น ๆ นับตั้งแต่ปี 1988

Mnesia และ MySQL เป็นสัตว์ที่แตกต่างกันและสิ่งที่ดีที่สุดขึ้นอยู่กับว่าคุณตั้งใจจะใช้มันอย่างไร

หากแอปพลิเคชันของคุณเขียนขึ้นใน Erlang Mnesia ช่วยให้คุณเก็บข้อมูลในพื้นที่หน่วยความจำเดียวกับแอปพลิเคชันของคุณซึ่งหมายความว่าคุณสามารถดึงข้อมูลวัตถุเดียวได้อย่างรวดเร็วเพียงไม่กี่ไมโครวินาที สิ่งนี้เป็นไปไม่ได้ใน MySQL เนื่องจากแอปพลิเคชันของคุณและฐานข้อมูลจะถูกแยกออกจากหน่วยความจำ เหตุผลที่ Mnesia สามารถทำสิ่งนี้และยังมีความแข็งแกร่งอยู่ดีนั่นคือ Erlang ใช้การป้องกันของหน่วยความจำในระดับภาษา

โดยรวมแล้วฐานข้อมูล SQL มักจะให้ปริมาณงานมากกว่าเวลาแฝงและเมื่อพูดถึงเวลาแฝง Mnesia + Erlang ก็มีความโดดเด่น คุณต้องตัดสินใจว่าอันไหนสำคัญที่สุดสำหรับคุณ ดังที่ระบุไว้ในเอกสาร (ด้านบน) แอปพลิเคชันเป้าหมายของ Mnesia คือแอปพลิเคชันการเปลี่ยนระบบโทรคมนาคมซึ่งต้องการเวลาตอบสนองสำหรับการตั้งค่าการโทรเช่นประมาณ 20 มิลลิวินาที สิ่งนี้หมายความว่าคุณสามารถอ่านจากฐานข้อมูลได้หากข้อมูลอยู่ในหน่วยความจำที่ใช้ร่วมกัน แต่จะหลีกเลี่ยงการเขียนไปยังที่จัดเก็บข้อมูลแบบต่อเนื่องตามการตั้งค่าต่อการโทร OTOH แอพพลิเคชั่นเหล่านี้ไม่จำเป็นต้องรองรับการสืบค้นแบบเฉพาะกิจและไม่ใช้ชุดข้อมูลขนาดใหญ่มาก งานบางอย่างได้ดำเนินการเพื่อขยายความเหมาะสมของ Mnesia สำหรับโดเมนอื่น ๆ แต่มันไม่สำคัญสำหรับทีมพัฒนา Erlang / OTP Mnesia คือสิ่งที่มันเป็นและมีแนวโน้มที่จะอยู่อย่างนั้น

ในลิงก์ข้างต้นที่ Mnesia และ MySQL เปรียบเทียบกับความเร็วเราต้องจำไว้ว่ามันอยู่ใน eJabberd ซึ่งทำงานกับเซิร์ฟเวอร์เดียวหากเป็น MySQL และใช้ฐานข้อมูลที่จำลองแบบเต็มหาก Mnesia - และกลุ่ม eJabberd ขนาดใหญ่สามารถมีได้มากเท่ากับ 10 หรือมากกว่าโหนด erlang (และดังนั้น, 10 หรือมากกว่า Mnesia แบบจำลอง) จากมุมมองที่ซ้ำซ้อนนี่เป็นเรื่องไร้สาระและมีราคาแพงและ Mnesia ไม่ได้บังคับให้คุณทำเช่นนั้น เห็นได้ชัดว่ามันช่วยให้อ่านอย่างรวดเร็วในแต่ละโหนด การเปรียบเทียบหลายอย่างที่ฉันได้อ่านจบลงแล้วเมื่อเปรียบเทียบการกระจาย Mnesia กับ MySQL แบบโหนดเดียว หากไม่จำเป็นต้องมีความซ้ำซ้อนสำหรับ MySQL ก็ไม่ควรใช้ Mnesia Mnesia มีความยืดหยุ่นค่อนข้างมากในการให้คุณเลือกรูปแบบการจำลองแบบและตำแหน่งข้อมูลนั้นโปร่งใสสำหรับแอปพลิเคชัน

Mnesia ไม่ จำกัด เพียง 2 GB ต่อตาราง (แม้ว่าจะมีตัวเลือกในการจัดเก็บข้อมูลเฉพาะ) ฐานข้อมูล Mnesia ที่ใหญ่ที่สุดที่ฉันรู้จักมี CA 600 GB ของข้อมูลในดิสก์ RAM 64- บิต - แม้ว่าฉันจะไม่แนะนำก็ตาม สิ่งใดก็ตามที่มีขนาด 10-20 GB ควรปรับอย่างสมบูรณ์แบบด้วยฮาร์ดแวร์ที่ทันสมัย ​​แต่ควรข้าม disc_only_copies ทั้งหมดและใช้ disc_copies - ซื้อ RAM เพิ่มถ้าคุณต้องการ ฉันคิดว่าสองครั้งก่อนที่จะใช้การสนับสนุนการแบ่ง (mnesia_frag) - ใช้งานได้ แต่ไม่ค่อยคุ้มกับปัญหา

บางทีความแตกต่างที่ยิ่งใหญ่ที่สุดระหว่าง Mnesia และ MySQL ก็คือ SQL นั่นเอง Mnesia ไม่ได้มีฟังก์ชั่นการใช้งานเทียบเท่า QLC ให้การสนับสนุนสำหรับคิวรีแบบเฉพาะกิจ แต่ไม่ได้อยู่ในลีกเดียวกันกับ SQL และไม่มีระดับของการเพิ่มประสิทธิภาพคิวรี ในการใช้เครื่องมือและการจัดเตรียม MySQL นั้นเหนือกว่าและถ้าคุณต้องการการวิเคราะห์ไม่มีคำถามใดที่คุณควรเลือก (เช่นไม่ใช่ Mnesia)

วิธีที่ดีที่สุดในการดู Mnesia เป็นส่วนขยายของภาษา Erlang มันทำให้ข้อมูลอยู่ที่ปลายนิ้วของคุณและเป็นเลิศสำหรับชุดข้อมูลขนาดเล็กซึ่งเป็นที่รู้จักกันดีว่าโครงสร้างข้อมูลและรูปแบบการเข้าถึง สำหรับจุดประสงค์นี้การใช้ MySQL เป็นเรื่องที่ไม่สะดวกสบายเหมือนกับการใช้ Mnesia สำหรับสิ่งที่ MySQL ทำงานได้ดีที่สุด

แอปพลิเคชั่นส่วนใหญ่อยู่ระหว่างที่ใดที่หนึ่ง คุณอาจใช้ทั้งคู่ ...


3
ขอบคุณสำหรับคำตอบ. มันเป็นคำอธิบายที่ดีที่สุดที่ฉันได้อ่านในความทรงจำ
Akshat Jiwan Sharma

1
ขอบคุณที่แบ่งปันประสบการณ์ของคุณกับเรามันมีค่ามากกว่าการอ่านบล็อกใด ๆ
Rahul Gautam

คำตอบที่ดี แต่ตอนนี้ฉันสับสนมากขึ้น
HIRA THAKUR

คำตอบอย่างละเอียดมาก ดังนั้นถ้าฉันเข้าใจสิ่งนี้อย่างถูกต้อง Mnesia - จะเหมาะสำหรับบางคนในที่เก็บคีย์ / ค่าหน่วยความจำแทน Memcached หรือ Redis หรือวิธีแก้ปัญหาที่คล้ายกันที่คุณต้องการความเร็วและไม่จำเป็นต้องวิเคราะห์หรือจัดเก็บข้อมูล "SQL สำหรับทุกสิ่งทุกอย่างฉันควรใช้สิ่งที่ดีกว่าอย่าง MariaDB / Postgres หรือ Mongo / Cassandra / RIAK หรือไม่ เพื่อชี้แจง - ฉันกำลังเรียนรู้ Elixir ไม่ใช่ Erlang (มาจากพื้นหลัง Ruby / Perl) และพยายามหา stack ที่ดีที่สุดสำหรับฉันเพื่อแทนที่ Rails / Sinatra ด้วย MariaDB & Redis
konung

13

จากเอกสาร :

Mnesia เป็นระบบการจัดการฐานข้อมูลแบบกระจายเหมาะสำหรับแอพพลิเคชั่นด้านการสื่อสารโทรคมนาคมและแอพพลิเคชั่น Erlang อื่น ๆ ที่ต้องการการทำงานอย่างต่อเนื่องและคุณสมบัติแบบเรียลไทม์ที่อ่อนนุ่ม เป็นส่วนหนึ่งของแพลตฟอร์ม Open Telecom (OTP) ซึ่งเป็นแพลตฟอร์มระบบควบคุมสำหรับการสร้างแอพพลิเคชั่นโทรคมนาคม

โดยเฉพาะอย่างยิ่งระดับการยอมรับข้อผิดพลาดที่สูงมากซึ่งจำเป็นในระบบ nonstop จำนวนมากรวมกับข้อกำหนดบน DBMS เพื่อให้ทำงานในพื้นที่ที่อยู่เดียวกับแอปพลิเคชันทำให้เราสามารถใช้ DBMS ใหม่ได้ เรียกว่า Mnesia Mnesia มีการนำมาใช้และเชื่อมโยงอย่างแน่นหนากับภาษาการเขียนโปรแกรม Erlang และให้การทำงานที่จำเป็นสำหรับการใช้งานระบบโทรคมนาคมที่รองรับความผิดปกติ Mnesia เป็นผู้ใช้หลายคนกระจาย DBMS ที่สร้างขึ้นเป็นพิเศษสำหรับการใช้งานการสื่อสารโทรคมนาคมอุตสาหกรรมที่เขียนในภาษาการเขียนโปรแกรมสัญลักษณ์ Erlang ซึ่งเป็นภาษาเป้าหมาย Mnesia พยายามจัดการกับปัญหาการจัดการข้อมูลทั้งหมดที่จำเป็นสำหรับระบบโทรคมนาคมทั่วไปและมีคุณสมบัติหลายอย่างที่ไม่พบในฐานข้อมูลดั้งเดิม

ในแอปพลิเคชั่นโทรคมนาคมมีความต้องการที่แตกต่างจากคุณสมบัติที่จัดทำโดย DBMS แบบดั้งเดิม แอปพลิเคชั่นที่ใช้งานในภาษา Erlang ต้องการการผสมผสานของฟีเจอร์ที่หลากหลายซึ่งโดยทั่วไปไม่ได้รับความพึงพอใจจาก DBMS แบบดั้งเดิม Mnesia ได้รับการออกแบบโดยมีข้อกำหนดดังต่อไปนี้:

ค้นหาคีย์ / ค่าเรียลไทม์ได้อย่างรวดเร็ว

ข้อความค้นหาแบบเรียลไทม์ที่ซับซ้อนซึ่งไม่ซับซ้อนสำหรับการดำเนินงานและการบำรุงรักษาเป็นหลัก

ข้อมูลแบบกระจายเนื่องจากแอปพลิเคชันแบบกระจาย

ความผิดพลาดสูงทน

การกำหนดค่าใหม่แบบไดนามิก

วัตถุที่ซับซ้อน

สิ่งที่ทำให้ Mnesia แตกต่างจาก DBMS อื่น ๆ ส่วนใหญ่คือมันถูกออกแบบด้วยปัญหาการจัดการข้อมูลทั่วไปของแอพพลิเคชั่นด้านการสื่อสารโทรคมนาคม ดังนั้น Mnesia จึงรวมแนวคิดหลายอย่างที่พบในฐานข้อมูลแบบดั้งเดิมเช่นธุรกรรมและแบบสอบถามกับแนวคิดที่พบในระบบการจัดการข้อมูลสำหรับแอปพลิเคชันการสื่อสารโทรคมนาคมเช่นการดำเนินการตามเวลาจริงที่รวดเร็วมาก กำหนดค่าระบบใหม่โดยไม่หยุดหรือหยุดชั่วคราว Mnesia ก็มีความน่าสนใจเนื่องจากการมีเพศสัมพันธ์อย่างแน่นหนากับภาษาการเขียนโปรแกรม Erlang ดังนั้นเกือบจะเปลี่ยน Erlang เป็นภาษาการเขียนโปรแกรมฐานข้อมูล สิ่งนี้มีประโยชน์มากมายที่สำคัญที่สุดคือความต้านทานไม่ตรงกันระหว่างรูปแบบข้อมูลที่ใช้โดย DBMS และรูปแบบข้อมูลที่ใช้โดยภาษาการเขียนโปรแกรม

Mnesia กับ MySQL, ประสิทธิภาพ :

ejabberd ใช้ทรัพยากรการคำนวณน้อยกว่าเมื่อใช้ฐานข้อมูล * SQL บางตัวเมื่อใช้ Mnesia ภายใน คุณอาจสนใจในหัวข้อนั้นเมื่อคุณมีผู้ใช้หลายคนพร้อมกัน (ตัวอย่างเช่นมากกว่า 1,000 คน) ด้วยผู้ใช้ที่ใช้งานพร้อมกันไม่กี่คนการใช้ CPU ของ ejabberd นั้นเล็กน้อยดังนั้นผู้ดูแลระบบของเซิร์ฟเวอร์ขนาดเล็กไม่สนใจที่จะตั้งค่าเซิร์ฟเวอร์ SQL ภายนอกและฐานข้อมูล

CouchDB v. Mnesia, V. MySQLและMnesia หัวข้ออื่น ๆ :

ข้อมูลเชิงลึกหนึ่งที่มาถึงใจทันทีคือในขณะที่มันชัดเจนสำหรับฉันวิธีการจัดโครงสร้างข้อมูลสำหรับ MySQL มันมีน้อยสำหรับ Mnesia และสำหรับ CouchDB ฉันยังไม่แน่ใจในแนวทางที่ดีที่สุดทั้งหมด สำหรับตอนนี้ต่อไปนี้เป็นจุดที่ชัดเจนมากขึ้น:

A 'record' มีฟิลด์ 'ตัวเลข' ซึ่งแสดงให้เห็นชัดเจนว่ามีการเล่นกี่ครั้ง นี่เป็นสิ่งที่ดีใน MySQL แต่ถ้าฉันรวมฟิลด์นี้ลงในเอกสารสำหรับ CouchDB ฉันจะได้รับการแก้ไขเอกสารในฐานข้อมูลทุกครั้งที่มีการเปลี่ยนแปลงจำนวนหนึ่งซึ่งดูเหมือนว่าจะไม่มีประสิทธิภาพมากนัก

เลย์เอาต์สามตารางใน MySQL ของเร็กคอร์ดแท็กและตารางลิงก์ระหว่างกัน (ดูสคริปต์หากยังไม่ชัดเจน) คือ (สำหรับฉันอย่างน้อย) เห็นได้ชัดว่าเป็นทางออกที่ถูกต้อง แต่มีหลายวิธีที่เป็นไปได้ในการทำเช่นนี้ ทั้งใน Mnesia และ CouchDB และฉันพบว่าฉันไม่มีคำตอบอย่างสังหรณ์ใจ

ในระยะสั้นมันถูกออกแบบมาเพื่อวัตถุประสงค์เฉพาะ ไม่มีฐานข้อมูลใดที่สามารถเปรียบเทียบได้อย่างเป็นนามธรรม โดยผ่านการใช้ข้อกำหนดเท่านั้นจึงจะสามารถเป็นองค์ประกอบของความสามารถในการชำระเงิน


4

ไม่ฉันจะไม่บอกว่า Mnesia นั้นดีสำหรับข้อมูลจำนวนมาก คุณสามารถเลือกใช้Ets หรือ Detsเป็นแบ็กเอนด์ หากคุณเลือก Ets ฐานข้อมูลของคุณจะอยู่ในหน่วยความจำและรวดเร็วมาก แต่ข้อมูลจะไม่คงอยู่ และถ้าคุณต้องการข้อมูลของคุณแบบถาวร (บันทึกไว้ในดิสก์) คุณต้องใช้ Dets ซึ่งมีขีด จำกัด2GBดังนั้นฐานข้อมูลของคุณจึงไม่สามารถเก็บข้อมูลได้มากกว่า 2GB

คุณสามารถใช้แบ็กเอนด์แบบกำหนดเองเช่นอินสโตร์ที่ใช้ในฐานข้อมูลRiak NoSQL

ข้อดีของ Mnesia คือมันเป็นฐานข้อมูลแบบกระจายดังนั้นจึงเป็นเรื่องง่ายที่จะทำระบบป้องกันความผิดปกติถ้าคุณมีคอมพิวเตอร์มากกว่าหนึ่งเครื่อง และมันใช้งานง่ายมากใน Erlang เนื่องจากเป็นฐานข้อมูลในภาษาและทำหน้าที่ "ชอบฟังก์ชั่น" และมันก็เร็วมากหากคุณต้องการเพียงฐานข้อมูลในหน่วยความจำเช่นแคช

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.