RDBMS yerine günlükler için dosya sistemi neden tercih edilir?


44

Soru başlığından net olmalıdır. Örneğin Apache, ne kadar büyük ya da küçük ölçekte kullanıldığı fark etmeksizin, erişim ve hata günlüklerini RDBMS yerine dosyalara kaydeder.

RDMS için sadece SQL sorguları yazmalıyız ve bu iş için çalışacak, dosyalar için belirli bir formata karar vermeli ve daha sonra regex yazmalı ya da bunları işlemek için ayrıştırıcı olabilir. Ve eğer büyük özen gösterilmezse, bunlar özel durumlarda bile başarısız olabilirler.

Yine de herkes günlükleri korumak için dosya sistemini tercih ediyor gibi görünüyor. Bu yöntemlerin hiçbirine karşı taraflı değilim, ancak bunun neden böyle uygulandığını bilmek istiyorum. Hız mı, bakım kolaylığı mı yoksa başka bir şey mi?


10
Peki, kayıt sisteminiz bir DB'ye giriş yaparsa, DB hatalarını (örneğin, db kullanılamaz) nasıl kaydedersiniz?
Marjan Venema

17
@Marjan Başarısız olursa, Dosya Sistemi hatalarını nasıl günlüğe kaydederim ?!
Yasir

5
Oldukça doğru, ama bu başarısız olursa, DB'nizde erişilemez olma ihtimali de var ... Sonuçta, dosya sistemi olmadan tablolarına nereye / nasıl yazacaktı?
Marjan Venema

2
@Yasir: Dosya sistemine giriş yapmadan önce tüm günlük mesajlarını syslog sunucusuna gönder :)
Brian

1
@MarjanVenema ne oyun eğer anlamsız ise. Yerel disk doluysa, günlüğe kaydetmeniz başarısız olur ancak uygulama ve işletim sistemi devam edebilir. Eğer uzak bir DB sunucusuna giriş yapıyorsanız, yine de giriş yapabilirsiniz. Her iki günlük iletisini de depolamak için avantajlar ve dezavantajlar vardır ve hangisi en iyisi, günlüğe kaydetmeden ne çıkarmaya çalıştığınıza bağlıdır. Üzgünüm, sürünün dosya günlüğüne geri dönmesine izin vereceğim tek yol bu.
Andy,

Yanıtlar:


37
  1. Veritabanında çok fazla şey başarısız olabilir ve bu hataların kaydedilmesi de önemlidir.

  2. Özerk işlemlere izin veren (veya hiç işlem yapılmayan) bir veritabanı sisteminiz yoksa, günlük kaydı ayrı bir bağlantı gerektirir; bu nedenle günlüğe kaydetme veya teslim etme işlemi, geri alma işlemine karışmaz veya uygulamada kesinleşmez.

  3. Günlüğe kaydetmeye değer birçok şey başlangıç ​​sırasında, yani muhtemelen veritabanı bağlantısı kurulmadan önce gerçekleşir.

  4. Tipik bir kurulumda, her gün yeni bir günlük dosyası oluşturulur, eski günlük dosyaları sıkıştırılır ve en sonunda silinmeden önce 2 hafta bekletilir. Aynı şeyi bir RDBMS'de yapmak kolay değildir.


1
Bu deneyi denedim ve iyi gitmedi. RDBMS, verilerin okunma sayısına göre nispeten seyrek olarak yazıldığı fikri etrafında tasarlanmıştır. Günlük kaydı temelde tam tersidir. Her zaman yazıyorsun ve nadiren okuyorsun. Bu, DBA’nızı rahatsız etmenin harika bir yoludur.
JimmyJames

1
Yine de, günlükleri saklamak için InfluxDB gibi bir zaman serisi veritabanı sistemi kullanmayı düşünebilirsiniz; Bana göre görev, örneğin PostgreSQL'den biraz daha iyi. Yine de, eski moda günlük dosyalara göre avantaj pek zor değil.
user281377 17:17

Token indekslemesi vb. İle ilişkisel olmayan bir DB kullanmak kesinlikle faydalıdır ve akıllıca seçerseniz yangın hortumunu kullanabilirler. Bu, parçalanma ve salyangoz gibi şeylerin nasıl çalıştığının bir parçasıdır.
JimmyJames

# 4 gerçekten bir sorun değil. DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
Robert Harvey,

