Hệ thống truy cập tệp từ xa Cage

Mục đích hệ thống

Hỗ trợ truy cập từ xa vào các tập tin trên máy tính trên mạng. Hệ thống “ảo” hỗ trợ tất cả các thao tác cơ bản về tệp (tạo, xóa, đọc, ghi, v.v.) bằng cách trao đổi các giao dịch (tin nhắn) bằng giao thức TCP.

Ứng dụng

Chức năng của hệ thống có hiệu lực trong các trường hợp sau:

  • trong các ứng dụng gốc dành cho thiết bị di động và thiết bị nhúng (điện thoại thông minh, hệ thống điều khiển tích hợp, v.v.) yêu cầu truy cập nhanh vào các tệp trên máy chủ từ xa khi có thể bị gián đoạn tạm thời trong liên lạc (khi ngoại tuyến);
  • trong các DBMS đã tải, nếu việc xử lý truy vấn được thực hiện trên một số máy chủ và việc lưu trữ dữ liệu được thực hiện trên các máy chủ khác;
  • trong các mạng công ty phân tán để thu thập và xử lý thông tin, yêu cầu trao đổi dữ liệu tốc độ cao, dự phòng và độ tin cậy;
  • trong các hệ thống phức tạp có kiến ​​trúc vi dịch vụ, trong đó độ trễ trong việc trao đổi thông tin giữa các mô-đun là rất quan trọng.

Cấu trúc

Hệ thống Cage (đã có bản triển khai - phiên bản beta bằng Python 3.7 trên Windows) bao gồm hai phần chính:

  1. Máy chủ lồng — một chương trình máy chủ tập tin (một gói chức năng) chạy trên các máy tính trên mạng có tập tin yêu cầu truy cập từ xa;
  2. lớp Cage với thư viện các phương thức dành cho phần mềm máy khách, đơn giản hóa việc mã hóa tương tác với máy chủ.

Sử dụng hệ thống ở phía khách hàng

Các phương thức của lớp Cage thay thế các thao tác hệ thống tệp “thông thường” thông thường: tạo, mở, đóng, xóa các tập tin cũng như đọc/ghi dữ liệu ở định dạng nhị phân (cho biết vị trí và kích thước của dữ liệu). Về mặt khái niệm, các phương thức này gần giống với các chức năng tệp của ngôn ngữ C, trong đó việc mở/đóng tệp được thực hiện “trên các kênh” của đầu vào/đầu ra.

Nói cách khác, người lập trình không làm việc với các phương thức của đối tượng “file” (lớp _io bằng Python), nhưng với các phương thức của lớp Cage.

Khi một phiên bản của đối tượng Cage được tạo, nó sẽ thiết lập kết nối ban đầu với một máy chủ (hoặc một số máy chủ), được Id khách hàng ủy quyền và nhận được xác nhận bằng số cổng chuyên dụng cho tất cả các hoạt động của tệp. Khi một đối tượng Cage bị xóa, nó sẽ ra lệnh cho máy chủ ngừng liên lạc và đóng các tệp. Việc chấm dứt liên lạc cũng có thể được thực hiện bởi chính máy chủ.

Hệ thống cải thiện hiệu suất đọc/ghi bằng cách đệm các đoạn tệp được sử dụng thường xuyên của các chương trình máy khách trong bộ đệm RAM (bộ đệm).
Phần mềm máy khách có thể sử dụng bất kỳ số lượng đối tượng Cage nào với các cài đặt khác nhau (kích thước bộ nhớ đệm, kích thước khối khi trao đổi với máy chủ, v.v.).

Một đối tượng Cage có thể giao tiếp với nhiều tệp trên nhiều máy chủ. Các tham số truyền thông (địa chỉ IP hoặc máy chủ DNS, cổng chính để ủy quyền, đường dẫn và tên tệp) được chỉ định khi tạo đối tượng.

Vì mỗi đối tượng Cage có thể hoạt động với nhiều tệp cùng lúc nên không gian bộ nhớ dùng chung được sử dụng để lưu vào bộ đệm. Kích thước bộ đệm – số lượng trang và kích thước của chúng, được đặt động khi tạo đối tượng Lồng. Ví dụ: bộ đệm 1 GB là 1000 trang, mỗi trang 1 MB hoặc 10 nghìn trang, mỗi trang 100 KB hoặc 1 triệu trang, mỗi trang 1 KB. Việc lựa chọn kích thước và số lượng trang là công việc cụ thể cho từng trường hợp ứng dụng.

