Чому файлова система віддається перевазі журналам замість RDBMS?


44

Питання має бути зрозумілим з назви. Наприклад, Apache зберігає свої журнали доступу та помилок у файлах замість RDBMS незалежно від того, наскільки великі чи малі масштаби вони використовуються.

Для RDMS нам просто потрібно писати SQL запити, і це зробить роботу, тоді як для файлів ми повинні визначити певний формат, а потім записати регулярний вираз або може бути парсерами для маніпулювання ними. І вони можуть навіть зазнати невдачі за певних обставин, якби велика турбота не була б оплачена.

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


10
То як би ви реєстрували помилки БД (наприклад, недоступний db), якщо ваша система реєстрації журналів реєструється в БД?
Мар'ян Венема

17
@Marjan Як мені зафіксувати помилки файлової системи, якщо вона не працює ?!
Ясір

5
Цілком правда, але якщо це не вдасться, швидше за все, і ваша БД недоступна ... Зрештою, де / як вона запише до своїх таблиць без файлової системи?
Мар'ян Венема

2
@Yasir: Надішліть усі повідомлення журналу на сервер syslog перед тим, як увійти до файлової системи :)
Brian

1
@MarjanVenema що робити, якщо гра безглузда. Що робити, якщо локальний диск заповнений, ваш журнал не вдасться, але програма та ОС можуть продовжувати роботу. Якщо ви входите на віддалений сервер БД, хоча ви все одно зможете ввійти. Існують плюси і мінуси для зберігання повідомлень журналу, і найкраще залежить від того, що ви намагаєтеся вийти з журналу. Вибачте, я дозволю стаду повернутися до журналу файлів - це єдиний вірний спосіб.
Енді,

Відповіді:


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

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

  3. Багато речей, які варті реєстрації, відбуваються під час запуску, тобто, можливо, до встановлення з'єднання з базою даних.

  4. У випадку типової установки щодня створюється новий файл реєстрації, старі файли журналів стискаються та зберігаються протягом 2 тижнів, перш ніж врешті видаляються. Зробити те ж саме в RDBMS непросто.


1
Я спробував цей експеримент, і він пройшов непогано. RDBMS розроблений навколо ідеї, що дані записуються відносно нечасто відносно кількості разів, яку вони читають. Ведення журналів - це навпаки. Ти весь час пишеш і рідко читаєш. Це чудовий спосіб дратувати вашу DBA.
JimmyJames

1
Можна, можливо, використовувати систему баз даних часового ряду, як-от InfluxDB, для зберігання журналів; мені здається, що вона трохи краще підходить для завдання, ніж, наприклад, PostgreSQL. І все-таки переваги перед старомодними логінами навряд чи є.
користувач281377

Використання нереляційних БД з індексуванням жетонів тощо, безумовно, корисно, і якщо ви обережно підіберете, вони можуть поводитися з пожежним шлангом. Це частина того, як працюють такі речі, як спінінг і флюм.
JimmyJames

№4 насправді не проблема. DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
Роберт Харві

@RobertHarvey Це добре працює, поки ви не спробуєте це у важких умовах навантаження, де такі об'ємні операції можуть спричинити серйозні проблеми без додаткових запобіжних заходів. Повторити журнали, заповнюючи дисковий простір, скасувати простір таблиць стає занадто повним, реплікація стає дуже зайнятою реплікацією видалення тощо.
user281377

16

Я бачив журнали, записані в БД раніше (і іноді ви отримуєте налаштовані параметри для ведення журналу, де трасування йде у файл, помилки в БД, фатальні для журналу подій Windows).

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


Але я маю за це плутанину. Мій блокнот, wordpad, gedit або блокнот ++ або будь-який веб-браузер не будуть раді відкрити файл розміром 4 Гб. Однак той самий браузер зможе показати мені список тисяч сторінок, кожна з яких містить 500 друкованих записів. Правильно?
Ясір

7
@Yasir, оскільки ви використовуєте редактори, які намагаються завантажити весь файл у пам'ять. Спробуйте скористатися розумнішим редактором, який здатний "потокувати" великий файл. Vim - хороший приклад.
nakhli

6
@Yasir: Це правда, але ви намагаєтесь оптимізувати неправильну річ. Переважна більшість часу журнали пишуться і ніколи не читаються. Таким чином, ви створюєте журнали дуже швидко, тому що це звичайний випадок.
unholysampler

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

2
@gbjbaanb Я не вважав це завищеним, і, відверто кажучи, ви пропонуєте використовувати лінії маркування та вирізати та вставляти для запиту - це жарт. Це не просто пошук, ми проаналізували тенденції пошуку серверів, які мали більше проблем, ніж інші, які помилки користувачі бачили найчастіше тощо.
Енді,

15

Швидкість - одна з причин; інші:

  • Усунення точок відмови. Файлова система рідко виходить з ладу в умовах, коли СУБД не робила б, але в базах даних є багато і багато умов помилок, простих у файлових системах немає.
  • Низькотехнологічна доступність. Якщо справи йдуть дуже по-справжньому, ви можете завантажитися в рятувальну оболонку або встановити диск на іншій системі і все ще мати доступні інструменти для огляду файлів журналів. Якщо це база даних, ви ніде не працюєте без сервера баз даних.

3

По-перше.

І вони можуть навіть зазнати невдачі за певних обставин, якби велика турбота не була б оплачена.

Операції з базою даних не можуть вийти з ладу, якщо ви не обережні?

Запис у текстовий файл має ряд переваг, найважливіший

  • Текст читається людиною. Будь-хто може відкрити файл журналу з основним текстовим редактором і побачити, що таке повідомлення. Вам не потрібно розуміти, як організована база даних.
  • Швидкість. Запис тексту на диск набагато швидше, ніж служба бази даних з'ясовує, куди йде текст у базу даних, записуючи її туди та забезпечуючи завершення транзакції.

