zoukankan      html  css  js  c++  java
  • .Net平台下,分布式文件存储的实现

    遇到的问题 

    对于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分布式存储方案

    一台文件存储服务器+一块大磁盘,已经能够应付大多数情况了。如果想要更大的存储容量、更大的吞吐量、更安全可靠的文件部署方案,可以使用windows server上的DFS。DFS本质上还是基于文件夹共享(NFS)的,但是可以通过它来组织多太文件服务器提供统一的访问路径,从而支持大容量和大吞吐量。而且,可以配置把同一份文件存储在不同的服务器上,一台挂掉之后,文件仍然不会丢失;DFS还可以和活动目录集成,即使根服务器挂掉,仍然不影响服务器使用,从而 保证文件存储的可靠性。Windows Server下DFS的安装和使用参考:http://technet.microsoft.com/zh-cn/library/cc731089.aspx#BKMK_UI 和 http://www.cnblogs.com/cabin/archive/2010/10/07/1845020.html
    如果不想使用Windows自带的DFS,还有第三方的DFS可供选择,比如 FastDFS。
  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/FuzhePan/p/3911762.html
Copyright © 2011-2022 走看看