Bạn có thể sử dụng nhiều đối tượng Cage cùng lúc để xác định các cài đặt bộ nhớ đệm khác nhau tùy thuộc vào cách truy cập thông tin trong các tệp khác nhau. Là một thuật toán cơ bản, thuật toán đệm đơn giản nhất được sử dụng: sau khi hết một lượng bộ nhớ nhất định, các trang mới sẽ thay thế các trang cũ theo nguyên tắc nghỉ hưu với số lần truy cập tối thiểu. Bộ đệm đặc biệt hiệu quả trong trường hợp quyền truy cập được chia sẻ không đồng đều (theo nghĩa thống kê), trước tiên là vào các tệp khác nhau và thứ hai là vào các đoạn của mỗi tệp.

Lớp Cage hỗ trợ I/O không chỉ bằng địa chỉ dữ liệu (cho biết vị trí và độ dài của mảng, “thay thế” các hoạt động của hệ thống tệp), mà còn ở cấp độ “vật lý” thấp hơn - theo số trang trong bộ nhớ đệm.

Chức năng ban đầu được hỗ trợ cho các đối tượng Cage "ngủ đông" ("ngủ") - chúng có thể được "thu gọn" (ví dụ: trong trường hợp mất kết nối với máy chủ hoặc khi ứng dụng bị dừng, v.v.) vào tệp kết xuất cục bộ ở phía máy khách và nhanh chóng được khôi phục từ tập tin này (sau khi liên lạc được nối lại, khi bạn khởi động lại ứng dụng). Điều này giúp giảm đáng kể lưu lượng truy cập khi kích hoạt chương trình máy khách sau khi tạm thời "ngoại tuyến", vì các đoạn tệp được sử dụng thường xuyên sẽ có trong bộ đệm.

Cage có khoảng 3600 dòng mã.

Nguyên tắc xây dựng máy chủ

Máy chủ tệp Cageserver có thể chạy với số lượng cổng tùy ý, một trong số đó (“chính”) chỉ được sử dụng để ủy quyền cho tất cả khách hàng, số còn lại được sử dụng để trao đổi dữ liệu. Chương trình máy chủ Cage chỉ yêu cầu Python. Song song đó, máy tính có máy chủ tập tin có thể thực hiện bất kỳ công việc nào khác.

Máy chủ khởi động ban đầu như một tập hợp của hai quy trình chính:

  1. "Kết nối" – quy trình thực hiện các hoạt động thiết lập liên lạc với khách hàng và chấm dứt liên lạc theo sáng kiến ​​của máy chủ;
  2. "Hoạt động" – một quy trình thực hiện các nhiệm vụ (thao tác) của máy khách để làm việc với các tệp, cũng như để đóng các phiên giao tiếp dựa trên lệnh của máy khách.

Cả hai quy trình đều không được đồng bộ hóa và được tổ chức thành các vòng lặp vô tận để nhận và gửi tin nhắn dựa trên hàng đợi đa quy trình, đối tượng proxy, khóa và ổ cắm.
Quá trình kết nối phân bổ một cổng cho mỗi máy khách để nhận và truyền dữ liệu. Số lượng cổng được đặt khi máy chủ khởi động. Ánh xạ giữa các cổng và máy khách được lưu trữ trong bộ nhớ proxy chia sẻ giữa các tiến trình.

Quy trình Hoạt động hỗ trợ chia sẻ tài nguyên tệp để nhiều máy khách khác nhau có thể chia sẻ (gần như song song, vì quyền truy cập được kiểm soát bằng khóa) đọc dữ liệu từ một tệp nếu điều này được cho phép khi nó được mở lần đầu bởi máy khách "đầu tiên".

Việc xử lý các lệnh tạo/xóa/mở/đóng tệp trên máy chủ được thực hiện trong chính quy trình “Hoạt động” một cách tuần tự nghiêm ngặt bằng cách sử dụng hệ thống con tệp của hệ điều hành máy chủ.

Để tăng tốc độ đọc/ghi nói chung, các thao tác này được thực hiện trong các luồng do quy trình “Hoạt động” tạo ra. Số lượng chủ đề thường bằng số lượng tệp đang mở. Các tác vụ đọc/ghi từ máy khách được gửi đến hàng đợi chung và luồng rảnh đầu tiên nhận tác vụ từ phần đầu của nó. Logic đặc biệt cho phép bạn loại bỏ các thao tác ghi lại dữ liệu trong RAM của máy chủ.

Quy trình Hoạt động giám sát hoạt động của máy khách và dừng phục vụ chúng theo lệnh của chúng hoặc khi vượt quá thời gian chờ không hoạt động.

