Apa praktik pencatatan yang baik untuk tugas yang didistribusikan?

14

Saya memiliki pengaturan berikut:

Buat banyak pekerja, lakukan perhitungan dan hentikan mereka setelah perhitungan selesai.

Jadi, setiap kali itu akan menjadi contoh yang berbeda menjalankan tugas, sehingga setiap host akan memiliki file log sendiri, ini akan menghasilkan daftar besar file.

Apakah ini praktik yang baik? Jika tidak, apa cara yang lebih baik untuk mencatat tugas yang diproses dalam kasus penggunaan khusus ini?

PS: Infrastruktur saya tidak memiliki server. Jadi, untuk saat ini, saya masuk ke (AWS) CloudWatch. Tapi, tolong jawab pertanyaan secara independen dari AWS, dan sesuaikan setelan tanpa server sebanyak mungkin.

Dawny33
sumber

Jawaban:

12

"Serverless" kebanyakan hanya berarti Anda memiliki layanan microser yang relatif sederhana, umumnya hanya webapp kecil atau satu fungsi yang secara otomatis terhubung ke antarmuka REST. Konsep yang sama berlaku seperti yang akan Anda gunakan untuk layanan web yang lebih tradisional: biasanya beberapa campuran syslog jarak jauh dan penulis ElasticSearch.

Jaringan atau syslog jarak jauh telah ada sejak lama dan memiliki seperangkat alat yang cukup kuat di sekitarnya. Anda harus menjalankan server syslog pusat (s) tetapi protokolnya sangat sederhana dan ada pustaka klien murni dalam setiap bahasa yang dapat Anda gunakan untuk mengirim log. Satu masalah umum dengan syslog jarak jauh adalah bahwa ia secara tradisional berbasis di sekitar UDP. Ini berarti bahwa di bawah beban yang berat, beberapa pesan log mungkin hilang. Ini bisa menjadi hal yang baik, membantu menghindari kelebihan kaskade, tetapi itu adalah sesuatu yang harus diperhatikan. Beberapa daemon syslog yang lebih baru juga mendukung protokol berbasis TCP, tetapi dukungan klien kurang disatukan jadi lakukan saja riset Anda.

Yang lebih baru tetapi sangat populer adalah masuk ke ElasticSearch. Ini sebagian besar berguna karena dashboard Kibana dan Logstash tooklit (sering disebut ELK, ElasticSearch + Logstash + Kibana). Amazon bahkan menawarkan opsi ElasticSearch yang diinangi, membuatnya agak lebih mudah untuk memulai. ES menggunakan REST API yang relatif sederhana, jadi bahasa apa pun dengan klien HTTP (baca: semuanya) boleh saja dengan masuk ke ES tetapi pastikan Anda berhati-hati dengan memblokir operasi jaringan jika terjadi pemadaman sistem parsial (yaitu, pastikan Anda aplikasi tidak akan terjebak dalam panggilan logging yang tidak akan pernah berhasil dan berhenti melayani permintaan pengguna).

Topologi logging yang lebih kompleks hanya dibatasi oleh imajinasi Anda, meskipun hari ini Anda akan melihat banyak penggunaan database / antrian Kafka / apa pun yang Anda inginkan untuk memanggilnya sebagai titik nexus dalam sistem distribusi log yang sangat kompleks .

Di sisi "serverless", Anda biasanya ingin mengintegrasikan dengan sistem ini secara langsung di tingkat jaringan, jadi mengirim data log langsung ke syslog atau ES dari layanan / fungsi Anda, daripada menulis ke file lokal (meskipun mungkin bergema untuk mereka juga untuk debugging lokal dan pengembangan).

pembuat kode
sumber
6

Jawaban ini lebih tentang pertimbangan skalabilitas - jika jumlah pekerja bisa tinggi dan / atau banyak dari mereka dapat menghasilkan kayu pada tingkat tinggi pada waktu yang bersamaan.

Ya, menggunakan banyak file log secara bersamaan adalah praktik yang baik.

Mencoba untuk menggabungkan ke dalam logfile log tunggal dari beberapa pekerja secara real time akan menimbulkan masalah:

  • menggunakan mekanisme pemblokiran untuk mencegah hilangnya pesan akan memperlambat pekerja
  • pesan log dapat muncul tidak sesuai dalam file log gabungan
  • fasilitas logging terpusat yang menggabungkan log dapat kelebihan beban karena kecepatan tulis yang terbatas, pesan akan hilang

Sharding logfiles (menggunakan beberapa logfiles aktif dalam waktu yang bersamaan) itu sendiri merupakan teknik yang digunakan oleh beberapa penyedia hosting yang menawarkan layanan logging terpusat dengan kinerja tinggi dan scalable. Misalnya, ketika mengekspor log ke file, Google StackDriver Logging menghasilkan banyak file log berjumbai. Dari entri Log di Google Cloud Storage :

Ketika Anda mengekspor log ke ember Cloud Storage, Stackdriver Logging menulis satu set file ke ember. File-file tersebut diatur dalam hierarki direktori berdasarkan jenis dan tanggal log. Jenis log bisa berupa nama sederhana syslogatau nama gabungan appengine.googleapis.com/request_log. Jika log ini disimpan dalam ember bernama my-gcs-bucket, maka direktori akan dinamai seperti dalam contoh berikut:

my-gcs-bucket/syslog/YYYY/MM/DD/
my-gcs-bucket/appengine.googleapis.com/request_log/YYYY/MM/DD/

Satu ember dapat berisi log dari beberapa jenis log.

Direktori daun ( DD/) berisi banyak file, yang masing-masing menyimpan entri log yang diekspor untuk jangka waktu yang ditentukan dalam nama file. File-file tersebut sharded dan namanya berakhir dengan nomor shard, Snatau An(n = 0, 1, 2, ...). Misalnya, berikut adalah dua file yang mungkin disimpan dalam directory my-gcs-bucket/syslog/2015/01/13/:

08:00:00_08:59:59_S0.json
08:00:00_08:59:59_S1.json

Kedua file ini bersama-sama berisi syslogentri log untuk semua instance selama jam mulai 0800 UTC. Untuk mendapatkan semua entri log, Anda harus membaca semua pecahan untuk setiap periode waktu — dalam hal ini, pecahan file 0 dan 1. Jumlah pecahan file yang ditulis dapat berubah untuk setiap periode waktu tergantung pada volume entri log.

Layanan logging berkinerja tinggi seperti itu juga dapat menawarkan alternatif untuk masuk ke file, sehingga manajemen file log dapat dihindari sama sekali jika itu menarik:

Akhirnya - jika penggabungan logfile real-time bukan keharusan memiliki banyak logfile dapat membantu dengan manajemen log offline:

  • mudah untuk menyusun cadangan log progresif, kompresi, pengarsipan dan skema pembuangan akhirnya
  • pemrosesan paralel beberapa set log (logfiles) dimungkinkan, mengurangi / menghindari efek bottleneck
  • tidak diperlukan pemisahan file dan penulisan ulang
Dan Cornilescu
sumber