遇到的问题
对于Web程序,使用一台服务器的时候,客户端上传的文件一般也都是存储在这台服务器上。但在集群环境中就行不通了,如果每个服务器都存储自己接受到的文件,就乱套了,数据库中明明有这个附件的记录,却找不到这个文件。于是,文件需要进行统一集中管理,并向集群中的服务器提供统一的路径。
基于NFS的分布式文件存储实现
Network File System 简称NFS,用人话说叫共享文件夹,可以实现分布式存储文件。只需要在文件服务器上共享文件夹,并指定相应账号的权限,并给Web服务器设置可以访问共享文件夹的账号和密码,web服务器就可以像操作本地文件一样操作文件服务器上的文件了。NFS下的文件访问路径有固定的格式,称为UNC(Universal Naming Convention),以“\\”开头。
要以UNC的方式访问NFS下的文件,需要用到windows提供的两个API:WNetAddConnection2 和 WNetCancelConnection2。WNetAddConnection2可以使用指定的账号和密码创建一个UNC的连接,然后程序可以直接访问该UNC下文件。
首先创建类FileServerConnection,用于管理连接,具体代码如下:
public class FileServerConnection
{
private string uncName;
private string username;
private string password; /// <summary>
/// 构造器
/// </summary>
/// <param name="uncName">完整的UNC路径</param>
/// <param name="username">访问共享连接的用户名</param>
/// <param name="password">访问共享连接的密码</param>
public FileServerConnection(string uncName, string username, string password)
{
this.uncName = uncName;
this.username = username;
this.password = password;
} /// <summary>
/// 连接文件服务器
/// </summary>
public void Connect()
{
var netResource = new NetResource
{
Scope = ResourceScope.GlobalNetwork,
ResourceType = ResourceType.Disk,
DisplayType = ResourceDisplayType.Share,
RemoteName = this.uncName.TrimEnd('\\')
}; var result = WNetAddConnection2(netResource, password, username, 0);
if (result != 0)
throw new Win32Exception(result);
} /// <summary>
/// 释放连接
/// </summary>
public void Disconnect()
{
WNetCancelConnection2(this.uncName, 0, true);
} [DllImport("mpr.dll")]
private static extern int WNetAddConnection2(NetResource netResource,
string password,
string username,
int flags); private static extern int WNetCancelConnection2(string name, int flags, bool force);
}
FileServerConnection中所用到的几个结构体代码如下:
[StructLayout(LayoutKind.Sequential)]
public class NetResource
{
public ResourceScope Scope;
public ResourceType ResourceType;
public ResourceDisplayType DisplayType;
public int Usage;
public string LocalName;
public string RemoteName;
public string Comment;
public string Provider;
} public enum ResourceScope
{
Connected = 1,
GlobalNetwork,
Remembered,
Recent,
Context
} ; public enum ResourceType
{
Any = 0,
Disk = 1,
Print = 2,
Reserved = 8,
} public enum ResourceDisplayType
{
Generic = 0x0,
Domain = 0x01,
Server = 0x02,
Share = 0x03,
File = 0x04,
Group = 0x05,
Network = 0x06,
Root = 0x07,
Shareadmin = 0x08,
Directory = 0x09,
Tree = 0x0a,
Ndscontainer = 0x0b
}
然后在Web程序启动的时候,只需要创建一个FileServerConnection的实例,然后调用它的Connect方法。为了防止重复创建连接引发异常,可以Connect之前先DisConnect。具体调用代码如下:
fsConnection= new FileServerConnection (storeRootPath, username, password);
fsConnection.Disconnect();
fsConnection.Connect();
基于DFS分布式存储方案
.Net平台下,分布式文件存储的实现的更多相关文章
-
【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用
[网络爬虫入门05]分布式文件存储数据库MongoDB的基本操作与爬虫应用 广东职业技术学院 欧浩源 1.引言 网络爬虫往往需要将大量的数据存储到数据库中,常用的有MySQL.MongoDB和Red ...
-
分布式文件存储:FastDFS简单使用与原理分析
引言 FastDFS 属于分布式存储范畴,分布式文件系统 FastDFS 非常适合中小型项目,在我接手维护公司图片服务的时候开始接触到它,本篇文章目的是总结一下 FastDFS 的知识点. 用了 2 ...
-
分布式文件存储数据库 MongoDB
MongoDB 简介 Mongo 并非芒果(Mango)的意思,而是源于 Humongous(巨大的:庞大的)一词. MongoDB 是一个基于分布式文件存储的 NoSQL 数据库.由 C++ 语言编 ...
-
AppBoxFuture(五): 分布式文件存储-Store Everything
本来本篇是想介绍前端组件化开发用户界面,发现框架还未实现文件存储,原本计划是后续设计开发的,索性把计划提前,所以本篇将介绍基于Raft实现分布式的文件存储引擎. 一. 实现思路 既然是分布式存 ...
-
mogilefs分布式文件存储
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发.Danga团队开发了包括 Memcached.MogileFS.Perlbal ...
-
(转) 分布式文件存储FastDFS(一)初识FastDFS
http://blog.csdn.net/xingjiarong/article/details/50559849 一.FastDFS简介 FastDFS是一款开源的.分布式文件系统(Distribu ...
-
分布式文件存储FastDFS(一)初识FastDFS
一.FastDFS简单介绍 FastDFS是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.作为一个分布式文件系统,它对文件进行管理. ...
-
Centos7部署分布式文件存储(Fastdfs)
目录 FastDFS介绍 楼主目标:前可H5撩妹,后可Linux搞运维 环境:Centos7 软件: 软件链接: 安装前所有准备,上传软件到Centos7上的/opt的目录下 安装依赖软件和类库(安装 ...
-
分布式文件存储FastDFS(七)FastDFS配置文件具体解释
配置FastDFS时.改动配置文件是非常重要的一个步骤,理解配置文件里每一项的意义更加重要,所以我參考了大神的帖子,整理了配置文件的解释.原帖例如以下:http://bbs.chinaunix.net ...
随机推荐
-
Atitit webservice的发现机制 discover机制
Atitit webservice的发现机制 discover机制 1.1. Ws disconvert 的组播地址和端口就是37021 1.2. Ws disconvert的发现机制建立在udp组播 ...
-
Toad for Oracle Format Option
FmtPlus.opt [Qp5FormatterOptions] Version=252 AssignFavorWrapping=0 AssignAlignment=2 CaseAllowH ...
-
hihoCoder#1121
刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正. 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我 ...
-
siege详解
简介 siege是一款HTTP/FTP负载测试和基准压测工具 Download http://download.joedog.org/siege/siege-latest.tar.gz 安装 ...
-
小程序 - c字符串表示大整数
#define max(a, b) ((a) > (b) ? (a) : (b)) static char* reverse(char *str) { char *l, *r, c; ; l & ...
-
winform分页管理
注意:其中可能用到部分自定义的扩展方法,在使用中需自己修改一下 /// <summary> /// 分页管理 /// </summary> public class Pagin ...
-
JavaScript判断数据类型总结
最近做项目中遇到了一些关于javascript数据类型的判断处理,上网找了一下资料,并且亲自验证了各种数据类型的判断网页特效,在此做一个总结吧! 一.JS中的数据类型 1.数值型(Number):包 ...
-
ACdream 1417 Numbers
pid=1417">题目链接~~> 做题感悟:比赛的时候用的广搜,然后高高兴兴的写完果断TLE .做题的时候不管什么题都要用笔画一下,模拟几组数据,这样或许就AC了(做题经验,有 ...
-
vue.js移动端app实战1:初始配置
本系列将会用vue.js2制作一个移动端的webapp单页面,页面不多,大概在7,8个左右,不过麻雀虽小,五脏俱全,常用的效果如轮播图,下拉刷新,上拉加载,图片懒加载都会用到.css方面也会有一些描述 ...
-
python实现时间o(1)的最小栈
这是毕业校招二面时遇到的手写编程题,当时刚刚开始学习python,整个栈写下来也是费了不少时间.毕竟语言只是工具,只要想清楚实现,使用任何语言都能快速的写出来. 何为最小栈?栈最基础的操作是压栈(pu ...