Mengapa filesystem lebih disukai untuk log daripada RDBMS?


44

Pertanyaan harus jelas dari judulnya. Sebagai contoh, Apache menyimpan akses dan kesalahan log dalam file, bukan RDBMS, tidak peduli seberapa besar atau kecil skala itu digunakan.

Untuk RDMS kita hanya perlu menulis query SQL dan itu akan bekerja sementara untuk file kita harus menentukan format tertentu dan kemudian menulis regex atau mungkin parser untuk memanipulasi mereka. Dan mereka bahkan mungkin gagal dalam situasi tertentu jika perhatian besar tidak dibayarkan.

Namun semua orang tampaknya lebih memilih sistem file untuk memelihara log. Saya tidak bias terhadap salah satu dari metode ini tetapi saya ingin tahu mengapa ini dipraktikkan seperti ini. Apakah kecepatan atau rawatan atau sesuatu yang lain?


10
Jadi bagaimana Anda akan mencatat kesalahan DB (db tidak tersedia misalnya) jika sistem logging Anda log ke DB?
Marjan Venema

17
@ Marsjan Bagaimana saya akan mencatat kesalahan Filesystem jika gagal ?!
Yasir

5
Cukup benar, tetapi jika itu gagal, kemungkinan DB Anda juga tidak dapat diakses ... Lagi pula, di mana / bagaimana ia menulis ke tabelnya tanpa sistem file?
Marjan Venema

2
@Yasir: Kirim semua pesan log ke server syslog sebelum masuk ke sistem file :)
Brian

1
@MarjanVenema bagaimana jika game tidak ada gunanya. Bagaimana jika disk lokal penuh, logging Anda akan gagal tetapi aplikasi dan os dapat terus berjalan. Jika Anda masuk ke server DB jarak jauh meskipun Anda masih dapat login. Ada pro dan kontra untuk menyimpan untuk pesan log, dan mana yang terbaik tergantung pada apa yang Anda coba keluar dari log. Maaf, saya akan membiarkan kawanan kembali ke file log adalah satu-satunya cara yang benar.
Andy

Jawaban:


37
  1. Terlalu banyak hal dapat gagal dengan database dan mencatat kegagalan ini juga penting.

  2. Kecuali jika Anda memiliki sistem database yang memungkinkan transaksi otonom (atau tidak ada transaksi sama sekali), logging akan memerlukan koneksi terpisah sehingga rollback atau komit dalam logging tidak mengganggu rollback atau komit dalam aplikasi.

  3. Banyak hal yang layak dicatat terjadi selama startup, yaitu mungkin sebelum koneksi database telah dibuat.

  4. Dalam apa yang bisa menjadi pengaturan khas, file log baru dibuat setiap hari, file log lama dikompresi dan disimpan selama 2 minggu, sebelum akhirnya dihapus. Tidak mudah melakukan hal yang sama dalam RDBMS.


1
Saya mencoba percobaan ini dan itu tidak berjalan dengan baik. RDBMS dirancang berdasarkan gagasan bahwa data ditulis relatif relatif jarang dibandingkan dengan berapa kali itu dibaca. Penebangan pada dasarnya adalah kebalikannya. Anda menulis sepanjang waktu dan jarang membaca. Ini adalah cara yang bagus untuk mengganggu DBA Anda.
JimmyJames

1
Orang mungkin mempertimbangkan menggunakan sistem basis data time-series seperti InfluxDB untuk menyimpan log; menurut saya itu sedikit lebih cocok untuk tugas daripada, misalnya, PostgreSQL. Namun, keuntungan dari file-file log kuno tidak ada.
user281377

Menggunakan DB non-relasional dengan pengindeksan token dll. Tentu saja bermanfaat dan jika Anda memilih dengan bijak, mereka dapat menangani selang pemadam kebakaran. Ini adalah bagian dari cara kerja splunk dan flume.
JimmyJames

# 4 sebenarnya bukan masalah. DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
Robert Harvey

