• .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。
  • 相关阅读:
    TCP/IP学习笔记(3)-IP、ARP、RARP协议
    TCP/IP学习笔记(2)-数据链路层
    tcp/ip学习笔记(1)-基本概念
    实体bean里面不要轻易加transient,反序列回来之后会变成null
    [Maven实战-许晓斌]-[第三章] Mave使用入门二(在IDE中的使用) [第四章] 案例的背景介绍
    [Maven实战-许晓斌]-[第三章] Mave使用入门
    [Maven实战-许晓斌]-[第二章]-2.7-2.8 Mave安装的最优建议和安装小结
    [Maven实战-许晓斌]-[第二章]-2.6 NetBeans上面安装Maven插件
    ifdown
    ifup
  • 原文地址:https://www.cnblogs.com/FuzhePan/p/3911762.html
Copyright © 2020-2023  润新知