Чи досить швидкий та надійний GridFS для виробництва?


86

Я розробляю новий веб-сайт, і я хочу використовувати GridFS як сховище для всіх завантажених користувачем файлів, оскільки він пропонує масу переваг у порівнянні зі звичайним сховищем файлової системи.

Тести з GridFS, що обслуговуються nginx, вказують, що це не так швидко, як звичайна файлова система, що обслуговується nginx.

Тест з nginx

Хтось із тих, хто використовує GridFS вже у виробничому середовищі, або використовував би його для нового проекту?


1
Повідомлення в блозі про зберігання зображень у mongodb для майбутніх шукачів, які мали подібний до мене намір: menge.io/2015/03/24/storing-small-images-in-mongodb (порівнює GridFS із простим вкиданням його в документ як двійковий файл дані)

Існує багато компромісів, які слід врахувати, вирішуючи, чи хочете ви зберігати двійкові дані в MongoDB - див .: alexmarquardt.com/2017/03/02/…
Олександр Марквардт

Відповіді:


118

Я використовую gridfs під час роботи на одному з наших серверів, який є частиною веб-сайту, що порівнює ціни, з почесною статистикою трафіку (близько 25 тис. Відвідувачів на день). На сервері мало оперативної пам'яті, 2 гігабайт, і навіть процесор не дуже швидкий (Core 2 duo 1,8 ГГц), але сервер має достатньо місця для зберігання: 10 Тб (sata) у конфігурації raid 0. Робота, яку виконує сервер, дуже проста:

Кожен продукт на нашому порівняльнику цін має зображення (налічується близько 10 мільйонів товарів відповідно до нашого продукту db), а завдання серверів - завантажити зображення, змінити його розмір, зберегти в сітках та доставити в браузер відвідувачів. .. якщо він відсутній у сітці ... або ... доставити його до браузера відвідувачів, якщо він уже збережений у сітці. Отже, це можна назвати "традиційною схемою CDN".

Ми зберегли та обробили 4 мільйони зображень на цьому сервері, оскільки він працює і працює. Змінення розміру та збереження матеріалів здійснюється простим php-скриптом ... але, безсумнівно, скрипт python або щось на зразок Java може бути швидшим.

Поточний розмір даних: 11,23г

Поточний розмір сховища: 12,5 г

Індекси: 5

Розмір індексу: 849,65м

Про надійність: Це дуже надійно. Сервер не завантажується, розмір індексу нормальний, запити швидкі

Про швидкість: Звичайно, це не так швидко, як локальне зберігання файлів, можливо на 10% повільніше, але досить швидко, щоб використовувати його в режимі реального часу, навіть коли зображення потрібно обробити, що в нашому випадку дуже залежить від php. Також скорочено час обслуговування та розробки: видалити одне або кілька зображень стало настільки просто: просто запитайте db за допомогою простої команди видалення. Ще одна цікава річ: коли ми перезавантажили наш старий сервер із локальним сховищем файлів (тобто мільйон файлів у тисячах папок), він іноді зависає годинами, оскільки система виконувала перевірку цілісності файлів (це дійсно зайняло години ...). Ми більше не маємо цієї проблеми з сітками, наші зображення тепер зберігаються великими шматками mongodb (файли 2 Гб)

Отже ... на мій погляд ... Так, gridfs досить швидкий і надійний, щоб використовувати його для виробництва.


9
Я вражений тим, що хтось буде використовувати raid 0 як основне сховище на робочому веб-сайті. Навіть при хороших резервних копіях збільшення ймовірності збою сховища є досить високою ціною для покращення продуктивності.
mikerobi

67
Ми використовуємо raid 0, оскільки в нашому конкретному випадку дані зображення можуть бути мінливими. Немає значення, якщо зображення втрачено, оскільки ми знову завантажимо його з веб-сайту продавців. Прагматично, ми могли б вважати, що наш сервер - це простий сервер кешу зображень.
Ману Ейденбергер