@RobertHarvey Ini berfungsi dengan baik hingga Anda mencobanya di lingkungan beban berat, di mana operasi massal tersebut dapat menyebabkan masalah serius tanpa tindakan pencegahan ekstra. Ulangi log yang mengisi ruang disk Anda, batalkan tablespace menjadi terlalu penuh, replikasi menjadi sangat sibuk dengan mereplikasi penghapusan dll.
user281377

16

Saya telah melihat log yang ditulis ke DB sebelumnya (dan kadang-kadang Anda mendapatkan opsi yang dapat dikonfigurasi untuk logging, di mana jejak pergi ke file, kesalahan ke DB, fatals ke Windows Event log).

Alasan utamanya adalah kecepatan dan ukuran, memungkinkan beberapa penelusuran dapat menghasilkan kualitas logging yang luas dan luas - Saya telah menelusuri file log berukuran gigabyte. Alasan utama lainnya adalah bahwa membaca log harus berurutan, tidak ada kebutuhan nyata untuk meminta log, kecuali untuk menemukan kesalahan atau entri tertentu - dan find-in-file berfungsi dengan baik untuk itu.


Tapi saya bingung untuk ini. Notepad saya, wordpad, gedit atau notepad ++ atau browser web apa pun tidak akan senang membuka file berukuran 4GB. Namun, browser yang sama akan dapat menunjukkan kepada saya daftar seribu halaman, masing-masing berisi 500 catatan dicetak. Baik?
Yasir

7
@Yasir karena Anda menggunakan editor yang mencoba memuat seluruh file dalam memori. Cobalah menggunakan editor yang lebih pintar yang dapat 'mengalirkan' file besar. Vim adalah contoh yang bagus.
nakhli

6
@Yasir: Ini benar, tetapi Anda mencoba mengoptimalkan hal yang salah. Sebagian besar waktu, log ditulis dan tidak pernah dibaca. Jadi Anda membuat pembuatan log sangat cepat karena ini adalah kasus umum.
unholysampler

5
Eh, saya sudah melakukan logging ke database sebelumnya dan dapat dengan mudah meminta pesan log sangat bermanfaat, terutama ketika kita mengaktifkan debug level logging untuk melacak bug yang sulit ditiru.
Andy

2
@ gbjbaanb Saya tidak menemukannya berlebihan, dan terus terang Anda menyarankan menggunakan garis tanda dan memotong dan menempel ke permintaan adalah lelucon. Bukan hanya mencari, kami menganalisis tren untuk menemukan server yang memiliki lebih banyak masalah daripada yang lain, jenis kesalahan apa yang paling sering dilihat pengguna, dll.
Andy

15

Kecepatan adalah salah satu alasannya; lainnya adalah:

  • Menghilangkan titik-titik kegagalan. Sebuah sistem file jarang gagal dalam kondisi di mana DBMS tidak akan, tetapi ada banyak dan banyak kondisi kesalahan dalam database yang tidak ada di sistem file.
  • Aksesibilitas teknologi rendah. Jika keadaan benar-benar buruk, Anda dapat mem-boot ke shell penyelamat, atau me-mount disk pada sistem yang berbeda, dan masih memiliki alat yang memadai tersedia untuk memeriksa file log. Jika ini adalah basis data, Anda tidak punya tempat tanpa server basis data berjalan.

3

Pertama.

Dan mereka bahkan mungkin gagal dalam situasi tertentu jika perhatian besar tidak dibayarkan.

Transaksi basis data tidak dapat gagal saat Anda tidak berhati-hati?

Menulis ke file teks memiliki sejumlah manfaat, yang paling penting

  • Teks dapat dibaca manusia. Siapa pun dapat membuka file log dengan editor teks dasar dan melihat apa pesannya. Anda tidak perlu memahami bagaimana database diorganisasikan.
  • Kecepatan. Menulis teks ke disk jauh lebih cepat daripada layanan database yang mencari tahu di mana teks masuk dalam database, menulisnya di sana, dan memastikan transaksi selesai.