@RobertHarvey Bu, yoğun işlemlerde, bu tür toplu işlemlerin ekstra önlem alınmadan ciddi sorunlara neden olabileceği bir ortamda çalışana kadar iyi çalışır. Disk alanı dolduran Yinele günlükleri, geri alma tablo alanı çoğaltma silme vb kopyalayan ile çok meşgul olma, çok dolu olma
user281377

16

Daha önce DB'ye yazılmış günlükleri gördüm (ve bazen izlemenin dosyaya gittiği, DB'deki hatalar, Windows Olay günlüğünde önemli olmayan günlükler için yapılandırılabilir seçenekler elde edersiniz).

Başlıca nedenler hız ve boyuttur, bazı izlemelerin etkinleştirilmesi, kayıtların çok büyük, çok büyük miktarlarda kalmasına neden olabilir - Büyüklükteki kütük dosyalarının arasında dolandım. Diğer bir ana sebep de günlükleri okumanın sıralı olması, belirli bir hata veya girdi bulmak dışında günlükleri sorgulamanın gerçek bir gerekliliği olmaması ve dosya bulma işleminin bunun için mükemmel bir şekilde çalışmasıdır.


Ama bunun için bir kafa karışıklığım var. Notepad, wordpad, gedit veya notepad ++ veya herhangi bir web tarayıcısında 4GB boyutunda bir dosya açmaktan mutlu olmaz. Bununla birlikte, aynı tarayıcı bana her biri basılı 500 kayıt içeren bin sayfanın bir listesini gösterebilecek. Sağ?
Yasir

7
@Yasir çünkü tüm dosyayı belleğe yüklemeye çalışan editörler kullanıyorsunuz. Büyük dosyayı 'aktarabilen' daha akıllı bir düzenleyici kullanmaya çalışın. Vim iyi bir örnek.
nakhli

6
@Yasir: Bu doğru, ancak yanlış olanı optimize etmeye çalışıyorsun. Zamanın büyük çoğunluğu, günlükler yazılır ve asla okunmaz. Demek günlükleri çok hızlı oluşturuyorsun, çünkü bu ortak bir durum.
unholysampler

5
Eh, daha önce veritabanına giriş yaptım ve günlük mesajlarını kolayca sorgulayabiliyordum, özellikle de çoğaltılması zor bir hatayı bulmak için hata ayıklama seviyesi günlüğünü açtığımızda çok faydalı oldu.
Andy,

2
@gbjbaanb Fazla abartılı bulamadım ve açıkçası sorgulamak için işaretleme çizgileri ile kesme ve yapıştırma yöntemlerini kullanmanızı öneriyorsunuz. Bu sadece arama yapmak yerine biz diğerlerinden daha fazla sorunları vardı sunucuları, nazik hatalar kullanıcıların neyi vb çoğunlukla görmeye bulmak için eğilimleri analiz
Andy

15

Hız bir nedendir; diğerleri:

  • Arıza noktalarını ortadan kaldırmak. Bir dosya sistemi nadiren bir DBMS'nin bulunmadığı koşullar altında başarısız olur, ancak veritabanlarında dosya sistemlerinde basit olmayan çok sayıda hata koşulu vardır.
  • Düşük teknoloji erişilebilirliği. İşler gerçekten çok kötüye giderse, kurtarma kabuğuna önyükleyebilir veya diski farklı bir sisteme takabilirsiniz ve yine de günlük dosyalarını denetlemek için yeterli araçlara sahip olabilirsiniz. Eğer bir veritabanıysa, çalışan bir veritabanı sunucusu olmadan hiçbir yerde olmazsınız.

3

İlki.

Ve eğer büyük özen gösterilmezse, bunlar özel durumlarda bile başarısız olabilirler.

Dikkatli değilken veritabanı işlemleri başarısız olamaz?

Bir metin dosyasına yazmanın birçok yararı vardır, en önemlisi

  • Metin insan tarafından okunabilir. Herkes basit bir metin düzenleyiciyle bir günlük dosyası açabilir ve mesajların ne olduğunu görebilir. Veritabanının nasıl düzenlendiğini anlamanıza gerek yok.
  • Hız. Diske metin yazmak, metnin bir veritabanında nereye gittiğini bulmak, orada yazmak ve işlemin tamamlanmasını sağlamak için bir veritabanı hizmetinden çok daha hızlıdır.

