GridFS รวดเร็วและเชื่อถือได้เพียงพอสำหรับการผลิตหรือไม่?


86

ฉันพัฒนาเว็บไซต์ใหม่และต้องการใช้ GridFS เป็นที่เก็บข้อมูลสำหรับการอัปโหลดของผู้ใช้ทั้งหมดเนื่องจากมีข้อได้เปรียบมากมายเมื่อเทียบกับที่เก็บข้อมูลระบบไฟล์ปกติ

Benchmarks ที่มี GridFS ให้บริการโดย nginx ระบุว่ามันไม่เร็วเท่ากับระบบไฟล์ปกติที่ให้บริการโดย nginx

เกณฑ์มาตรฐานกับ nginx

มีใครบ้างที่ใช้ GridFS อยู่แล้วในสภาพแวดล้อมการใช้งานจริงหรือจะใช้สำหรับโครงการใหม่


1
โพสต์บล็อกเกี่ยวกับการจัดเก็บภาพใน mongodb สำหรับผู้ค้นหาในอนาคตที่มีเจตนาคล้ายกันกับฉัน: menge.io/2015/03/24/storing-small-images-in-mongodb (เปรียบเทียบ GridFS เพียงแค่โยนลงในเอกสารเป็นไบนารี data)

มีข้อเสียมากมายที่ต้องพิจารณาเมื่อตัดสินใจว่าคุณต้องการจัดเก็บข้อมูลไบนารีใน MongoDB หรือไม่ - ดู: alexmarquardt.com/2017/03/02/…
Alexander Marquardt

คำตอบ:


119

ฉันใช้ gridfs ในที่ทำงานบนเซิร์ฟเวอร์ของเราซึ่งเป็นส่วนหนึ่งของเว็บไซต์เปรียบเทียบราคาที่มีสถิติการเข้าชมที่น่ายกย่อง (มีผู้เข้าชมประมาณ 25,000 คนต่อวัน) เซิร์ฟเวอร์มี RAM ไม่มาก 2gigs และแม้แต่ cpu ก็ไม่เร็วมาก (Core 2 duo 1.8Ghz) แต่เซิร์ฟเวอร์มีพื้นที่เก็บข้อมูลมากมาย: 10Tb (sata) ในการกำหนดค่า raid 0 งานที่เซิร์ฟเวอร์ทำนั้นง่ายมาก:

ผลิตภัณฑ์แต่ละชิ้นในเครื่องเปรียบเทียบราคาของเรามีรูปภาพ (มีผลิตภัณฑ์ประมาณ 10 ล้านรายการตามฐานข้อมูลผลิตภัณฑ์ของเรา) และหน้าที่ของเซิร์ฟเวอร์คือการดาวน์โหลดรูปภาพปรับขนาดจัดเก็บไว้ใน gridfs และส่งไปยังเบราว์เซอร์ของผู้เยี่ยมชม .. หากไม่มีอยู่ในกริด ... หรือ ... ส่งไปยังเบราว์เซอร์ผู้เยี่ยมชมหากเก็บไว้ในตารางแล้ว ดังนั้นสิ่งนี้อาจเรียกได้ว่าเป็น 'สคีมา cdn ดั้งเดิม'

เราได้จัดเก็บและประมวลผลภาพ 4 ล้านภาพบนเซิร์ฟเวอร์นี้ตั้งแต่เปิดใช้งาน การปรับขนาดและจัดเก็บสิ่งต่างๆทำได้โดยสคริปต์ php ธรรมดา ๆ ... แต่แน่นอนว่าสคริปต์ python หรือ java อาจเร็วกว่า

ขนาดข้อมูลปัจจุบัน: 11.23g

ขนาดเก็บปัจจุบัน: 12.5g

ดัชนี: 5

ขนาดอินเด็กซ์: 849.65m

เกี่ยวกับความน่าเชื่อถือ: นี่น่าเชื่อถือมาก เซิร์ฟเวอร์ไม่โหลดขนาดดัชนีก็โอเคการสืบค้นรวดเร็ว

