笼式远程文件访问系统

系统目的


支持远程访问网络中计算机上的文件。 通过使用TCP协议交换事务(消息),系统“虚拟地”支持所有基本文件操作(创建,删除,读取,写入等)。


应用领域


该系统的功能在以下情况下有效:

  • 在移动和嵌入式设备(智能电话,机载控制系统等)的本机应用程序中,这些应用程序可能在连接可能暂时中断(脱机)的情况下快速访问远程服务器上的文件;
  • 在已加载的DBMS中,如果请求在某些服务器上处理,而数据存储在其他服务器上;
  • 在分布式公司网络中,用于收集和处理需要高速数据交换,冗余和可靠性的信息;
  • 在具有微服务架构的复杂系统中,模块之间交换信息的延迟至关重要。

结构形式


Cage系统(有一个实现-Windows OS中的Python 3.7的beta版)包括两个主要部分:

  1. Cageserver-文件服务器程序(功能包),在需要远程访问文件的网络计算机上运行;
  2. 笼式类,带有用于客户端软件的方法库,可简化服务器交互的编码。

在客户端使用系统


Cage类的方法代替了文件系统的常规“常规”操作: 创建,打开,关闭,删除文件,以及以二进制格式 (指示数据的位置和大小) 读取/写入数据 。 从概念上讲,这些方法接近C语言的文件功能,在C语言中,打开/关闭文件是在输入输出的“通道”上执行的。


换句话说,程序员不使用“文件”对象的方法(Python中的_io类),而是使用Cage类的方法。


创建Cage对象的实例时,它将与服务器(或多个服务器)建立初始连接,通过客户端的ID传递授权,并通过所有文件操作的专用端口号接收确认。 删除Cage对象时,它指示服务器结束连接并关闭文件。 通信的终止可以启动服务器本身。


该系统基于将客户端程序的常用文件片段缓存在RAM的缓存(缓冲区)中,从而提高了读取/写入性能。
客户端软件可以使用具有各种设置(缓冲存储器的数量,与服务器交换时块的大小等)的任意数量的Cage对象。


单个Cage对象可以与多个服务器上的多个文件交换数据。 创建对象时,将设置通信参数(IP地址或DNS服务器,用于授权的主端口,路径和文件名)。


由于每个Cage对象可以同时使用多个文件,因此共享内存空间用于缓冲。 缓存大小-页面数及其大小在创建Cage对象时动态设置。 例如,一个1 GB高速缓存是1,000个页面,每个页面1 MB,或10,000个页面,每个100 KB,或100万个页面,每个1 KB。 页面大小和页数的选择是每个应用程序的一项特定任务。


您可以同时使用多个Cage对象来定义不同的缓冲存储器设置,具体取决于访问不同文件中信息的功能。 最基本的算法是使用最简单的缓冲算法:在指定数量的内存用完之后,新页面按照报废的原则以最少的访问次数将旧页面排挤掉。 在不均匀(从统计意义上)共享的情况下,缓冲尤其有效,首先是共享给不同的文件,其次是共享给每个文件的片段。


Cage类不仅支持数据地址(指示阵列的位置和长度,“替换”文件系统操作)的输入/输出,还支持较低的“物理”级别的输入/输出-通过缓冲存储器中的页码。


对于Cage对象,支持原始的“休眠” (“睡眠”)功能-可以将它们“最小化”(例如,在与服务器断开连接或停止应用程序等的情况下),并快速将其存储到客户端的本地转储文件中从此文件还原(恢复通信后,重新启动应用程序时)。 这使得在临时“离线”之后激活客户端程序时可以显着减少流量,因为经常使用的文件片段将已经在缓存中。


笼子大约有3600行代码。


构建服务器的原理


可以使用任意数量的端口启动Cageserver文件服务器,其中一个端口(“主”端口)仅用于授权所有客户端,其余用于数据交换。 Cage服务器程序仅需要Python。 并行地,带有文件服务器的计算机可以执行任何其他工作。


服务器最初是作为两个主要过程的组合启动的:

  1. “连接” -执行与客户端建立通信并在服务器主动下终止的操作的过程;
  2. “操作” -用于完成客户端处理文件的任务(操作)以及关闭客户端命令上的通信会话的过程。

