
Komunitas yang terhormat, artikel ini akan fokus pada penyimpanan yang efisien dan pengiriman ratusan juta file kecil. Pada tahap ini, solusi terakhir untuk sistem file POSIX yang kompatibel dengan dukungan penuh untuk kunci, termasuk yang cluster, dan bahkan tanpa kruk, diusulkan.
Karena itu, untuk tujuan ini saya menulis server khusus saya sendiri.
Dalam perjalanan tugas ini, adalah mungkin untuk menyelesaikan masalah utama, di sepanjang jalan untuk menghemat ruang disk dan RAM, yang mana sistem file cluster kami dikonsumsi tanpa ampun. Sebenarnya, jumlah file seperti itu berbahaya bagi sistem file yang dikelompokkan.
Idenya adalah ini:
Dengan kata sederhana, file kecil diunggah melalui server, mereka disimpan langsung ke arsip, dan juga dibaca dari itu, dan file besar ditempatkan di dekatnya. Skema: 1 folder = 1 arsip, total kami memiliki beberapa juta arsip dengan file kecil, dan tidak beberapa ratus juta file. Dan semua ini sepenuhnya dilaksanakan, tanpa skrip dan melipat file menjadi arsip tar / zip.
Saya akan mencoba membuatnya lebih pendek, saya minta maaf sebelumnya jika posting akan luas.
Semuanya dimulai dengan fakta bahwa saya tidak dapat menemukan server yang sesuai di dunia yang dapat menyimpan data yang diterima melalui protokol HTTP langsung ke arsip, sehingga tidak ada kekurangan yang melekat pada arsip dan repositori objek biasa. Dan alasan pencarian adalah sekelompok 10 server yang tumbuh ke Origin skala besar, di mana 250.000.000 file kecil telah terakumulasi, dan tren pertumbuhan tidak akan berhenti.
Mereka yang tidak suka membaca artikel dan sedikit dokumentasi lebih mudah:di sini dan di
sini .
Perbarui Dihapus nginx dari gambar buruh pelabuhan.Dan buruh pelabuhan pada saat yang sama:
docker run -d --restart=always -e bindaddr=127.0.0.1:9699 \ -e host=localhost -e root=/var/storage -v /var/storage:/var/storage --name wzd \ -p 80:9699 eltaline/wzd
Selanjutnya:
Perbarui Dalam versi 1.1.0, metode otentikasi HTTPS / POST / IP dan sebagainya telah muncul.Jika ada banyak file, diperlukan sumber daya yang signifikan, dan, yang paling ofensif, beberapa di antaranya terbuang sia-sia. Misalnya, ketika menggunakan sistem file berkerumun (dalam hal ini, MooseFS), file, terlepas dari ukuran sebenarnya, selalu membutuhkan setidaknya 64 KB. Artinya, untuk file berukuran 3, 10 atau 30 KB, 64 KB diperlukan pada disk. Jika seperempat miliar file, kita kehilangan 2 hingga 10 terabyte. Tidak mungkin membuat file baru tanpa batas, karena MooseFS memiliki batasan: tidak lebih dari 1 miliar dengan satu replika dari setiap file.
Saat jumlah file bertambah, Anda membutuhkan banyak RAM untuk metadata. Sampah metadata besar yang sering juga berkontribusi pada keausan SSD.
Server WZD. Kami menempatkan disk dalam urutan.Server ditulis dalam Go. Pertama-tama, saya perlu mengurangi jumlah file. Bagaimana cara melakukannya? Karena pengarsipan, tetapi dalam hal ini tanpa kompresi, karena file saya padat, gambar terpotong. BoltDB datang ke penyelamatan, yang masih harus kekurangan, ini tercermin dalam dokumentasi.
Secara total, alih-alih seperempat miliar file, dalam kasus saya hanya 10 juta arsip Bolt yang tersisa. Jika saya memiliki kesempatan untuk mengubah struktur saat mengisi file direktori, maka akan mungkin untuk mengurangi menjadi sekitar 1 juta file.
Semua file kecil dikemas ke dalam arsip Bolt, secara otomatis menerima nama direktori di mana mereka berada, dan semua file besar tetap berdampingan dengan arsip, tidak masuk akal untuk mengemasnya, ini dapat disesuaikan. Arsip kecil, besar - biarkan tidak berubah. Server bekerja secara transparan dengan keduanya.
Arsitektur dan fitur-fitur server wZD.
Server menjalankan Linux, BSD, Solaris, dan OSX. Saya menguji hanya untuk arsitektur AMD64 di Linux, tetapi harus cocok untuk ARM64, PPC64, MIPS64 juga.
Fitur utama:- Multithreading;
- Multi-server, memberikan toleransi kesalahan dan penyeimbangan muatan;
- Transparansi maksimum untuk pengguna atau pengembang;
- Metode HTTP yang didukung: GET, HEAD, PUT dan DELETE;
- Manajemen perilaku membaca dan menulis melalui header klien;
- Dukungan untuk host virtual yang dapat disesuaikan;
- Mendukung integritas data CRC saat menulis / membaca;
- Buffer semi-dinamis untuk konsumsi memori minimal dan penyempurnaan kinerja jaringan yang optimal;
- Pemadatan data tertunda
- Selain itu, pengarsipan wZA multi-threaded ditawarkan untuk migrasi file tanpa menghentikan layanan.
Pengalaman nyata:Saya mengembangkan dan menguji server dan pengarsip pada data langsung untuk waktu yang cukup lama, sekarang berhasil beroperasi pada sebuah cluster yang mencakup 250.000.000 file kecil (gambar) yang terletak di 15.000.000 direktori pada disk SATA terpisah. Sekelompok 10 server adalah server Asal yang dipasang di belakang jaringan CDN. Untuk pemeliharaannya, 2 server Nginx + 2 server wZD digunakan.
Bagi mereka yang memutuskan untuk menggunakan server ini, masuk akal untuk merencanakan struktur direktori sebelum digunakan, jika berlaku. Segera buat reservasi bahwa server tidak dirancang untuk mendorong semuanya ke dalam arsip 1 Bolt.
Pengujian kinerja:Semakin kecil ukuran file yang diarsipkan, semakin cepat operasi GET dan PUT dilakukan. Bandingkan total waktu yang ditulis klien HTTP dengan file biasa dan arsip Bolt, dan juga bacaan. Ini membandingkan pekerjaan dengan file 32 KB, 256 KB, 1024 KB, 4096 KB dan 32768 KB.
Ketika bekerja dengan arsip Bolt, integritas data setiap file diperiksa (CRC digunakan), sebelum menulis dan juga setelah menulis, membaca dilakukan dengan cepat dan menghitung ulang, ini secara alami menimbulkan penundaan, tetapi yang utama adalah keamanan data.
Saya melakukan tes kinerja pada SSD, karena pada disk SATA tes tidak menunjukkan perbedaan yang jelas.
Pembaruan (v1.1.0), peningkatan kinerja sebesar 5-25%.Bagan berdasarkan hasil tes:

Seperti yang Anda lihat, untuk file kecil, perbedaan waktu membaca dan menulis antara file yang diarsipkan dan yang tidak diarsipkan kecil.
Kami akan mendapatkan gambar yang sangat berbeda dengan ujian membaca dan menulis file 32 MB:

Perbedaan waktu antara membaca file adalah dalam 5-25 ms. Dengan rekaman, semuanya menjadi lebih buruk, perbedaannya adalah sekitar 150 ms. Tetapi dalam hal ini, tidak perlu mengunggah file besar, ini sama sekali tidak masuk akal, mereka dapat hidup terpisah dari arsip.
* Secara teknis, server ini juga dapat digunakan untuk tugas-tugas yang membutuhkan NoSQL.
Metode dasar bekerja dengan server wZD:Unduh file biasa:
curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpg
Mengunggah file ke arsip Bolt (jika parameter server fmaxsize tidak terlampaui, yang menentukan ukuran file maksimum yang dapat disertakan dalam arsip, jika terlampaui, file akan dimuat seperti biasa di sebelah arsip):
curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpg
Mengunduh file (jika ada file dengan nama yang sama pada disk dan di arsip, maka saat mengunduh, prioritas default diberikan ke file yang tidak di-zip):
curl -o test.jpg http://localhost/test/test.jpg
Mengunduh file dari arsip Bolt (terpaksa):
curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpg
Deskripsi metode lain ada dalam dokumentasi.
Dokumentasi WZDDokumentasi WZAServer sejauh ini hanya mendukung HTTP, belum berfungsi dengan HTTPS. Metode POST juga tidak didukung (belum diputuskan apakah perlu atau tidak).
Siapa pun yang mempelajari kode sumber akan menemukan toffee di sana, tidak semua orang menyukainya, tetapi saya tidak mengikat kode utama ke fungsi kerangka web, kecuali untuk interrupt handler, sehingga di masa depan saya dapat menulis ulang dengan cepat ke hampir semua mesin.
ToDo:- Pengembangan replikator dan distributor kami sendiri + geo untuk kemungkinan digunakan dalam sistem besar tanpa FS cluster (Semua untuk orang dewasa)
- Kemampuan untuk membalikkan sepenuhnya mengembalikan metadata ketika metadata benar-benar hilang (jika menggunakan distributor)
- Protokol asli untuk kemungkinan menggunakan koneksi jaringan permanen dan driver untuk berbagai bahasa pemrograman
- Fitur canggih menggunakan komponen NoSQL
- Kompresi dari berbagai jenis (gzip, zstd, tajam) untuk file atau nilai di dalam arsip Bolt dan untuk file biasa
- Enkripsi berbagai jenis file atau nilai di dalam arsip Bolt dan untuk file biasa
- Konversi video server tertunda, termasuk GPU
Itu saja, saya harap server ini berguna bagi seseorang, lisensi BSD-3, hak cipta ganda, karena tidak akan ada perusahaan tempat saya bekerja, saya juga tidak akan menulis server. Saya seorang pengembang di singular. Saya akan berterima kasih atas bug yang ditemukan dan permintaan fitur.