เกี่ยวกับความเร็ว: แน่นอนว่ามันไม่เร็วเท่ากับการจัดเก็บไฟล์ในเครื่องหรืออาจจะช้ากว่า 10% แต่ก็เร็วพอที่จะใช้แบบเรียลไทม์แม้ว่าจะต้องประมวลผลภาพก็ตามซึ่งในกรณีของเรานั้นขึ้นอยู่กับ php มาก เวลาในการบำรุงรักษาและการพัฒนาก็ลดลงเช่นกันการลบภาพเดียวหรือหลายภาพทำได้ง่ายมากเพียงแค่ค้นหาฐานข้อมูลด้วยคำสั่งลบง่ายๆ สิ่งที่น่าสนใจอีกประการหนึ่ง: เมื่อเรารีบูตเซิร์ฟเวอร์เก่าของเราด้วยที่เก็บไฟล์ในเครื่อง (ดังนั้นล้านไฟล์ในหลายพันโฟลเดอร์) บางครั้งก็ค้างเป็นเวลาหลายชั่วโมงทำให้ระบบทำการตรวจสอบความสมบูรณ์ของไฟล์ (ซึ่งใช้เวลาหลายชั่วโมง ... ) เราไม่มีปัญหานี้อีกต่อไปกับ gridfs ขณะนี้ภาพของเราถูกเก็บไว้ใน mongodb ชิ้นใหญ่ (ไฟล์ 2gb)

ดังนั้น ... ในใจ ... ใช่ gridfs รวดเร็วและเชื่อถือได้เพียงพอที่จะใช้ในการผลิต


9
ฉันตกใจมากที่ใคร ๆ ก็ใช้ raid 0 เพราะมีที่เก็บข้อมูลหลักในเว็บไซต์ที่ใช้งานจริง แม้จะมีการสำรองข้อมูลที่ดี แต่การเพิ่มความน่าจะเป็นของการจัดเก็บข้อมูลล้มเหลวก็เป็นราคาที่ค่อนข้างสูงที่จะจ่ายเพื่อประสิทธิภาพที่ดีขึ้น
mikerobi

67
เราใช้ raid 0 เพราะในกรณีเฉพาะของเราข้อมูลภาพอาจผันผวนได้ ไม่สำคัญว่าภาพจะหายไปเนื่องจากเราจะดาวน์โหลดอีกครั้งจากเว็บไซต์ร้านค้า ในทางปฏิบัติเราสามารถพิจารณาได้ว่าเซิร์ฟเวอร์ของเราเป็นเซิร์ฟเวอร์แคชรูปภาพแบบธรรมดา
มนูไอเดนเบอร์เกอร์

แต่คุณกำลังเพิ่มโอกาสที่จะเกิดความล้มเหลว (ปัจจัยความล้มเหลวของไดรฟ์เริ่มต้นคูณด้วยจำนวนแกนหมุน) Raid 10 เหมาะอย่างยิ่งหากคุณต้องการการเขียนมากกว่าการอ่านหรือ Raid 5/6 หากคุณต้องการการอ่านมากกว่าการเขียน
NeuroScr

9
@ManuEidenberger ทำไมคุณถึงใช้ GridFS ในการจัดเก็บภาพซึ่งค่อนข้างจะเก็บไว้ในเอกสาร MongoDB ฉันเดาว่าคุณมีขนาดเอกสารไม่ถึงขีด จำกัด 16 MB และการจัดเก็บรูปภาพเป็น BLOB ภายในเอกสาร MongoDB จะมีประสิทธิภาพมากกว่าเนื่องจากคุณไม่จำเป็นต้องมีเลเยอร์ GridFS ที่ด้านบนของเอกสาร MongoDB
Arnaud Bouchez

1
ฉันยังอยากรู้เกี่ยวกับคำถามของ @ ArnaudBouchez มีประโยชน์บางอย่างที่ทำให้คุณเลือก GridFS โดยจัดเก็บเป็นข้อมูลไบนารีในเอกสาร Manu หรือไม่? ขอบคุณ!

12

ดังที่ได้กล่าวไปแล้วมันอาจจะไม่เร็วเท่าระบบไฟล์ทั่วไป แต่มันก็ทำให้คุณมีข้อได้เปรียบเหนือระบบไฟล์ธรรมดาซึ่งฉันคิดว่ามันคุ้มค่าที่จะลดความเร็วลง

ในที่สุดด้วยการแบ่งส่วนข้อมูลคุณอาจไปถึงจุดที่ที่จัดเก็บข้อมูล GridFS กลายเป็นตัวเลือกที่เร็วกว่าเมื่อเทียบกับระบบไฟล์ธรรมดาและโหนดเดียว