Açıkçası, eğer dikkatli olmazsak her şey başarısız olabilir. Ancak bu soru için üst düzey programcıyı kastediyordum. Basit bir örnek olarak, programcı belirli bir karakter kullanarak değerleri ayırmak isteyebilir. Dolayısıyla regex'i bir cazibe gibi çalışacak, ancak aynı karakter bir değer bloğunda bulunduğunda başarısız olacaktır. Bu şekilde, benzer olası davalara bakması ve DB'de tasarruf etmekte olup olmadığını düşünmesi gerekmiyor. Ayrıca, lütfen gbjbaanb'ın cevabı hakkındaki yorumumu görebilir misiniz?
Yasir

1
Eğer SQL'inizi elle yazıyorsanız, aynı problemi yaşarsınız. Arama dizesi bazı kötü sonuçlar getirdiğinden, yazarı oluşturan fark biraz geliştiriciyi rahatsız etmek yerine başarısız olur (veya verilerinizi bozar). Evet, SQL yazmak zorunda kalmayacağınız çerçeveler var, ancak her ekstra katman işlemi yavaşlatıyor. Ve bunun sadece günlüğe kaydettiğini unutmayın. Günlüğe kaydetmek için kullandığınız her döngü gerçek iş yapmak için kullanmadığınız bir döngüdür.
unholysampler

@unholysampler Performans argümanınız zayıf, günlüğe kaydetme işlemi çok hızlı ve arka planda bir veritabanında yapılabilir ve f'ler için günlüğe kaydetme işlemi, özellikle arka planda yapılmadığı takdirde, daha hızlı da olabilir.
Andy,

2

Özellikle Apache'yi yükseltiyorsunuz, bu yüzden bunu detaylı olarak tartışacağım.

Apache bir veritabanına giriş yapmak için yapılandırılabilir, bunun için harici bir eklenti gerektirir . Böyle bir eklenti kullanmak log analizini kolaylaştırabilir, ancak yalnızca kendi log analiz yazılımınızı yazmayı düşünüyorsanız. Standart kullanıma hazır günlük analiz cihazları, günlüklerinizin dosyalarda olduğunu varsayar, bu nedenle bunları kullanamazsınız.

Bunu yaparken de güvenilirlik sorunları yaşadım: eğer veritabanı sunucusunun yazma arabelleği doluysa (ki altında çalışan kullanıcı için dosya sistemi kotanızı kullanırsanız mysql ile gerçekleşebilir), mümkün olana kadar sorguları sıraya sokmaya başlar. devam etmek için, Apache'nin hangi noktada bitmesini beklemeye başladığı, web sitenize asılan isteklerle sonuçlanır.

(Tabii ki bu sorun şimdi düzeltilebilir - tabii bunu yıllar önce yaptım)


1

Bir dosya sistemi bir veritabanıdır. Gerçekten de ilişkisel bir DBMS yerine basit, hiyerarşik bir veritabanıdır, ancak yine de bir veritabanıdır.

Bir dosya sistemine giriş yapmanın popüler olmasının nedeni, metin kayıtlarının Unix felsefesine iyi uymasıdır: "Metin evrensel arayüzdür."

Unix, metin kayıtlarıyla iyi çalışabilecek birçok genel amaçlı araç geliştirmişti. Metin günlüklerinin mysql, apache, özel uygulamanız, uzun süredir desteklenmeyen üçüncü taraf yazılımı tarafından üretilip üretilmediği önemli değildir, sysadmin grep, sed, awk, sort, uniq, cut, tail gibi standart Unix araçlarını kullanabilir , vb, günlükleri aynı şekilde trol etmek için.

Her uygulama kendi veritabanına, biri MySQL'e, diğeri Postgres'e, diğeri Elasticsearch'e giriş yaparsa, diğeri ELK'ye giriş yapmak ister, diğeri yalnızca MongoDB'ye giriş yapabilir, o zaman her birinin günlüklerini taramak için yirmi farklı araç öğrenmeniz gerekir. uygulama. Metin, herkesin giriş yapabileceği evrensel bir ortamdır.

Tüm günlüklerin tek bir veritabanına girmesini sağlamayı başarsanız bile, MySQL'i söyleyin, her uygulamanın farklı tablo şemaları ile giriş yapmasını isteyebilirsiniz; uygulama. Ve eğer her bir uygulamayı tek bir şemaya giriş yapmak için tıka basa doldurduysanız, genel şemanın size her uygulamanın tam hikayesini anlatamayacağını muhtemelen göreceksiniz.