两个进程都没有同步,并且没有组织为基于多进程队列,代理对象,锁和套接字的无休止的接收和发送消息的循环。
“连接”过程为每个客户端提供了一个用于接收和传输数据的端口。 服务器启动时设置端口数。 端口和客户端之间的对应关系存储在进程之间共享的代理内存中。


“操作”过程支持文件资源的分离,并且如果“第一个”客户端首次打开文件时允许,则几个不同的客户端可以一起读取一个文件中的数据( 准并行 ,因为访问是由锁控制的)。

严格按顺序使用服务器操作系统的文件子系统在“操作”过程中执行在服务器上创建/删除/打开/关闭文件的命令的处理。


对于一般的读/写加速,这些操作在“操作”过程生成的线程中执行。 线程数通常等于打开的文件数。 来自客户端的读/写任务被提交到常规队列,第一个释放的线程将任务从她的脑海中移开。 特殊逻辑消除了服务器RAM中的数据覆盖。


“操作”过程监视客户的活动,并通过其命令和超过非活动超时时间来停止其服务。


为了确保可靠性,Cageserver记录了所有事务。 一本普通日记中包含来自客户端的消息副本,其中包含创建/打开/重命名/删除文件的任务。 为每个工作文件创建一个单独的日志,在其中写入消息副本,其中包含用于在此工作文件中读写数据的任务,以及记录的(新)数据数组和在覆盖(在“旧”状态下写入新数据”时销毁的数据)数组)


这些日志提供了还原备份中的新更改以及从当前内容“回滚”到过去正确时间的机会。


Cageserver大约有3,100行代码。


图片

启动Cageserver文件服务器程序


在对话框中启动时,需要确定:
-授权的主要端口;
-与授权客户进行交易交换的端口数量(从1个或多个端口开始,在主端口编号之后的下一个开始)。


使用笼子类


笼。 笼子cage_name =“”,pagesize = 0,numpages = 0,maxstrlen = 0,server_ip = {},wait = 0,awake = False,cache_file =“”


从此类中,创建与文件服务器交互并包含缓冲存储器的对象。


参量


  • cage_namestr )-用于在服务器端标识客户端的对象的条件名称
  • pagesizeint )-缓冲存储器一页的大小(以字节为单位)
  • numpagesint )-缓冲存储器的页面数
  • maxstrlenint )-写入和读取操作中的最大字节字符串长度
  • server_ipdict )-包含使用的服务器地址的字典,其中的键是服务器的条件名称(应用程序内的服务器ID),值是一个字符串,其地址为:“ ip address:port”或“ DNS:port”(名称和实际地址的匹配是临时的,可以更改)
  • waitint )-接收端口时等待服务器响应的时间(以秒为单位)
  • awakeboolean )-创建对象的方法的标志( False-如果创建了新对象, True-如果对象是从先前的“最小化”对象创建的-使用“休眠”操作,默认情况下为False)
  • cache_filestr )-休眠的文件名

方法


笼子 file_create服务器,路径 )-创建一个新文件


笼子 file_rename服务器,路径,new_name )-重命名文件


笼子 file_remove服务器,路径 )-删除文件


笼子 打开服务器,路径,mod )-打开文件


返回fchannel通道号。 mod参数是文件打开模式:“ wm”是互斥的(读/写),“ rs”是只读的,并且仅由其他客户端共享,“ ws”是读/写,并且仅由其他客户端共享。


笼子 关闭fchannel )-关闭文件


笼子 writefchannel,begin,data )-将字节字符串写入文件


笼子 读取fchannel,begin,len_data )-从文件读取字节字符串


笼子 put_pagesfchannel )-从缓冲区向服务器“推送”已修改的指定通道的所有页面。 当您需要确保通道上的所有操作都物理存储在服务器上的文件中时,将在算法中的这些点使用它。


笼子 push_all ()-从缓冲区向服务器“推送”已修改的Cage类实例的所有通道的所有页面。 当您需要确保所有通道上的所有操作都存储在服务器上时,可以使用它。

Source: https://habr.com/ru/post/zh-CN463085/


All Articles