Sistem Akses File Jarak Jauh Kandang

Tujuan sistem

Dukungan untuk akses jarak jauh ke file di komputer di jaringan. Sistem “secara virtual” mendukung semua operasi file dasar (pembuatan, penghapusan, membaca, menulis, dll.) dengan bertukar transaksi (pesan) menggunakan protokol TCP.

Aplikasi

Fungsionalitas sistem efektif dalam kasus berikut:

  • dalam aplikasi asli untuk perangkat seluler dan tertanam (smartphone, sistem kontrol on-board, dll.) yang memerlukan akses cepat ke file di server jarak jauh dalam menghadapi kemungkinan gangguan sementara dalam komunikasi (saat offline);
  • dalam DBMS yang dimuat, jika pemrosesan kueri dilakukan di beberapa server, dan penyimpanan data dilakukan di server lain;
  • dalam jaringan perusahaan terdistribusi untuk mengumpulkan dan memproses informasi, yang memerlukan pertukaran data berkecepatan tinggi, redundansi, dan keandalan;
  • dalam sistem kompleks dengan arsitektur layanan mikro, di mana penundaan pertukaran informasi antar modul sangat penting.

Struktur

Sistem Cage (ada implementasi - versi beta dengan Python 3.7 di Windows) mencakup dua bagian utama:

  1. server kandang — program server file (paket fungsi) yang berjalan pada komputer di jaringan yang filenya memerlukan akses jarak jauh;
  2. kelas Kandang dengan perpustakaan metode untuk perangkat lunak klien, menyederhanakan pengkodean interaksi dengan server.

Menggunakan sistem di sisi klien

Metode kelas Cage menggantikan operasi sistem file “rutin” yang biasa: pembuatan, pembukaan, penutupan, penghapusan file, serta membaca/menulis data dalam format biner (menunjukkan posisi dan ukuran data). Secara konseptual, metode ini dekat dengan fungsi file dalam bahasa C, di mana pembukaan/penutupan file dilakukan “pada saluran” input/output.

Dengan kata lain, pemrogram tidak bekerja dengan metode objek “file” (class _io dengan Python), tetapi dengan metode kelas Cage.

Ketika sebuah instance dari objek Cage dibuat, ia membuat koneksi awal dengan server (atau beberapa server), diotorisasi oleh ID Klien, dan menerima konfirmasi dengan nomor port khusus untuk semua operasi file. Ketika objek Cage dihapus, ia memerintahkan server untuk berhenti berkomunikasi dan menutup file. Pemutusan komunikasi juga dapat dilakukan oleh server itu sendiri.

Sistem meningkatkan kinerja baca/tulis dengan melakukan buffering pada fragmen file program klien yang sering digunakan dalam cache RAM (buffer).
Perangkat lunak klien dapat menggunakan sejumlah objek Cage dengan pengaturan berbeda (ukuran memori buffer, ukuran blok saat bertukar dengan server, dll.).

Satu objek Cage dapat berkomunikasi dengan banyak file di beberapa server. Parameter komunikasi (alamat IP atau server DNS, port utama untuk otorisasi, jalur dan nama file) ditentukan saat membuat objek.

Karena setiap objek Cage dapat bekerja dengan banyak file secara bersamaan, ruang memori bersama digunakan untuk buffering. Ukuran cache – jumlah halaman dan ukurannya, diatur secara dinamis saat membuat objek Cage. Misalnya, cache 1 GB berarti 1000 halaman masing-masing 1 MB, atau 10 ribu halaman masing-masing 100 KB, atau 1 juta halaman masing-masing 1 KB. Memilih ukuran dan jumlah halaman adalah tugas khusus untuk setiap kasus aplikasi.

Anda dapat menggunakan beberapa objek Cage secara bersamaan untuk menentukan pengaturan memori buffer yang berbeda tergantung pada bagaimana informasi diakses dalam file yang berbeda. Sebagai dasar, algoritma buffering paling sederhana digunakan: setelah jumlah memori tertentu habis, halaman baru menggantikan halaman lama sesuai dengan prinsip penghentian dengan jumlah akses minimum. Buffering sangat efektif dalam kasus akses bersama yang tidak merata (dalam arti statistik), pertama, ke file yang berbeda, dan, kedua, ke fragmen dari setiap file.

Kelas Cage mendukung I/O tidak hanya berdasarkan alamat data (menunjukkan posisi dan panjang array, “mengganti” operasi sistem file), tetapi juga pada tingkat “fisik” yang lebih rendah - berdasarkan nomor halaman dalam memori buffer.

Fungsi asli didukung untuk objek Cage "hibernasi" (“tidur”) - mereka dapat “diciutkan” (misalnya, jika terjadi kehilangan koneksi dengan server, atau ketika aplikasi dihentikan, dll.) ke dalam file dump lokal di sisi klien dan dengan cepat dipulihkan dari file ini (setelah komunikasi dilanjutkan, saat Anda memulai ulang aplikasi). Hal ini memungkinkan pengurangan lalu lintas secara signifikan saat mengaktifkan program klien setelah "offline" sementara, karena fragmen file yang sering digunakan sudah ada di cache.

Cage berisi sekitar 3600 baris kode.

Prinsip konstruksi server

Server file Cageserver dapat dijalankan dengan jumlah port yang berubah-ubah, salah satunya (“utama”) hanya digunakan untuk otorisasi semua klien, sisanya digunakan untuk pertukaran data. Program server Cage hanya membutuhkan Python. Secara paralel, komputer dengan server file dapat melakukan pekerjaan lain.