Очевидно, що будь-яке і все може вийти з ладу, якщо ми не будемо обережні. Але з цього питання я звертався до програміста високого рівня. Як простий приклад, програміст може захотіти розділити значення, використовуючи певний символ. Таким чином, його / її регулярний вираз буде працювати як шарм, але не вдасться, коли той самий символ міститься в блоці значення. Таким чином, йому потрібно піклуватися про подібні можливі випадки, і йому не потрібно думати про них, якщо він економив у БД. Також, чи можете ви побачити мій коментар щодо відповіді gbjbaanb?
Ясір

1
А якщо ви пишете свій SQL, у вас є та сама проблема. Різниця в тому, що запис не вдасться (або зіпсує ваші дані) замість того, щоб трохи дратувати розробника, оскільки його пошуковий рядок призвів до поганих результатів. Так, є рамки, які означають, що вам не потрібно писати SQL, але кожен додатковий шар уповільнює процес. І пам’ятайте, це просто ведення лісу. Кожен цикл, який ви використовуєте для реєстрації, - це цикл, який ви не використовуєте для реальної роботи.
unholysampler

@unholysampler Аргумент продуктивності слабкий, ведення журналу може бути дуже швидким і на фоновому потоці до бази даних, а вхід до файлів f, хоча потенційно швидше, все ще не є безкоштовним, особливо якщо це не робиться у фоновому режимі.
Енді,

2

Ви спеціально піднімаєте Apache, тож я детально це обговорю.

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

Коли я робив це, у мене виникли також проблеми з надійністю: якщо буфер запису сервера бази даних заповнений (що може статися з mysql, якщо ви використовуєте квоту файлової системи для користувача, під яким він працює), він починає чергувати запити, поки вони не зможуть. продовжувати роботу, після чого Apache починає чекати, коли він закінчиться, в результаті чого вивішені запити на ваш веб-сайт.

(Це питання зараз може бути виправлене, звичайно - я робив це багато років тому)


1

Файлова система - це база даних. Це дійсно простіша ієрархічна база даних замість реляційної СУБД, але все ж це база даних.

Причина, чому вхід у файлову систему популярний, полягає в тому, що текстові журнали добре поєднуються з філософією Unix: "Текст - це універсальний інтерфейс".

Unix розробив безліч інструментів загального призначення, які можуть добре працювати з текстовими журналами. Не має значення, чи створюються текстові журнали mysql, apache, вашим користувальницьким додатком, стороннім програмним забезпеченням, яке давно не підтримується, sysadmin може використовувати стандартні інструменти Unix, такі як grep, sed, awk, sort, uniq, cut, tail і т. д., щоб все одно тягатися за журналами.

Якщо кожен додаток записується у власну базу даних, один у MySQL, інший у Postgres, інший у Elasticsearch, інший хоче увійти до ELK, інший може увійти лише до MongoDB, тоді вам доведеться вивчити двадцять різних інструментів для проходження журналів кожного застосування. Текст - це універсальний носій, на який кожен може увійти.

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

Реєстрація в базі даних часто насправді не суттєво полегшує справи.

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


0

Давайте розглянемо це в декілька шарів:

  1. Машинний шар
  2. Рівень операційної системи
  3. Сервісний рівень
  4. Прикладний шар

Коротко:

  • На машинному шарі ви справді не можете вести журнал, крім якогось відвалу.
  • На шарі ОС ви можете вести журнал, але у вас дійсно доступна лише файлова система.
  • Служби можуть увійти до файлової системи, але вони не можуть довіряти запуску інших служб, тому вони не можуть там увійти.
  • Програми можуть увійти до служб та файлової системи

Тоді у нас є підхід на основі використання:

Чи хочете ви зафіксувати помилки, пов’язані з вузлом, в RDBMS, що горизонтально масштабується, де потрібно виконати додаткову роботу, щоб знайти помилку конкретного вузла, коли ви могли просто відкрити капот для одного вузла і побачити його там? З іншого боку, ваша програма, можливо, має зайти в RDBMS, щоб збирати помилки та повідомлення на рівні програми.

Що трапляється, коли RDBMS потребує реєстрації для себе, оскільки база даних не може бути записана?


-2

Складність. Додавання RDBMS збільшить складність всієї системи астрономічно. А вміння керувати складністю - це головне, що відрізняє програмістів від виробників вихідного коду.


1
Чи можете ви розширити, що ви маєте на увазі щодо складності, оскільки це стосується реєстрації в БД проти файлової системи? З мого досвіду, не було суттєвої різниці в складності в бізнес-середовищі.
Адам Цукерман

Дійсно? SqlLite збільшує складність астрономічно? І хоча веб-серверу зазвичай не потрібен БД, багато програм LOB вже використовують його, тому додаткових витрат там взагалі немає.
Енді,

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

@Andy насамперед, SQLite не є RDBMS у класичному сенсі - це "вбудована RDBMS". І так - необхідність використання SQLite для ведення журналу значно збільшить складність.
noonex

1
@noonex Ви просто довільно робити різницю між вбудованим та повним сервером, коли RDBMS не робить. SqlLite забезпечує відповідність ACID, що саме є RDBMS. І це значно збільшує складність? Я можу лише уявити, що ви не працювали ні на чому, окрім самих тривіальних додатків. Нарешті, хороша робота, повністю ігноруючи мою думку щодо багатьох програм LOB, у будь-якому випадку вже потребувала базу даних.
Енді

-4

Це швидкість чи ремонтопридатність чи щось інше?

Швидкість.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.