Jelas ada dan semuanya mungkin gagal jika kita tidak hati-hati. Tetapi untuk pertanyaan ini saya merujuk ke programmer tingkat tinggi. Sebagai contoh sederhana, pemrogram mungkin ingin memisahkan nilai menggunakan karakter tertentu. Jadi regexnya akan bekerja seperti mantra tetapi akan gagal ketika karakter yang sama terkandung di dalam blok nilai. Dengan cara ini dia perlu menangani kemungkinan kasus serupa dan dia tidak perlu memikirkannya jika dia menabung di DB. Juga, bisakah Anda melihat komentar saya pada jawaban gbjbaanb?
Yasir

1
Dan jika Anda menulis SQL tangan Anda, Anda memiliki masalah yang sama. Perbedaannya adalah penulisan akan gagal (atau merusak data Anda) alih-alih sedikit mengganggu pengembang karena string pencariannya memunculkan beberapa hasil buruk. Ya, ada kerangka kerja yang berarti Anda tidak perlu menulis SQL, tetapi setiap lapisan tambahan memperlambat prosesnya. Dan ingat ini hanya logging. Setiap siklus yang Anda gunakan untuk mencatat adalah siklus yang tidak Anda gunakan untuk melakukan pekerjaan nyata.
unholysampler

@unholysampler Argumen kinerja Anda lemah, penebangan dapat dilakukan dengan sangat cepat dan di utas latar belakang ke database, dan masuk ke f saat berpotensi lebih cepat juga tidak gratis, terutama jika tidak dilakukan di latar belakang.
Andy

2

Anda meningkatkan Apache secara khusus, jadi saya akan membahas ini secara rinci.

Apache dapat dikonfigurasikan untuk masuk ke database, walaupun itu membutuhkan plugin eksternal untuk melakukannya. Menggunakan plugin semacam itu dapat membuat analisis log lebih mudah, tetapi hanya jika Anda bermaksud untuk menulis perangkat lunak analisis log Anda sendiri. Alat analisis log off-the-shelf standar menganggap log Anda ada dalam file, sehingga Anda tidak akan dapat menggunakannya.

Ketika saya melakukan ini, saya juga mengalami masalah keandalan: jika buffer tulis server database terisi (yang dapat terjadi dengan mysql jika Anda menggunakan kuota sistem file Anda untuk pengguna yang menjalankannya di bawah) ia mulai mengantri kueri sampai mereka mampu untuk melanjutkan, pada titik mana Apache mulai menunggu sampai selesai, mengakibatkan permintaan digantung ke situs web Anda.

(Masalah ini sekarang dapat diperbaiki, tentu saja - bertahun-tahun yang lalu saya melakukan ini)


1

Filesystem adalah database. Ini memang basis data yang lebih sederhana, hierarkis dan bukan DBMS relasional, tetapi ini adalah basis data.

Alasan mengapa masuk ke sistem file sangat populer adalah karena log teks sangat cocok dengan filosofi Unix: "Teks adalah antarmuka universal."

Unix telah mengembangkan dengan banyak alat tujuan umum yang dapat bekerja dengan baik dengan log teks. Tidak masalah apakah log teks diproduksi oleh mysql, apache, aplikasi kustom Anda, perangkat lunak pihak ketiga yang lama tidak didukung, sysadmin dapat menggunakan alat Unix standar seperti grep, sed, awk, sort, uniq, cut, tail , dll, untuk menjelajah seluruh log.

Jika setiap aplikasi log ke database sendiri, satu ke MySQL, yang lain ke Postgres, yang lain ke Elasticsearch, yang lain ingin masuk ke ELK, yang lain hanya bisa masuk ke MongoDB, maka Anda harus belajar dua puluh alat berbeda untuk menjaring log masing-masing aplikasi. Teks adalah media universal yang dapat diakses semua orang.

Bahkan ketika Anda berhasil membuatnya sehingga semua log masuk ke database tunggal, katakanlah MySQL, Anda mungkin menemukan bahwa setiap aplikasi ingin login dengan skema tabel yang berbeda, jadi Anda masih harus menulis alat yang disesuaikan untuk meminta log untuk setiap log aplikasi. Dan jika Anda entah bagaimana menjejalkan setiap aplikasi untuk masuk ke satu skema tunggal, Anda mungkin akan menemukan bahwa skema umum tidak bisa benar-benar menceritakan kisah lengkap dari setiap aplikasi, jadi Anda masih harus mengurai teks log.