Server awalnya dimulai sebagai kumpulan dari dua proses utama:

  1. "Koneksi" – suatu proses untuk melakukan operasi membangun komunikasi dengan klien dan mengakhirinya atas inisiatif server;
  2. "Operasi" – proses untuk melakukan tugas (operasi) klien untuk bekerja dengan file, serta untuk menutup sesi komunikasi berdasarkan perintah klien.

Kedua proses tersebut tidak disinkronkan dan diatur sebagai loop penerimaan dan pengiriman pesan tanpa akhir berdasarkan antrian multiproses, objek proxy, kunci dan soket.
Proses Koneksi mengalokasikan port untuk setiap klien untuk menerima dan mengirimkan data. Jumlah port diatur saat server dimulai. Pemetaan antara port dan klien disimpan dalam memori proksi bersama antarproses.

Proses Operasi mendukung berbagi sumber daya file sehingga beberapa klien berbeda dapat berbagi (kuasi-paralel, karena akses dikontrol oleh kunci) membaca data dari satu file jika diizinkan saat pertama kali dibuka oleh klien "pertama".

Pemrosesan perintah untuk membuat/menghapus/membuka/menutup file di server dilakukan dalam proses “Operasi” itu sendiri secara berurutan menggunakan subsistem file dari OS server.

Untuk mempercepat pembacaan/penulisan secara umum, operasi ini dilakukan di thread yang dihasilkan oleh proses “Operasi”. Jumlah thread biasanya sama dengan jumlah file yang terbuka. Tugas baca/tulis dari klien dikirimkan ke antrian umum dan thread gratis pertama mengambil tugas dari kepalanya. Logika khusus memungkinkan Anda menghilangkan operasi penulisan ulang data di RAM server.

Proses Operasi memantau aktivitas klien dan berhenti melayani mereka baik atas perintah mereka atau ketika batas waktu tidak aktif terlampaui.

Untuk memastikan keandalan, Cageserver menyimpan log semua transaksi. Satu log umum berisi salinan pesan dari klien dengan tugas membuat/membuka/mengganti nama/menghapus file. Log terpisah dibuat untuk setiap file kerja, yang mencatat salinan pesan dengan tugas membaca dan menulis data dalam file kerja ini, serta array data tertulis (baru) dan array data yang dimusnahkan selama penimpaan (penulisan). data baru “di atas” data lama). ).

Log ini memberikan kemampuan untuk memulihkan perubahan baru pada cadangan dan mengembalikan konten saat ini ke masa lalu.

Cageserver berisi sekitar 3100 baris kode.

Sistem Akses File Jarak Jauh Kandang

Meluncurkan program server file Cageserver

Saat memulai, dalam dialog Anda perlu mendefinisikan:
— pelabuhan utama untuk otorisasi;
— jumlah port untuk bertukar transaksi dengan klien resmi (dari 1 atau lebih, kumpulan nomor dimulai dari nomor di sebelah nomor port utama).

Menggunakan Kelas Kandang

kelas kandang.Kandang( cage_name="", ukuran halaman=0, numpages=0, maxstrlen=0, server_ip={}, tunggu=0, terjaga=False, cache_file="" )

Objek dibuat dari kelas ini yang berinteraksi dengan server file dan berisi memori buffer.

Parameter

  • nama_sangkar(str) - nama kondisional objek, yang digunakan untuk mengidentifikasi klien di sisi server
  • ukuran halaman(int) — ukuran satu halaman memori buffer (dalam byte)
  • angka(int) — jumlah halaman memori buffer
  • maxstrelen(int) - panjang maksimum string byte dalam operasi tulis dan baca
  • IP server(dict) - kamus dengan alamat server yang digunakan, di mana kuncinya adalah nama kondisional server (id server di dalam aplikasi), dan nilainya adalah string dengan alamat: “alamat ip:port” atau “DNS: port” (perbandingan nama dan alamat sebenarnya bersifat sementara, dapat diubah)
  • menunggu(int) — waktu tunggu respons dari server saat menerima port (dalam hitungan detik)
  • bangun(boolean) — tanda bagaimana objek dibuat (Salah - jika objek baru dibuat, Benar - jika suatu objek dibuat dari objek yang sebelumnya "diciutkan" - menggunakan operasi "hibernasi", False secara default)
  • cache_file(str) - nama file untuk hibernasi

Metode

Kurungan.file_buat( server, jalur ) – membuat file baru

Kurungan.file_rename( server, jalur, nama_baru ) – ganti nama file

Kurungan.file_hapus( server, jalur) - menghapus file

Kurungan.Buka( server, jalur, mod ) - membuka file

Kembali saluran f nomor saluran. Parameter mod - ini adalah mode pembukaan file: "wm" - eksklusif (baca/tulis), "rs" - hanya baca, dan dibagikan hanya untuk dibaca oleh klien lain, "ws" - baca/tulis, dan dibagikan hanya untuk dibaca oleh klien lain.

Kurungan.menutup penjualan (saluran f) – menutup file

Kurungan.menulis (fchannel, mulai, data ) – menulis string byte ke file

Kurungan.Baca baca (fchannel, mulai, len_data ) – membaca string byte dari file

Kurungan.put_pages ( saluran f ) – “mendorong” dari buffer ke server semua halaman saluran tertentu yang telah dimodifikasi. Ini digunakan pada titik-titik dalam algoritma ketika Anda perlu memastikan bahwa semua operasi pada saluran disimpan secara fisik dalam file di server.

Kurungan.dorong_semua () – “mendorong” dari buffer ke server semua halaman dari semua saluran untuk instance kelas Cage yang telah dimodifikasi. Digunakan ketika Anda perlu memastikan bahwa semua operasi di semua saluran disimpan di server.

Sumber: www.habr.com

Tambah komentar