Bir veritabanına giriş yapmak çoğu zaman uygulamada işleri gerçekten daha kolay hale getirmez.

Bir veritabanına giriş yapmak, aklınızdaki belirli bir analiziniz olduğunda ya da sadece bu belirli amaçlara ait verileri toplamak üzere belirli bir veritabanı şeması tasarlayabileceğiniz belirli denetim yeniden işleme gereklilikleri için faydalı olabilir. Ancak, adli tıp ve hata ayıklama için ve belirli bir hedef göz önünde bulundurulmadan günlük topladığınızda, metin günlükleri genellikle öğrenme veya özel araçlar oluşturma maliyetinin genellikle buna değmeyeceği kadar iyidir.


0

Buna birkaç katmanda bakalım:

  1. Makine katmanı
  2. İşletim sistemi katmanı
  3. Servis katmanı
  4. Uygulama katmanı

Kısaca:

  • Makine katmanında, bir tür çöplükten başka günlük kaydı yapamazsınız.
  • İşletim sistemi katmanında günlük kaydı yapabilirsiniz, ancak gerçekten yalnızca dosya sisteminize sahipsiniz.
  • Servisler dosya sistemine giriş yapabilir, ancak çalışmakta olan diğer servislere güvenemezler, böylece orada giriş yapamazlar.
  • Uygulamalar servislere ve dosya sistemine giriş yapabilir.

O zaman kullanıma dayanan yaklaşımımız var:

Düğüme özgü hataları, bir düğümün kaputunu açıp orada gördüğünüzde, belirli bir düğümün hatasını bulmak için fazladan çalışmanız gereken yatay olarak ölçeklendirilmiş bir RDBMS'ye kaydetmek ister misiniz? Diğer taraftan, uygulamanız, uygulama düzeyinde hatalar ve bildirimler toplamak için büyük olasılıkla bir RDBMS'ye giriş yapmalıdır.

Veritabanının yazılamadığı için RDBMS'nin kendisi için giriş yapması gerektiğinde ne olur?


-2

Karmaşıklık. RDBMS eklemek, tüm sistemin karmaşıklığını astronomik olarak artıracaktır. Ve karmaşıklığı yönetme yeteneği, programcıları kaynak kod üreticilerinden ayıran en önemli şeydir.


1
Bir dosya sistemine karşı bir DB'ye giriş yapmakla ilgili karmaşıklık hakkında ne demek istediğinizi genişletebilir misiniz? Tecrübelerime göre, bir iş ortamındaki karmaşıklık bakımından önemli bir fark olmamıştır.
Adam Zuckerman

Gerçekten mi? SqlLite karmaşıklığı astronomik olarak arttırıyor mu? Bir web sunucusu normalde bir DB'ye ihtiyaç duymazken, birçok LOB uygulaması zaten bir tane kullanıyor, bu yüzden orada hiçbir ek ücret yok.
Andy,

Elbette herhangi bir RDBMS'nin bakım gerektirmesi, yolsuzluğa yatkın olması, özel ayarlamalar yapılması gerekebilir, kötü konfigürasyondan etkilenebilir, özel kurtarma gerekebilir, kendi sınırlamaları vardır, kendi bağımlılıkları, desteklenen platformlar, yükseltme sorunları, hatalar, lisanslama vb. .
noonex

@Edy ilk olarak, SQLite klasik seansta RDBMS değildir - "gömülü RDBMS" dir. Ve evet - kayıt için SQLite gerektiren karmaşıklığı çok artıracaktır.
noonex

1
@noonex Siz RDBMS olmadığında, tam sunucuya tam sunucu arasında bir ayrım yapma hakkını veriyorsunuz. SqlLite, RDBMS'nin gerçekte olduğu şey olan ACID uyumluluğunu sağlar. Ve karmaşıklığı çok mu arttırıyor? En önemsiz uygulamalardan başka hiçbir şey üzerinde çalışmadığınızı hayal edebiliyorum. Son olarak, iyi bir iş, birçok LOB uygulaması hakkındaki fikrimi tamamen göz ardı ederek zaten bir veritabanına ihtiyaç duyuyordu.
Andy

-4

Hız mı, bakım kolaylığı mı yoksa başka bir şey mi?

Hız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.