6

โปรดทราบเกี่ยวกับการซ่อมแซมฐานข้อมูลขนาดใหญ่ - ระบบใหม่ที่เรากำลังพัฒนา mongo ไม่ได้ออกอย่างหมดจดและการซ่อมแซม GridFS ขนาด 7TB ดูเหมือนว่าจะใช้เวลา 130 ชม.

ด้วยเหตุนี้ฉันจึงคิดว่าจะเปลี่ยนไปใช้ OpenStack Swift หรือ Ceph ถึงตอนนั้นก็ดีแล้ว และโมดูล nginx-gridfs นั้นหวาน


แล้วคุณไปได้อย่างไร?
Mukus

5

โมดูล nginx-gridfs ของ mdirolf นั้นยอดเยี่ยมและค่อนข้างง่ายในการติดตั้ง เรากำลังใช้มันในการผลิตที่paint.lyเพื่อให้บริการภาพวาดทั้งหมดและยังไม่มีปัญหาใด ๆ


3
paint.ly ไม่มีให้บริการแล้วดูเหมือนว่า :(
มาเรียน

2

ฉันไม่แนะนำให้ใช้ gridfs เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่ GridFS เป็นเพียงเลเยอร์นามธรรมที่แยกไฟล์เป็นชิ้น ๆ และเก็บไฟล์ไว้ในสองคอลเลกชัน ไฟล์เพิ่มเติม - ค่าใช้จ่ายเพิ่มเติม หากคุณคาดว่าไฟล์จะมีขนาดค่อนข้างเท่ากันไม่เกิน 32M หรือมากกว่านั้น - คุณมาถูกทางแล้ว อย่าพยายามจัดเก็บไฟล์ขนาดใหญ่บน gridfs ทำไม?

  1. ไดรเวอร์ในภาษาต่างๆอาจอ่านทั้งไฟล์ (เช่นชิ้นส่วน) เมื่ออ่านส่วนเล็ก ๆ ของไฟล์
  2. การแก้ไขไฟล์อาจส่งผลต่อชิ้นส่วนทั้งหมดและเพิ่มการโหลดฐานข้อมูลหากระบบไฟล์ของคุณเติบโตขึ้นคุณจะต้องตัดสินใจที่จะแบ่ง gridfs ระวัง! ไม่รับประกันความสม่ำเสมอเมื่อเริ่มต้นการชาร์ด!

หากคุณคิดจะอ่านโปรเจ็กต์ที่โหลดแล้วให้ลองโหลดไฟล์ลงในเอกสารโดยตรง (ถ้ามีขนาด 16M หรือน้อยกว่า) หรือเลือกคลัสเตอร์อื่นและเชื่อมโยงชื่อไฟล์ / ไอโหนดเข้ากับตรรกะของคุณ

หวังว่านี่จะช่วยได้


4
ฉันค่อนข้างใหม่สำหรับ GridFS แม้ว่าจากสิ่งที่ฉันเข้าใจว่า GridFS เป็นมากกว่าเลเยอร์นามธรรมที่เพิ่มจำนวนไฟล์เป็นสองเท่า GridFS นำเสนอวิธีง่ายๆในการใช้ประโยชน์จากคุณสมบัติการจำลองแบบและการชาร์ดของ MongoDB ฉันเชื่อว่าคนอื่น ๆ ก็พูดถึงเช่นกันว่าไฟล์ถูกจัดเก็บเป็นชิ้น 2GB ซึ่งฉันคิดว่าจะลดจำนวนไฟล์ทั้งหมดลงโดยเฉพาะอย่างยิ่งถ้าใครมีภาพขนาดเล็กจำนวนมาก

+1 คุณพูดถูก แม้แต่ไฟล์ขนาดเล็กก็ไม่ได้รับประโยชน์ที่จะจัดเก็บด้วย GridFS หากไฟล์ของคุณสามารถเก็บไว้ในเอกสาร MongoDB (เช่น <จากขีด จำกัด ขนาด 16 MB) คุณควรจัดเก็บไฟล์เป็น BLOB ภายในเอกสาร MongoDB มันจะข้ามค่าใช้จ่ายในการใช้ GridFS ที่ด้านบนของที่เก็บข้อมูล MongoDB ดูcompose.io/articles/gridfs-and-mongodb-pros-and-cons
Arnaud Bouchez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.