Để đảm bảo độ tin cậy, Cageserver lưu giữ nhật ký của tất cả các giao dịch. Một nhật ký chung chứa các bản sao của tin nhắn từ máy khách có nhiệm vụ tạo/mở/đổi tên/xóa tệp. Một nhật ký riêng được tạo cho mỗi tệp làm việc, trong đó các bản sao của thông báo có nhiệm vụ đọc và ghi dữ liệu trong tệp làm việc này được ghi lại, cũng như các mảng dữ liệu đã ghi (mới) và các mảng dữ liệu đã bị hủy trong quá trình ghi đè (ghi). dữ liệu mới “lên trên” dữ liệu cũ). ).

Các nhật ký này cung cấp khả năng khôi phục các thay đổi mới cho bản sao lưu và khôi phục nội dung hiện tại về một điểm trong quá khứ.

Cageserver có khoảng 3100 dòng mã.

Hệ thống truy cập tệp từ xa Cage

Khởi chạy chương trình máy chủ tệp Cageserver

Khi bắt đầu, trong hộp thoại bạn cần xác định:
- cổng chính để cấp phép;
— số lượng cổng để trao đổi giao dịch với khách hàng được ủy quyền (từ 1 trở lên, nhóm số bắt đầu từ số bên cạnh số cổng chính).

Sử dụng lớp lồng

tốt nghiệp lớp XNUMX cái lồng.Cage( lồng_name="", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, Wake=False, cache_file="" )

Các đối tượng được tạo từ lớp này tương tác với máy chủ tệp và chứa bộ nhớ đệm.

Tham số

  • lồng_name(str) - tên có điều kiện của đối tượng, được sử dụng để xác định máy khách ở phía máy chủ
  • kích thước trang(int) - kích thước của một trang bộ nhớ đệm (tính bằng byte)
  • số trang(int) - số lượng trang bộ nhớ đệm
  • maxstrlen(int) - độ dài tối đa của chuỗi byte trong thao tác ghi và đọc
  • máy chủ_ip(mệnh lệnh) - một từ điển có địa chỉ của các máy chủ được sử dụng, trong đó khóa là tên có điều kiện của máy chủ (id máy chủ bên trong ứng dụng) và giá trị là một chuỗi có địa chỉ: “địa chỉ ip:port” hoặc “DNS: port” (việc so sánh tên và địa chỉ thực chỉ mang tính chất tạm thời, có thể thay đổi)
  • chờ đợi(int) - thời gian chờ phản hồi từ máy chủ khi nhận cổng (tính bằng giây)
  • tỉnh táo(boolean) - cờ về cách tạo đối tượng (Sai - nếu một đối tượng mới được tạo ra, Thật - nếu một đối tượng được tạo từ một đối tượng "bị thu gọn" trước đó - sử dụng thao tác "ngủ đông", Sai theo mặc định)
  • tập tin bộ nhớ cache(str) - tên file để ngủ đông

Phương pháp

Lồng.tập tin_tạo( máy chủ, đường dẫn ) – tạo một tập tin mới

Lồng.đổi tên tập tin( máy chủ, đường dẫn, new_name ) – đổi tên tập tin

Lồng.file_remove( máy chủ, đường dẫn) - xóa một tập tin

Lồng.mở( máy chủ, đường dẫn, mod ) - mở tập tin

Lợi nhuận kênh f số kênh. Tham số mod - đây là chế độ mở tệp: "wm" - độc quyền (đọc/ghi), "rs" - chỉ đọc và chỉ chia sẻ để đọc bởi các máy khách khác, "ws" - chỉ đọc/ghi và chỉ chia sẻ để đọc bởi các khách hàng khác.

Lồng.gần (kênh f) – đóng tập tin

Lồng.viết (fchannel, bắt đầu, dữ liệu ) – ghi một chuỗi byte vào một tập tin

Lồng.đọc (fchannel, bắt đầu, len_data ) – đọc một chuỗi byte từ một tập tin

Lồng.đặt_trang ( kênh f ) – “đẩy” từ bộ đệm đến máy chủ tất cả các trang của kênh được chỉ định đã được sửa đổi. Nó được sử dụng tại những điểm đó trong thuật toán khi bạn cần chắc chắn rằng tất cả các hoạt động trên kênh đều được lưu vật lý vào một tệp trên máy chủ.

Lồng.đẩy_tất cả () – “đẩy” từ bộ đệm đến máy chủ tất cả các trang của tất cả các kênh đối với một phiên bản của lớp Cage đã được sửa đổi. Được sử dụng khi bạn cần chắc chắn rằng mọi thao tác trên tất cả các kênh đều được lưu trên máy chủ.

Nguồn: www.habr.com

Thêm một lời nhận xét