Masuk ke database sering kali tidak benar-benar membuat banyak hal lebih mudah dalam praktek.

Masuk ke basis data dapat berguna ketika Anda memiliki analisis spesifik yang ada dalam pikiran Anda, atau untuk persyaratan penyimpanan audit tertentu, di mana Anda dapat merancang skema basis data tertentu untuk mengumpulkan data hanya untuk tujuan spesifik tersebut. Tetapi untuk forensik dan debugging dan ketika Anda mengumpulkan log tanpa tujuan tertentu, log teks biasanya cukup baik sehingga biaya belajar atau membuat alat khusus seringkali tidak sepadan.


0

Mari kita lihat ini pada beberapa lapisan:

  1. Lapisan mesin
  2. Lapisan sistem operasi
  3. Lapisan layanan
  4. Lapisan aplikasi

Secara singkat:

  • Pada lapisan mesin, Anda benar-benar tidak dapat melakukan logging selain semacam dump.
  • Pada layer OS Anda dapat melakukan logging tetapi Anda benar-benar hanya memiliki sistem file yang tersedia.
  • Layanan dapat masuk ke sistem file, tetapi mereka tidak dapat memercayai layanan lain untuk berjalan sehingga mereka tidak dapat masuk ke sana.
  • Aplikasi dapat masuk ke layanan dan sistem file.

Kemudian kami memiliki pendekatan berbasis kasus penggunaan:

Apakah Anda ingin mencatat kesalahan spesifik node ke RDBMS yang diskalakan secara horizontal di mana Anda perlu mengambil pekerjaan tambahan untuk menemukan kesalahan dari node tertentu ketika Anda bisa membuka kap untuk satu simpul dan melihatnya di sana? Di sisi lain, aplikasi Anda mungkin harus masuk ke RDBMS untuk mengumpulkan kesalahan dan pemberitahuan tingkat aplikasi.

Apa yang terjadi ketika RDBMS perlu melakukan logging untuk dirinya sendiri karena database tidak dapat ditulis?


-2

Kompleksitas. Menambahkan RDBMS akan meningkatkan kompleksitas seluruh sistem secara astronomis. Dan kemampuan untuk mengelola kompleksitas adalah hal utama yang membedakan programmer dari produsen kode sumber.


1
Bisakah Anda memperluas apa yang Anda maksud tentang kompleksitas karena berkaitan dengan login ke DB versus sistem file? Dari pengalaman saya, tidak ada perbedaan signifikan dalam kompleksitas dalam lingkungan bisnis.
Adam Zuckerman

Benarkah? SqlLite meningkatkan kompleksitas secara astronomis? Dan sementara server web biasanya tidak membutuhkan DB, banyak aplikasi LOB sudah menggunakan satu, jadi tidak ada biaya tambahan sama sekali.
Andy

@AdamZuckerman tentu saja RDBMS memerlukan pemeliharaan, rawan korupsi, mungkin perlu penyetelan khusus, mungkin dipengaruhi oleh konfigurasi yang buruk, mungkin perlu pemulihan khusus, membawa batasan sendiri, memiliki dependensi sendiri, platform yang didukung, masalah pemutakhiran, bug, perizinan dan sebagainya .
noonex

@Andy pertama-tama, SQLite bukan RDBMS dalam pemanggilan arwah klasik - itu adalah "RDBMS tertanam". Dan ya - membutuhkan SQLite untuk logging akan banyak menambah kerumitan.
noonex

1
@noonex Anda hanya membuat perbedaan antara server tertanam vs server penuh, ketika RDBMS tidak. SqlLite menyediakan kepatuhan ACID, yang sebenarnya adalah tentang RDBMS. Dan itu meningkatkan kompleksitas banyak? Saya hanya bisa membayangkan Anda belum mengerjakan apa pun selain aplikasi yang paling sepele. Akhirnya, pekerjaan yang baik benar-benar mengabaikan poin saya tentang banyak aplikasi LOB sudah membutuhkan database.
Andy

-4

Apakah kecepatan atau rawatan atau sesuatu yang lain?

Kecepatan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.