Але ви активно збільшуєте ймовірність поломки (коефіцієнт вихідної несправності початкового приводу, помножений на кількість шпинделів). Raid 10 був би ідеальним, якщо вам потрібно більше записів, ніж читань, або Raid 5/6, якщо вам потрібно більше читань, ніж записів.
NeuroScr

9
@ManuEidenberger Чому ви використовуєте GridFS для зберігання зображень, які воліють зберігатись у документі MongoDB? Думаю, ви не досягли обмеження в 16 МБ. І зберігання зображення як BLOB у документі MongoDB було б більш ефективним, оскільки вам не потрібен шар GridFS поверх документів MongoDB.
Arnaud Bouchez

1
Мені також цікаво запитання @ ArnaudBouchez. Чи була якась перевага, яка змусила вас вибрати GridFS, аніж просто зберігати його як двійкові дані в документі, Ману? Дякую!

12

Як уже згадувалося, це може бути не так швидко, як звичайна файлова система, але тоді вона надає вам переваги перед звичайними файловими системами, для яких, на мою думку, варто трохи відмовитися.

Зрештою, за допомогою шардінгу ви можете досягти точки, коли сховище GridFS насправді стає швидшим варіантом на відміну від звичайної файлової системи та одного вузла.


6

Однак оголення щодо ремонту великих БД - нова система, яку ми розробляємо, mongo не вийшов чисто, і ремонт 7TB GridFS, схоже, займе 130 годин.

Через це, я думаю, я розгляну перехід на OpenStack Swift або Ceph. Все-таки до того часу це було добре. І модуль nginx-gridfs приємний.


То як ти пішов?
Мукус

5

Модуль ngix-gridfs від mdirolf чудовий і досить простий у налаштуванні. Ми використовуємо його у виробництві на paint.ly для обслуговування всіх картин, і дотепер проблем не було.


3
Здається, paint.ly вже недоступний. :(
Marian

2

Я не рекомендую використовувати сітки, якщо ви не знаєте, що робите. GridFS - це просто абстракційний шар, який розділяє файли на фрагменти та зберігає файли у двох колекціях. Більше файлів - більше накладних витрат. Якщо ви очікуєте, що файли будуть однакового розміру, не перевищуючи 32 млн. Або близько того, - ви в правильному напрямку. Не намагайтеся зберігати великі файли у сітках. Чому?

  1. Драйвери на різних мовах можуть читати весь файл (наприклад, фрагменти) під час читання маленької частини файлу.
  2. Зміна файлу може вплинути на всі фрагменти та збільшити навантаження на базу даних. Якщо ваша файлова система росте, вам доведеться вирішити подрібнення сіток. Будь обережний! Послідовність не гарантується при ініціалізації шардингу!

Якщо ви думаєте про завантажений проект, розгляньте можливість завантаження файлів у документи безпосередньо (якщо розмір не перевищує 16 мільйонів) або виберіть інший кластер, а також прив’яжіть ім’я файлу / inode до вашої логіки.

Сподіваюся, це допомагає.


4
Я досить новачок у GridFS, хоча з того, що я розумію, GridFS - це більше, ніж просто рівень абстракції, який подвоює кількість файлів. GridFS надає простий спосіб скористатися перевагами функції реплікації та заточування MongoDB. Я вважаю, що інші також згадували, що файли зберігаються фрагментами по 2 Гб, що, на мою думку, зменшило б загальну кількість файлів, особливо якщо хтось має дуже велику кількість маленьких зображень.

+1 Ви маєте рацію. Навіть менші файли не були б корисними для зберігання в GridFS. Якщо ваш файл міг зберігатися в документі MongoDB (тобто <з обмеженого розміру 16 МБ), ви скоріше хотіли б зберігати файл як BLOB у документі MongoDB. Це обійде накладні витрати на використання GridFS поверх сховища MongoDB. Дивіться compose.io/articles/gridfs-and-mongodb-pros-and-cons
Арно Буше
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.