搜索词>>分布式文件系统 耗时0.0050
  • 分布式文件系统FastDFS详解

    分布式文件系统FastDFS详解<h2>为什么要使用分布式文件系统呢?</h2> <p>嗯,这个问题问的好,使用了它对我们有哪些好处?带着这个问题我们来往下看:</p> <h3>单机时代</h3> <p>初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如: <code>resources\static\file</code>、 <code>resources\static\img</code>等。</p> <p><strong>优点</strong>:这样做比较便利,项目直接引用就行,实现起来也简单,无需任何复杂技术,保存数据库记录和访问起来也很方便。</p> <p><strong>缺点</strong>:如果只是后台系统的使用一般也不会有什么问题,但是作为一个前端网站使用的话就会存在弊端。一方面,文件和代码耦合在一起,文件越多存放越混乱;另一方面,如果流量比较大,静态文件访问会占据一定的资源,影响正常业务进行,不利于网站快速发展。</p> <h3>独立文件服务器</h3> <p>随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题引入独立图片服务器,工作流程如下:项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过ngnix或者apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。</p> <p><strong>优点</strong>:图片访问是很消耗服务器资源的(因为会涉及到操作系统的上下文切换和磁盘I/O操作),分离出来后,Web/App服务器可以更专注发挥动态处理的能力;独立存储,更方便做扩容、容灾和数据迁移;方便做图片访问请求的负载均衡,方便应用各种缓存策略(HTTP Header、Proxy Cache等),也更加方便迁移到CDN。</p> <p><strong>缺点</strong>:单机存在性能瓶颈,容灾、垂直扩展性稍差</p> <h3>分布式文件系统</h3> <p>通过独立文件服务器可以解决一些问题,如果某天存储文件的那台服务突然down了怎么办?可能你会说,定时将文件系统备份,这台down机的时候,迅速切换到另一台就OK了,但是这样处理需要人工来干预。另外,当存储的文件超过100T的时候怎么办?单台服务器的性能问题?这个时候我们就应该考虑分布式文件系统了。</p> <p>业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。分布式文件系统,一般分为三块内容来配合,服务的存储、访问的仲裁系统,文件存储系统,文件的容灾系统来构成,仲裁系统相当于文件服务器的大脑,根据一定的算法来决定文件存储的位置,文件存储系统负责保存文件,容灾系统负责文件系统和自己的相互备份。</p> <p><strong>优点</strong>:扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行</p> <p><strong>缺点</strong>:系统复杂度稍高,需要更多服务器</p> <h2>FastDFS</h2> <p>毫无疑问FastDFS就属于我们上面介绍的分布式文件系统,下面我们来详细了解一下:</p> <h3>什么是FastDFS</h3> <p>FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开发向用户提供了:网盘,社区,广告和应用下载等业务的存储服务。</p> <p>FastDFS是一款开源的轻量级分布式文件系统纯C实现,支持Linux、FreeBSD等UNIX系统类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适。</p> <h3>FastDFS相关概念</h3> <p>FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。</p> <p><strong>tracker server</strong>:跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。</p> <p>Tracker是FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。</p> <p>Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。</p> <p><strong>storage server</strong>:存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。</p> <p>Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。</p> <p>以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。</p> <p>group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在 <code>/data/disk1-/data/disk10</code>,则可将这10个目录都配置为storage的数据存储目录。</p> <p>storage接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。</p> <p><strong>client</strong>:客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。</p> <p>另外两个概念:</p> <p><strong>group</strong> :组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。</p> <p><strong>meta data</strong> :文件相关属性,键值对( Key Value Pair) 方式,如:width=1024,heigth=768 。</p> <p><img alt="1" class="img-thumbnail" src="/assist/images/blog/8bcde557864841f88b181d6ec4a4ebd4.png" /></p> <p>Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。</p> <h3>上传机制</h3> <p>首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。</p> <p><img alt="2" class="img-thumbnail" src="/assist/images/blog/622336b2401b41308372ec762d517c71.png" /></p> <p>内部机制如下:</p> <p><strong>1、选择tracker server</strong></p> <p>当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。 选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:</p> <ul> <li> <p>1、Round robin,所有的group间轮询</p> </li> <li> <p>2、Specified group,指定某一个确定的group</p> </li> <li> <p>3、Load balance,剩余存储空间多多group优先</p> </li> </ul> <p><strong>2、选择storage server</strong></p> <p>当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:</p> <ul> <li> <p>1、Round robin,在group内的所有storage间轮询</p> </li> <li> <p>2、First server ordered by ip,按ip排序</p> </li> <li> <p>3、First server ordered by priority,按优先级排序(优先级在storage上配置)</p> </li> </ul> <p><strong>3、选择storage path</strong></p> <p>当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:</p> <ul> <li> <p>1、Round robin,多个存储目录间轮询</p> </li> <li> <p>2、剩余存储空间最多的优先</p> </li> </ul> <p><strong>4、生成Fileid</strong></p> <p>选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。</p> <p><strong>5、生成文件名</strong></p> <p>当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。</p> <h3>下载机制</h3> <p>客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。</p> <p><img alt="3" class="img-thumbnail" src="/assist/images/blog/d7ee87a725024e76b6080bc76b4d5031.png" /></p> <p>跟upload file一样,在download file时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage。</p> <ul> <li> <p>1、该文件上传到的源头storage - 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。</p> </li> <li> <p>2、文件创建时间戳==storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。</p> </li> <li> <p>3、文件创建时间戳 < storage被同步到的时间戳。 - 同步时间戳之前的文件确定已经同步了</p> </li> <li> <p>4、(当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了。</p> </li> </ul> <h3>同步时间管理</h3> <p>当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢? 其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。同步信息上报如下图:</p> <p><img alt="4" class="img-thumbnail" src="/assist/images/blog/a12c788adede4a28b8e567c88dc7fbc5.png" /></p> <p>写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。</p> <p>每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。</p> <p>storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。 比如一个group内有A、B、C三个storage server,A向C同步到进度为T1 (T1以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2 > T1),tracker接收到这些同步进度信息时,就会进行整理,将最小的那个做为C的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker会为A、B生成一个同步时间戳。</p> <h3>精巧的文件ID-FID</h3> <p>说到下载就不得不提文件索引(又称:FID)的精巧设计了。文件索引结构如下图,是客户端上传文件后存储服务器返回给客户端,用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。</p> <p><img alt="5" class="img-thumbnail" src="/assist/images/blog/4e66f104b1e1430292b2db37a071d885.jpg" /></p> <ul> <li> <p>组名:文件上传后所在的存储组名称,在文件上传成功后有存储服务器返回,需要客户端自行保存。</p> </li> <li> <p>虚拟磁盘路径:存储服务器配置的虚拟路径,与磁盘选项store_path*对应。</p> </li> <li> <p>数据两级目录:存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。</p> </li> <li> <p>文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。</p> </li> </ul> <p><strong>快速定位文件</strong></p> <p>知道FastDFS FID的组成后,我们来看看FastDFS是如何通过这个精巧的FID定位到需要访问的文件。</p> <ul> <li> <p>1、通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;</p> </li> <li> <p>2、存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。</p> </li> </ul> <p><img alt="6" class="img-thumbnail" src="/assist/images/blog/f1febebc58614ab4b71e2ce0dc2e5091.png" /></p> <p>如何搭建FastDFS?参考我博客的这篇文章 <strong>(FastDFS 集群 安装 配置:http://www.ityouknow.com/fastdfs/2017/10/10/cluster-building-fastdfs.html)</strong>,下图为某用户搭建的架构示意图</p> <p><img alt="7" class="img-thumbnail" src="/assist/images/blog/ef960a1f4c574e6f9790895b3974c933.png" /></p> <blockquote> <p>文中图片均来源于网络</p> </blockquote> <br />  
  • 分布式系统架构_分布式事物_分布式系统原理

    分布式系统架构_分布式事物_分布式系统原理<h2>引言</h2>     随着大数据时代的到来。大多数之前业务系统已经无法承受大数据带来的冲击。各个大公司小公司都在考虑如何优化自己的业务系统。提高业务能力减少成本支出。随之就引出了 <strong>分布式系统</strong>。 <h2>一.为什么要进行<strong>分布式系统架构</strong>?</h2> <p>  大多数的开发者大多数的系统可能从来没接触过分布式系统,也根本没必要进行分布式系统架构,为什么?因为在访问量或者QPS没有达到单台机器的性能瓶颈的时候,根本没必要进行分布式架构。那如果业务量上来了,一般会怎么解决呢?</p> <p>    首先考虑的就是机器升级。机器配置的垂直扩展,首先要找到当前性能的瓶颈点,是CPU,是内存,是硬盘,还是带宽。砸钱加CPU,砸钱换SSD硬盘,砸钱换1T内存,这通常是解决问题最直接也最高效的方法。带宽不够?加带宽,1G不够用100G。CPU 8核不够?搞32核96核。这是绝大多数公司能思考到的第一个方案,也是最高效最快最安全的方法,立竿见影。</p> <p>    其次就是系统拆分,将所提供服务的主流程以及支线流程梳理出来,按照流程进行系统拆分。如同一棵树,核心业务作为主干流程,其他系统按照需要进行拆分,如同树的开枝散叶。所采取的方式有这么一些,按前后端进行拆分,按照领域拆分,按团队拆分,当然通常来说这些拆分基本都要跟着组织架构走。</p> <p>    再不行就进行技术升级,更换更加高效或者场景适合的技术。比如从 Oracle 更换到HBase。从A数据库连接池更换到B数据库连接池。技术的变革对于业务量的支持也是非常巨大的,同一台机器不同的技术,效能发挥的程度可以说有天壤之别。</p> <p>    最后的最后手段才会考虑分布式架构,实在是砸不出这么多钱了,实在是没办法了。因为分布式架构肯定会带来非常多非常多的一致性问题,原本只需要访问一台机器,现在需要访问N台,那么这N台机器的一致性怎么保证,以前撑死搞个主从备份就算完了,定时同步一下数据就好,现在N台设备的数据怎么管理,甚至这个集群本身怎么管理,都会成为一个致命的问题。</p> <p>    所以只有等业务量到达一定程度了,单台机器扛不住了,才会开始堆钱升级机器,系统拆分,换技术,继续堆钱升级机器,系统拆分...周而复始,发现成本太高或者技术已经到达上线了。最后没办法,就选择分布式架构了。</p> <p>但是分布式架构的优势也是明显的,用一群低廉的设备,来提供一个高性能高吞吐量的稳定的系统,下面开始说说常见的分布式集群的架构。</p> <h2>二.分布式系统架构的几种模式</h2> <h3>2.1纯负载均衡模式</h3>     在集群前面,前置一个流量分发的组件进行流量分发,整个集群的机器提供无差别的服务,这在常见的 web 服务器中是最最常见的。目前比较主流的方式就是整个集群机器上云,根据实时的调用量进行云服务器弹性伸缩。常见的负载均衡有硬件层面的 F5、软件层面的 nginx 等。<br /> <img alt="传统负载均衡" class="img-thumbnail" src="/assist/images/blog/c9ccf03ca8b54ac4852bbe8f1abf10b7.png" /> <h3>2.2<strong>领导选举型</strong></h3> 整个集群的消息都会转发到集群的领导这里,是一种 master-slavers,区别只是这个 master 是被临时选举出来的,一旦 master 宕机,集群会立刻选举出一个新的领导,继续对外提供服务。使用领导选举型架构的典型的应用有 ElasticSearch,zookeeper。<br /> <img alt="领导选举" class="img-thumbnail" src="/assist/images/blog/06857af58c4f4b31a75e5b4ac28f19ed.jpg" /> <h3><strong>2.3区块链型</strong><br /> 整个集群的每一个节点都可以进行记录,但是记录的内容要得到整个集群 N 个机器的认可才是合法的。典型的应用有 Bit Coin,以及 Hyperledger。</h3> <img alt="整个集群的消息都会转发到集群的领导这里,是一种 master-slavers,区别只是这个 master 是被临时选举出来的,一旦 master 宕机,集群会立刻选举出一个新的领导,继续对外提供服务。使用领导选举型架构的典型的应用有 ElasticSearch,zookeeper。" class="img-thumbnail" src="/assist/images/blog/78cd41be88fa409c9c11e77c5ef193ff.jpg" /> <h3>2.4<strong>master-slaver型</strong></h3> 整个集群以某台 master 为中枢,进行集群的调度。交互是这样,一般会把所有的管理类型的数据放到 master 上,而把具体的数据放到 slaver 上,实际进行调用的时候,client 先调用 master 获取数据所存放的 server 的 信息,再自行跟 slave 进行交互。典型的系统有 Hadoop。集群,HBase 集群,Redis 集群等。<br /> <img alt="整个集群以某台 master 为中枢,进行集群的调度。交互是这样,一般会把所有的管理类型的数据放到 master 上,而把具体的数据放到 slaver 上,实际进行调用的时候,client 先调用 master 获取数据所存放的 server 的 信息,再自行跟 slave 进行交互。典型的系统有 Hadoop。集群,HBase 集群,Redis 集群等。" class="img-thumbnail" src="/assist/images/blog/68bb6e12564d491da16f3569088b7896.jpg" /> <h3>2.5<strong>规则型一致性Hash</strong></h3> 这种架构类型一般出现在数据库分库分表的设计中。按照规则进行分库分表,在查询之前使用规则引擎进行库和表的确认,再对具体的应用进行访问。为什么要用一致性 Hash ?其实用什么都可以,只是对于这类应用来说一致性 Hash 比较常见而已。<br /> <img alt="这种架构类型一般出现在数据库分库分表的设计中。按照规则进行分库分表,在查询之前使用规则引擎进行库和表的确认,再对具体的应用进行访问。为什么要用一致性 Hash ?其实用什么都可以,只是对于这类应用来说一致性 Hash 比较常见而已。" class="img-thumbnail" src="/assist/images/blog/2735e320027f4f91bbd9319fda6f5b93.jpg" /><br />  
  • FastDFS安装配置,fastDFS分布式文件系统(一)

    FastDFS分布式文件系统的下载和安装配置,FastDFS,FastDFS安装配置,分布式文件系统<h2><span style="font-family:宋体">什么是FastDFS?</span></h2>   FastDFS的开发者是这样介绍的:<br />   FastDFS is an open source high performance distributed file system (DFS). It's major functions include: file storing, file syncing and file accessing, and design for high capacity and load balance.<br />   FastDFS是一个开源高性能分布式文件系统(DFS)。它的主要功能包括:文件存储、文件同步和文件访问,以及高容量和负载平衡的设计。 <h2><br /> <span style="font-family:宋体">一、获取需要的安装文件</span></h2> <h3>1.1<span style="font-family:宋体">获取安装</span>FastDFS<span style="font-family:宋体">依赖的公共函数库</span></h3> <p><span style="font-family:宋体">下载地址</span>: <a href="https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz" rel="external nofollow" target="_blank">https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz</a></p> <p><span style="font-family:宋体">系统中执行命令</span>:</p> <p><strong>[root@localhost fastdfs-libs]# wget https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz</strong></p> <p>--2017-07-20 09:03:34--  https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz</p> <p>Resolving github.com... 192.30.255.113, 192.30.255.112</p> <p>Connecting to github.com|192.30.255.113|:443... connected.</p> <p>HTTP request sent, awaiting response... 302 Found</p> <p>Location: https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.35 [following]</p> <p>--2017-07-20 09:03:36--  https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.35</p> <p>Resolving codeload.github.com... 192.30.255.121, 192.30.255.120</p> <p>Connecting to codeload.github.com|192.30.255.121|:443... connected.</p> <p>HTTP request sent, awaiting response... 200 OK</p> <p>Length: 434734 (425K) [application/x-gzip]</p> <p>Saving to: “V1.0.35”</p> <p> </p> <p>100%[====================================================================================================================================================================================================================================>] 434,734     47.0K/s   in 9.7s   </p> <p>2017-07-20 09:03:47 (44.0 KB/s) - “V1.0.35” saved [434734/434734]</p> <p>[root@localhost fastdfs-libs]#</p> <h3>1.2<span style="font-family:宋体">获取</span>FastDFS<span style="font-family:宋体">安装文件</span></h3> <p><span style="font-family:宋体">下载地址</span>: https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz</p> <p><span style="font-family:宋体">下载命令</span>:</p> <p><strong>[root@localhost fastdfs-libs]# wget https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz</strong></p> <p>--2017-07-20 09:06:41--  https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz</p> <p>Resolving github.com... 192.30.255.112, 192.30.255.113</p> <p>Connecting to github.com|192.30.255.112|:443... connected.</p> <p>HTTP request sent, awaiting response... 302 Found</p> <p>Location: https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.10 [following]</p> <p>--2017-07-20 09:06:43--  https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.10</p> <p>Resolving codeload.github.com... 192.30.255.120, 192.30.255.121</p> <p>Connecting to codeload.github.com|192.30.255.120|:443... connected.</p> <p>HTTP request sent, awaiting response... 200 OK</p> <p>Length: unspecified [application/x-gzip]</p> <p>Saving to: “V5.10”</p> <p> </p> <p>    [                                        <=>                                                                                                                                                                                          ] 336,589     15.5K/s   in 15s    </p> <p> </p> <p>2017-07-20 09:06:59 (22.5 KB/s) - “V5.10” saved [336589]</p> <p>[root@localhost fastdfs-libs]#</p> <h3>1.3<span style="font-family:宋体">解压安装包</span></h3> <p>1.3.1<span style="font-family:宋体">查看刚才下载的两个文件</span></p> <p>[root@localhost fastdfs-libs]# ll</p> <p>total 760</p> <p>-rw-r--r--. 1 root root 434734 Jul 20 09:03 V1.0.35</p> <p>-rw-r--r--. 1 root root 336589 Jul 20 09:06 V5.10</p> <p>[root@localhost fastdfs-libs]#</p> <p><span style="font-family:宋体">说明</span>:<span style="font-family:宋体">由于</span>wget<span style="font-family:宋体">工具去掉了文件格式</span>,<span style="font-family:宋体">所以文件名就成上面这个样子了。其中</span></p> <p>V1.0.35<span style="font-family:宋体">是</span>libfastcommon<span style="font-family:宋体">公共函数库安装包</span></p> <p>V5.10<span style="font-family:宋体">是</span>FastDFS<span style="font-family:宋体">安装包</span></p> <p><span style="font-family:宋体">解压命令</span>:</p> <p><strong>[root@localhost fastdfs-libs]# tar -xzvf V5.10</strong></p> <p><strong>[root@localhost fastdfs-libs]# tar -xzvf V1.0.35</strong></p> <p><span style="font-family:宋体">解压后目录中的文件</span>:</p> <p>[root@localhost fastdfs-libs]# ll</p> <p>total 768</p> <p><strong>drwxrwxr-x. 10 root root   4096 Apr  5 18:38 fastdfs-5.10</strong></p> <p><strong>drwxrwxr-x.  5 root root   4096 Jul 20 09:23 libfastcommon-1.0.35</strong></p> <p>-rw-r--r--.  1 root root 434734 Jul 20 09:03 V1.0.35</p> <p>-rw-r--r--.  1 root root 336589 Jul 20 09:06 V5.10</p> <p>[root@localhost fastdfs-libs]#</p> <h2><span style="font-family:宋体">二、安装</span>libfastcommon<span style="font-family:宋体">函数库</span></h2> <p><em><strong><span style="font-family:宋体">注意</span>:FastDFS<span style="font-family:宋体">版本</span>5.05<span style="font-family:宋体">以前不需要安装</span>,<span style="font-family:宋体">如果版本低于</span>5.05<span style="font-family:宋体">则忽略该步骤</span></strong></em></p> <p><span style="font-family:宋体">切换至</span>libfastcommon<span style="font-family:宋体">目录内</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p>[root@localhost fastdfs-libs]# ll</p> <p>total 764</p> <p>drwxrwxr-x. 5 root root   4096 Mar  2 18:47 libfastcommon-1.0.35</p> <p>-rw-r--r--. 1 root root 434734 Jul 20 09:03 V1.0.35</p> <p>-rw-r--r--. 1 root root 336589 Jul 20 09:06 V5.10</p> <p><strong>[root@localhost fastdfs-libs]# cd libfastcommon-1.0.35/</strong></p> <p>[root@localhost libfastcommon-1.0.35]#</p> <p><span style="font-family:宋体">编译文件</span></p> <p><span style="font-family:宋体">命令</span></p> <p><strong>[root@localhost libfastcommon-1.0.35]# ./make.sh</strong></p> <p>o fast_task_queue.lo fast_timer.lo process_ctrl.lo fast_mblock.lo connection_pool.lo fast_mpool.lo fast_allocator.lo fast_buffer.lo multi_skiplist.lo flat_skiplist.lo system_info.lo fast_blocked_queue.lo id_generator.lo char_converter.lo char_convert_loader.lo -lm -lpthread</p> <p>ar rcs libfastcommon.a hash.o chain.o shared_func.o ini_file_reader.o logger.o sockopt.o base64.o sched_thread.o http_func.o md5.o pthread_func.o local_ip_func.o avl_tree.o ioevent.o ioevent_loop.o fast_task_queue.o fast_timer.o process_ctrl.o fast_mblock.o connection_pool.o fast_mpool.o fast_allocator.o fast_buffer.o multi_skiplist.o flat_skiplist.o system_info.o fast_blocked_queue.o id_generator.o char_converter.o char_convert_loader.o</p> <p>[root@localhost libfastcommon-1.0.35]#</p> <p><span style="font-family:宋体">注意</span>,<span style="font-family:宋体">这里的并不是通用的系统</span>make<span style="font-family:宋体">命令</span>,<span style="font-family:宋体">而是执行目录里面的</span>make.sh<span style="font-family:宋体">脚本</span></p> <p><span style="font-family:宋体">安装文件</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost libfastcommon-1.0.35]# ./make.sh install</strong></p> <p>mkdir -p /usr/lib64</p> <p>mkdir -p /usr/lib</p> <p>install -m 755 libfastcommon.so /usr/lib64</p> <p>install -m 755 libfastcommon.so /usr/lib</p> <p>mkdir -p /usr/include/fastcommon</p> <p>install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_define.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h fast_mpool.h fast_allocator.h fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h skiplist_common.h system_info.h fast_blocked_queue.h php7_ext_wrapper.h id_generator.h char_converter.h char_convert_loader.h /usr/include/fastcommon</p> <p>[root@localhost libfastcommon-1.0.35]#</p> <p><span style="font-family:宋体">如果安装提示缺少</span>gcc<span style="font-family:宋体">编译器,使用</span>yum<span style="font-family:宋体">安装</span>,</p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong><span style="font-family:"Courier New""><span style="color:#333333">yum -y install gcc-c</span></span></strong><strong><span style="font-family:"Courier New""><span style="color:black">++</span></span></strong></p> <h2><span style="font-family:宋体">三、安装</span>FastDFS</h2> <p><span style="font-family:宋体">切换至</span>FastDFS<span style="font-family:宋体">安装文件目录</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost fastdfs-libs]# cd fastdfs-5.10/</strong></p> <p><strong>[root@localhost fastdfs-5.10]# </strong></p> <h3>3.1<span style="font-family:宋体">编译</span>FastDFS</h3> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost fastdfs-5.10]# ./make.sh</strong></p> <h3>3.2<span style="font-family:宋体">安装</span>FastDFS</h3> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost fastdfs-5.10]# ./make.sh install</strong></p> <p>mkdir -p /usr/bin</p> <p>mkdir -p /etc/fdfs</p> <p>cp -f fdfs_trackerd /usr/bin</p> <p>if [ ! -f /etc/fdfs/tracker.conf.sample ]; then cp -f ../conf/tracker.conf /etc/fdfs/tracker.conf.sample; fi</p> <p>if [ ! -f /etc/fdfs/storage_ids.conf.sample ]; then cp -f ../conf/storage_ids.conf /etc/fdfs/storage_ids.conf.sample; fi</p> <p>mkdir -p /usr/bin</p> <p>mkdir -p /etc/fdfs</p> <p>cp -f fdfs_storaged  /usr/bin</p> <p>if [ ! -f /etc/fdfs/storage.conf.sample ]; then cp -f ../conf/storage.conf /etc/fdfs/storage.conf.sample; fi</p> <p>mkdir -p /usr/bin</p> <p>mkdir -p /etc/fdfs</p> <p>mkdir -p /usr/lib64</p> <p>mkdir -p /usr/lib</p> <p>cp -f fdfs_monitor fdfs_test fdfs_test1 fdfs_crc32 fdfs_upload_file fdfs_download_file fdfs_delete_file fdfs_file_info fdfs_appender_test fdfs_appender_test1 fdfs_append_file fdfs_upload_appender /usr/bin</p> <p>if [ 0 -eq 1 ]; then cp -f libfdfsclient.a /usr/lib64; cp -f libfdfsclient.a /usr/lib/;fi</p> <p>if [ 1 -eq 1 ]; then cp -f libfdfsclient.so /usr/lib64; cp -f libfdfsclient.so /usr/lib/;fi</p> <p>mkdir -p /usr/include/fastdfs</p> <p>cp -f ../common/fdfs_define.h ../common/fdfs_global.h ../common/mime_file_parser.h ../common/fdfs_http_shared.h ../tracker/tracker_types.h ../tracker/tracker_proto.h ../tracker/fdfs_shared_func.h ../storage/trunk_mgr/trunk_shared.h tracker_client.h storage_client.h storage_client1.h client_func.h client_global.h fdfs_client.h /usr/include/fastdfs</p> <p>if [ ! -f /etc/fdfs/client.conf.sample ]; then cp -f ../conf/client.conf /etc/fdfs/client.conf.sample; fi</p> <p><img alt="1" class="img-thumbnail" src="/assist/images/blog/073c74afb6a846de851922001fd0ce8f.png" /></p> <p><span style="font-family:宋体">上方没有报错则安装成功。</span></p> <p> </p> <h3>3.3sample</h3> <p><span style="font-family:宋体">切换至目录</span>/etc/fast/<span style="font-family:宋体">查看</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p>[root@localhost fastdfs-5.10]# cd /etc/fdfs</p> <p>[root@localhost fdfs]# ll</p> <p>total 24</p> <p>-rw-r--r--. 1 root root 1461 Jul 20 09:29 client.conf.sample</p> <p>-rw-r--r--. 1 root root 7927 Jul 20 09:29 storage.conf.sample</p> <p>-rw-r--r--. 1 root root  105 Jul 20 09:29 storage_ids.conf.sample</p> <p>-rw-r--r--. 1 root root 7389 Jul 20 09:29 tracker.conf.sample</p> <p>[root@localhost fdfs]#</p> <p> </p> <p><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">如上,安装成功后就会生成如上的</span></span></span><span style="background-color:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:#555555">4</span></span></span><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">个</span></span></span><span style="background-color:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:#555555">.sample</span></span></span><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">文件(示例配置文件),我们再分别拷贝出</span></span></span><span style="background-color:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:#555555">4</span></span></span><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">个后面用的正式的配置文件:</span></span></span></p> <p>[root@localhost fdfs]# cp client.conf.sample client.conf</p> <p>[root@localhost fdfs]# cp storage.conf.sample storage.conf</p> <p>[root@localhost fdfs]# cp tracker.conf.sample tracker.conf</p> <p>[root@localhost fdfs]# ll</p> <p>total 44</p> <p>-rw-r--r--. 1 root root 1461 Jul 20 09:37 client.conf</p> <p>-rw-r--r--. 1 root root 1461 Jul 20 09:29 client.conf.sample</p> <p>-rw-r--r--. 1 root root 7927 Jul 20 09:37 storage.conf</p> <p>-rw-r--r--. 1 root root 7927 Jul 20 09:29 storage.conf.sample</p> <p>-rw-r--r--. 1 root root  105 Jul 20 09:29 storage_ids.conf.sample</p> <p>-rw-r--r--. 1 root root 7389 Jul 20 09:37 tracker.conf</p> <p>-rw-r--r--. 1 root root 7389 Jul 20 09:29 tracker.conf.sample</p> <p>[root@localhost fdfs]#</p> <p> </p> <p><span style="font-family:宋体">至此</span>FastDFS<span style="font-family:宋体">已经安装完毕</span>,<span style="font-family:宋体">接下来就是相关配置</span></p> <p> </p> <h2><span style="font-family:宋体">四、</span>FastDFS<span style="font-family:宋体">配置</span></h2> <h3>4.1<span style="font-family:宋体">配置</span>Tracker</h3> <p><span style="font-family:宋体">在配置</span>Tracker<span style="font-family:宋体">之前,首先需要创建</span>Tracker<span style="font-family:宋体">服务器的文件路径,即用于存储</span>Tracker<span style="font-family:宋体">的数据文件和日志文件等,我这里选择在</span>/opt<span style="font-family:宋体">目录下创建一个</span>fastdfs_tracker<span style="font-family:宋体">目录用于存放</span>Tracker<span style="font-family:宋体">服务器的相关文件:</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost opt]# mkdir -p  /opt/fastdfs_tracker</strong></p> <p><span style="font-family:宋体">接下来就要重新编辑上一步准备好的</span>/etc/fdfs<span style="font-family:宋体">目录下的</span>tracker.conf<span style="font-family:宋体">配置文件,打开文件后依次做以下修改:</span></p> <ol> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">disabled=false #</span><span style="font-family:宋体">启用配置文件(默认启用)</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">port=22122 #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif">tracker</span><span style="font-family:宋体">的端口号,通常采用</span><span style="font-family:"微软雅黑",sans-serif">22122</span><span style="font-family:宋体">这个默认端口</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:red"><span style="font-family:"微软雅黑",sans-serif">base_path=/opt/fastdfs_tracker #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif">tracker</span><span style="font-family:宋体">的数据文件和日志目录</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:red"><span style="font-family:"微软雅黑",sans-serif">http.server_port=8800 #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif">http</span><span style="font-family:宋体">端口号,默认为</span><span style="font-family:"微软雅黑",sans-serif">8080</span></span></span></li> </ol> <p><img alt="2" class="img-thumbnail" src="/assist/images/blog/63d30e78854041649c34056f79717844.png" /></p> <p><span style="font-family:宋体">配置完成后就可以启动</span>Tracker<span style="font-family:宋体">服务器了,但首先依然要为启动脚本创建软引用,因为</span>fdfs_trackerd<span style="font-family:宋体">等命令在</span>/usr/local/bin<span style="font-family:宋体">中并没有,而是在</span>/usr/bin<span style="font-family:宋体">路径下:</span></p> <p>[root@localhost fdfs]# ln -s /usr/bin/fdfs_trackerd /usr/local/bin</p> <p>[root@localhost fdfs]# ln -s /usr/bin/stop.sh /usr/local/bin</p> <p>[root@localhost fdfs]# ln -s /usr/bin/restart.sh /usr/local/bin</p> <p>[root@localhost fdfs]#</p> <p><img alt="3" class="img-thumbnail" src="/assist/images/blog/eb79dbf97c5f4f20b976391e6d56277e.png" /></p> <p><span style="font-family:宋体">最后通过命令启动</span>Tracker<span style="font-family:宋体">服务器:</span></p> <p><strong>[root@localhost fdfs]# service fdfs_trackerd start</strong></p> <p>Starting FastDFS tracker server:</p> <p>[root@localhost fdfs]# ps -ef|grep tracker</p> <p>root       8649      1  0 09:44 ?        00:00:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf</p> <p>root       8657   2652  0 09:44 pts/0    00:00:00 grep tracker</p> <p>[root@localhost fdfs]#</p> <p><span style="font-family:宋体">如果启动命令执行成功,那么同时在刚才创建的</span>tracker<span style="font-family:宋体">文件目录</span>/opt/fastdfs_tracker<span style="font-family:宋体">中就可以看到启动后新生成的</span>data<span style="font-family:宋体">和</span>logs<span style="font-family:宋体">目录,</span>tracker<span style="font-family:宋体">服务的端口也应当被正常监听,最后再通过</span>netstat<span style="font-family:宋体">命令查看一下端口监听情况:</span></p> <p><img alt="4" class="img-thumbnail" src="/assist/images/blog/938bbff4b35649f582476f2705a86c1a.png" /></p> <p>[root@localhost fdfs]# netstat -unltp|grep fdfs</p> <p>tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      8649/fdfs_trackerd </p> <p>[root@localhost fdfs]#</p> <p><span style="font-family:宋体">可以看到</span>tracker<span style="font-family:宋体">服务运行的</span>22122<span style="font-family:宋体">端口正常被监听</span></p> <p><span style="font-family:宋体">确认</span>tracker<span style="font-family:宋体">正常启动后可以将</span>tracker<span style="font-family:宋体">设置为开机启动,打开</span>/etc/rc.d/rc.local<span style="font-family:宋体">并在其中加入以下配置</span></p> <p>service fdfs_trackerd start</p> <p><span style="font-family:宋体">如果重启后发现未能自动启动则通过命令</span>ll /etc/rc.d/rc.local<span style="font-family:宋体">检查一下</span>rc.local<span style="font-family:宋体">是否具备可执行权限,若是无可执行权限则通过</span>chmod +x /etc/rc.d/rc.local<span style="font-family:宋体">进行授权</span></p> <p><span style="background-color:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:#555555">Tracker</span></span></span><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">至此就配置好了</span></span></span></p> <h3>4.2<span style="font-family:宋体">配置</span>Storage</h3> <p><span style="font-family:宋体">同理,步骤基本与配置</span>Tracker<span style="font-family:宋体">一致,首先是创建</span>Storage<span style="font-family:宋体">服务器的文件目录,需要注意的是同</span>Tracker<span style="font-family:宋体">相比我多建了一个目录,因为</span>Storage<span style="font-family:宋体">还需要一个文件存储路径,用于存放接收的文件:</span></p> <p><span style="font-family:宋体">创建目录命令</span>:</p> <p>[root@localhost fdfs]# mkdir /opt/fastdfs_storage</p> <p>[root@localhost fdfs]# mkdir /opt/fastdfs_storage_data</p> <p><span style="font-family:宋体">接下来修改</span>/etc/fdfs<span style="font-family:宋体">目录下的</span>storage.conf<span style="font-family:宋体">配置文件,打开文件后依次做以下修改:</span></p> <ol> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">disabled=false #</span><span style="font-family:宋体">启用配置文件(默认启用)</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">group_name=group1 #</span><span style="font-family:宋体">组名,根据实际情况修改</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">port=23000 #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif">storage</span><span style="font-family:宋体">的端口号,默认是</span><span style="font-family:"微软雅黑",sans-serif">23000</span><span style="font-family:宋体">,同一个组的</span><span style="font-family:"微软雅黑",sans-serif">storage</span><span style="font-family:宋体">端口号必须一致</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif"><span style="color:red">base_path=/opt/fastdfs_storage #</span></span><span style="font-family:宋体"><span style="color:red">设置</span></span><span style="font-family:"微软雅黑",sans-serif"><span style="color:red">storage</span></span><span style="font-family:宋体"><span style="color:red">数据文件和日志目录</span></span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">store_path_count=1 #</span><span style="font-family:宋体">存储路径个数,需要和</span><span style="font-family:"微软雅黑",sans-serif">store_path</span><span style="font-family:宋体">个数匹配</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif"><span style="color:red">store_path0=/opt/fastdfs_storage_data #</span></span><span style="font-family:宋体"><span style="color:red">实际文件存储路径</span></span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:red"><span style="font-family:"微软雅黑",sans-serif">tracker_server=</span> <span style="font-family:"微软雅黑",sans-serif">192.168.8.202:22122 #tracker </span><span style="font-family:宋体">服务器的</span><span style="font-family:"微软雅黑",sans-serif"> IP</span><span style="font-family:宋体">地址和端口号,如果是单机搭建,</span><span style="font-family:"微软雅黑",sans-serif">IP</span><span style="font-family:宋体">不要写</span><span style="font-family:"微软雅黑",sans-serif">127.0.0.1</span><span style="font-family:宋体">,否则启动不成功(此处的</span><span style="font-family:"微软雅黑",sans-serif">ip</span><span style="font-family:宋体">是我的</span><span style="font-family:"微软雅黑",sans-serif">CentOS</span><span style="font-family:宋体">虚拟机</span><span style="font-family:"微软雅黑",sans-serif">ip</span><span style="font-family:宋体">)</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">http.server_port=8888 #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif"> http </span><span style="font-family:宋体">端口号</span></span></span></li> </ol> <p><span style="font-family:宋体">上述红色代表修改部分</span></p> <p><span style="font-family:宋体">配置完成后同样要为</span>Storage<span style="font-family:宋体">服务器的启动脚本设置软引用:</span></p> <p><strong>[root@localhost fdfs]# ln -s /usr/bin/fdfs_storaged /usr/local/bin</strong></p> <p>[root@localhost fdfs]#</p> <p><span style="font-family:宋体">接下来就可以启动</span>Storage<span style="font-family:宋体">服务了:</span></p> <p><strong>[root@localhost fdfs]# service fdfs_storaged start</strong></p> <p>Starting FastDFS storage server:</p> <p>[root@localhost fdfs]# ps -ef |grep storage</p> <p>root       8677      1 26 09:58 ?        00:00:03 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf</p> <p>root       8687   2652  0 09:58 pts/0    00:00:00 grep storage</p> <p>[root@localhost fdfs]#</p> <p><span style="font-family:宋体">同理,如果启动成功,</span>/opt/fastdfs_storage<span style="font-family:宋体">中就可以看到启动后新生成的</span>data<span style="font-family:宋体">和</span>logs<span style="font-family:宋体">目录,端口</span>23000<span style="font-family:宋体">也应被正常监听,还有一点就是文件存储路径下会生成多级存储目录,那么接下来看看是否启动成功了:</span></p> <p><img alt="5" class="img-thumbnail" src="/assist/images/blog/3e9f629acff74f97967e2936ca4758f4.png" /></p> <p><strong><span style="font-family:宋体">端口监听情况</span>:</strong></p> <p><strong>[root@localhost data]# netstat -unltp|grep fdfs</strong></p> <p>tcp        0      0 0.0.0.0:23000               0.0.0.0:*                   LISTEN      8677/fdfs_storaged </p> <p>tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      8649/fdfs_trackerd </p> <p>[root@localhost data]#</p> <p><img alt="6" class="img-thumbnail" src="/assist/images/blog/7ad6a2679bbc4accacf7f3706abc96cc.png" /></p> <p><span style="font-family:宋体">如上图,可以看到此时已经正常监听</span>tracker<span style="font-family:宋体">的</span>22122<span style="font-family:宋体">端口和</span>storage<span style="font-family:宋体">的</span>23000<span style="font-family:宋体">端口,至此</span>storage<span style="font-family:宋体">服务器就已经配置完成,确定了</span>storage<span style="font-family:宋体">服务器启动成功后,还有一项工作就是看看</span>storage<span style="font-family:宋体">服务器是否已经登记到</span> tracker<span style="font-family:宋体">服务器(也可以理解为</span>tracker<span style="font-family:宋体">与</span>storage<span style="font-family:宋体">是否整合成功),运行以下命令:</span></p> <p>[root@localhost data]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf</p> <p>[2017-07-20 10:03:17] DEBUG - base_path=/opt/fastdfs_storage, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0</p> <p> </p> <p>server_count=1, server_index=0</p> <p> </p> <p>tracker server is 192.168.8.202:22122</p> <p> </p> <p>group count: 1</p> <p> </p> <p>Group 1:</p> <p>group name = group1</p> <p>disk total space = 26917 MB</p> <p>disk free space = 21646 MB</p> <p>trunk free space = 0 MB</p> <p>storage server count = 1</p> <p>active server count = 1</p> <p>storage server port = 23000</p> <p>storage HTTP port = 8888</p> <p>store path count = 1</p> <p>subdir count per path = 256</p> <p>current write server index = 0</p> <p>current trunk file id = 0</p> <p> </p> <p>         Storage 1:</p> <p>                   id = 192.168.8.202</p> <p>                   ip_addr = 192.168.8.202  ACTIVE</p> <p>                   http domain =</p> <p>                   version = 5.10</p> <p>                   join time = 2017-07-20 09:58:37</p> <p>                   up time = 2017-07-20 09:58:37</p> <p>                   total storage = 26917 MB</p> <p>                   free storage = 21646 MB</p> <p>                   upload priority = 10</p> <p>                   store_path_count = 1</p> <p>                   subdir_count_per_path = 256</p> <p>                   storage_port = 23000</p> <p>                   storage_http_port = 8888</p> <p>                   current_write_path = 0</p> <p>                   source storage id =</p> <p>                   if_trunk_server = 0</p> <p>                   connection.alloc_count = 256</p> <p>                   connection.current_count = 0</p> <p>                   connection.max_count = 0</p> <p>                   total_upload_count = 0</p> <p>                   success_upload_count = 0</p> <p>                   total_append_count = 0</p> <p>                   success_append_count = 0</p> <p>                   total_modify_count = 0</p> <p>                   success_modify_count = 0</p> <p>                   total_truncate_count = 0</p> <p>                   success_truncate_count = 0</p> <p>                   total_set_meta_count = 0</p> <p>                   success_set_meta_count = 0</p> <p>                   total_delete_count = 0</p> <p>                   success_delete_count = 0</p> <p>                   total_download_count = 0</p> <p>                   success_download_count = 0</p> <p>                   total_get_meta_count = 0</p> <p>                   success_get_meta_count = 0</p> <p>                   total_create_link_count = 0</p> <p>                   success_create_link_count = 0</p> <p>                   total_delete_link_count = 0</p> <p>                   success_delete_link_count = 0</p> <p>                   total_upload_bytes = 0</p> <p>                   success_upload_bytes = 0</p> <p>                   total_append_bytes = 0</p> <p>                  success_append_bytes = 0</p> <p>                   total_modify_bytes = 0</p> <p>                   success_modify_bytes = 0</p> <p>                   stotal_download_bytes = 0</p> <p>                   success_download_bytes = 0</p> <p>                   total_sync_in_bytes = 0</p> <p>                   success_sync_in_bytes = 0</p> <p>                   total_sync_out_bytes = 0</p> <p>                   success_sync_out_bytes = 0</p> <p>                   total_file_open_count = 0</p> <p>                   success_file_open_count = 0</p> <p>                   total_file_read_count = 0</p> <p>                   success_file_read_count = 0</p> <p>                   total_file_write_count = 0</p> <p>                   success_file_write_count = 0</p> <p>                   last_heart_beat_time = 2017-07-20 10:03:15</p> <p>                   last_source_update = 1969-12-31 16:00:00</p> <p>                   last_sync_update = 1969-12-31 16:00:00</p> <p>                   last_synced_timestamp = 1969-12-31 16:00:00</p> <p>[root@localhost data]#</p> <p><img alt="7" class="img-thumbnail" src="/assist/images/blog/4281900037f449cdb9470fa1b401c62c.png" /></p> <p> </p> <p><span style="font-family:宋体">如上所示,看到</span>192.168.8.202 ACTIVE <span style="font-family:宋体">字样即可说明</span>storage<span style="font-family:宋体">服务器已经成功登记到了</span>tracker<span style="font-family:宋体">服务器,同理别忘了添加开机启动,打开</span>/etc/rc.d/rc.local<span style="font-family:宋体">并将如下配置追加到文件中:</span></p> <p>service fdfs_storaged start</p> <p><span style="font-family:宋体">至此我们就已经完成了</span>fastdfs<span style="font-family:宋体">的全部配置,此时也就可以用客户端工具进行文件上传下载的测试了。</span></p> <h2><span style="font-family:宋体">五、测试</span>FastDFS</h2> <h3>5.1<span style="font-family:宋体">配置</span> FastDFSLinux<span style="font-family:宋体">上的客户端</span></h3> <p><span style="font-family:宋体">编辑配置文件</span>/etc/fdfs/client.conf</p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost fdfs]# vi /etc/fdfs/client.conf</strong></p> <p><span style="font-family:宋体">修改内容</span>:</p> <ol> <li><span style="color:red">base_path=/opt/fastdfs_tracker #tracker</span><span style="font-family:宋体"><span style="color:red">服务器文件路径</span></span></li> <li><span style="color:red">tracker_server=192.168.8.202:22122 #tracker</span><span style="font-family:宋体"><span style="color:red">服务器</span></span><span style="color:red">IP</span><span style="font-family:宋体"><span style="color:red">地址和端口号</span></span></li> <li><span style="color:red">http.tracker_server_port=8800 # tracker </span><span style="font-family:宋体"><span style="color:red">服务器的</span></span><span style="color:red"> http </span><span style="font-family:宋体"><span style="color:red">端口号,必须和</span></span><span style="color:red">tracker</span><span style="font-family:宋体"><span style="color:red">的设置对应起来</span></span></li> </ol> <p><img alt="8" class="img-thumbnail" src="/assist/images/blog/48d6df422eb1411986ae7a21d46b9564.png" /></p> <p><img alt="9" class="img-thumbnail" src="/assist/images/blog/9384fd77734a49af8067b868cdee6f95.png" /></p> <p><img alt="10" class="img-thumbnail" src="/assist/images/blog/cf3b4f6c3ebe46968724be99a03df04a.png" /></p> <p> </p> <h3>5.2<span style="font-family:宋体">测试</span></h3> <p><span style="font-family:宋体">配置完成后就可以模拟文件上传了,先给</span>/opt<span style="font-family:宋体">目录下放一张图片(使用</span>ftp<span style="font-family:宋体">类似工具上传到服务器)</span></p> <p><img alt="11" class="img-thumbnail" src="/assist/images/blog/6f6aa6411d5c4a4fa9ea3c8974be950b.png" /></p> <p>[root@localhost fdfs]# ll /opt/</p> <p>total 24</p> <p>drwxr-xr-x. 4 root root 4096 Jul 20 09:58 fastdfs_storage</p> <p>drwxr-xr-x. 3 root root 4096 Jul 20 09:58 fastdfs_storage_data</p> <p>drwxr-xr-x. 4 root root 4096 Jul 20 09:44 fastdfs_tracker</p> <p>drwxr-xr-x. 2 root root 4096 Nov 22  2013 rh</p> <p>-rw-r--r--. 1 root root 7014 Jul 21 02:20 tx.jpg</p> <p>[root@localhost fdfs]#</p> <p> </p> <p><span style="font-family:宋体">通过执行客户端上传命令尝试上传:</span></p> <p><strong>[root@localhost fdfs]# /usr/bin/fdfs_upload_file  /etc/fdfs/client.conf /opt/tx.jpg </strong></p> <p>group1/M00/00/00/wKgIyllxx82AeS-3AAAbZoAXENE710.jpg</p> <p>[root@localhost fdfs]#</p> <p><img alt="12" class="img-thumbnail" src="/assist/images/blog/184ba258f47648b8831a28f6146f3bdd.png" /></p> <p><span style="font-family:宋体">返回信息解释说明:</span></p> <p><strong>group1                                                                    : </strong><strong><span style="font-family:宋体">组名</span></strong></p> <p><strong>MOO                                                                         : </strong><strong><span style="font-family:宋体">磁盘</span></strong></p> <p><strong>00/00                                                                        : </strong><strong><span style="font-family:宋体">目录(相对于</span>storage</strong><strong><span style="font-family:宋体">的</span>fastdfs_storage_data</strong><strong><span style="font-family:宋体">目录下)</span></strong></p> <p><strong>wKgIyllxx82AeS-3AAAbZoAXENE710.jpg     :</strong><strong><span style="font-family:宋体">文件名</span></strong></p> <p> </p> <p><span style="font-family:宋体">可以切换到</span>storeage<span style="font-family:宋体">的</span>data<span style="font-family:宋体">目录下查看</span></p> <p><span style="font-family:宋体">命令:</span></p> <p><strong>[root@localhost data]# cd /opt/fastdfs_storage_data/data/</strong></p> <p>[root@localhost data]# ls</p> <p>00  04  08  0C  10  14  18  1C  20  24  28  2C  30  34  38  3C  40  44  48  4C  50  54  58  5C  60  64  68  6C  70  74  78  7C  80  84  88  8C  90  94  98  9C  A0  A4  A8  AC  B0  B4  B8  BC  C0  C4  C8  CC  D0  D4  D8  DC  E0  E4  E8  EC  F0  F4  F8  FC</p> <p>01  05  09  0D  11  15  19  1D  21  25  29  2D  31  35  39  3D  41  45  49  4D  51  55  59  5D  61  65  69  6D  71  75  79  7D  81  85  89  8D  91  95  99  9D  A1  A5  A9  AD  B1  B5  B9  BD  C1  C5  C9  CD  D1  D5  D9  DD  E1  E5  E9  ED  F1  F5  F9  FD</p> <p>02  06  0A  0E  12  16  1A  1E  22  26  2A  2E  32  36  3A  3E  42  46  4A  4E  52  56  5A  5E  62  66  6A  6E  72  76  7A  7E  82  86  8A  8E  92  96  9A  9E  A2  A6  AA  AE  B2  B6  BA  BE  C2  C6  CA  CE  D2  D6  DA  DE  E2  E6  EA  EE  F2  F6  FA  FE</p> <p>03  07  0B  0F  13  17  1B  1F  23  27  2B  2F  33  37  3B  3F  43  47  4B  4F  53  57  5B  5F  63  67  6B  6F  73  77  7B  7F  83  87  8B  8F  93  97  9B  9F  A3  A7  AB  AF  B3  B7  BB  BF  C3  C7  CB  CF  D3  D7  DB  DF  E3  E7  EB  EF  F3  F7  FB  FF</p> <p><strong>[root@localhost data]# cd 00/00/</strong></p> <p>[root@localhost 00]# ls</p> <p><strong>wKgIyllxx82AeS-3AAAbZoAXENE710.jpg</strong></p> <p>[root@localhost 00]#</p> <p><img alt="13" class="img-thumbnail" src="/assist/images/blog/f5ef521b94ed46ae926170c8d4b8d118.png" /></p> <p><span style="font-family:宋体">测试完成。</span></p> <p>相关推荐:<br /> <a rel="external nofollow" href="http://www.leftso.com/blog/244.html" target="_blank">FastDFS卸载(二)</a><br /> <a rel="external nofollow" href="http://www.leftso.com/blog/245.html" target="_blank">FastDFS配置集群(三)</a></p>
  • linux系统中ftp 上传和下载文件shell脚本编写

    linux系统中ftp 上传和下载文件shell脚本编写1.ftp单文件下载 <pre> <code class="language-bash">#!/bin/bash FTILE_NAME=$1 ftp -n <<- EOF #需要下载文件的主机或者IP地址 open www.leftso.com #配置用户名和密码 user username password #切换远程端目录 cd /home/xqlee/backup #切换本地存放目录 lcd /home/tomcat/test/ftp #二进制方式传输 bin #执行下载文件操作 prompt get $FTILE_NAME #退出 bye EOF</code></pre> <br /> 上面脚本执行方式: <pre> <code>./ftp-shellscriptname.sh 文件名</code></pre> <strong><span style="color:#9b59b6">注意:脚本需要修改权限使其拥有执行权限如chmod 755 脚本名称</span></strong><br /> <br /> 2.下载多个文件 <pre> <code>#!/bin/bash ftp -n <<- EOF #需要下载文件的主机或者IP地址 open www.leftso.com #配置用户名和密码 user username password #切换远程端目录 cd /home/xqlee/backup #切换本地存放目录 lcd /home/tomcat/test/ftp #二进制方式传输 bin #执行下载文件操作 prompt mget 文件名1 文件名2 *.xml ... #退出 bye EOF</code></pre> <br /> <strong><span style="color:#1abc9c">下载多个文件使用过得命令是mget,mget后面跟着文件名称规则多个规则之间使用空格隔开</span></strong><br /> 3.ftp上传文件 <pre> <code class="language-bash">#!/bin/bash FTILE_NAME=$1 ftp -n <<- EOF #需要上载文件的主机或者IP地址 open www.leftso.com #配置用户名和密码 user username password #切换远程端目录 cd /home/xqlee/backup #切换本地存放目录 lcd /home/tomcat/test/ftp #二进制方式传输 bin #执行上载文件操作 prompt put $FTILE_NAME #退出 bye EOF</code></pre> <br /> 不难观察出,上传和下载只是一个命令的区别,put与get<br /> <br /> 4.ftp上传多个文件 <pre> <code class="language-bash">#!/bin/bash FTILE_NAME=$1 ftp -n <<- EOF #需要上载文件的主机或者IP地址 open www.leftso.com #配置用户名和密码 user username password #切换远程端目录 cd /home/xqlee/backup #切换本地存放目录 lcd /home/tomcat/test/ftp #二进制方式传输 bin #执行上载文件操作 prompt mput 文件名规则1 文件名2 ... #退出 bye EOF</code></pre> <br /> 本ftp脚本原理都是通过实际测试出来的结果,在我使用这个命令前我百度搜索一圈居然很多错误比如get后面跟着多个名称就是下载多个文件,实际是只下载最后一个文件名的文件..<br /> 本文档仅做个人使用参考,欢迎提出建议<br /> <br /> <br />  
  • centos 7 安装和配置redis

    linux系统之centos 7 安装和配置redis,redis是一个高性能的key-value数据库,通常用于分布式缓存linux系统之centos 7 安装和配置redis,redis是一个高性能的key-value数据库,通常用于分布式缓存<br /> <br /> 1.通过yum方式安装redis<br /> 切换用户至root<br /> 执行命令: <pre> <code class="language-bash">yum install redis -y</code></pre> 2.查看安装的情况 <pre> <code> whereis redis redis: /etc/redis.conf</code></pre> <br /> 这里可以看到默认存放配置文件的地方<br /> <br /> 3.简单启动redis<br /> 命令: <pre> <code class="language-bash">redis-server</code></pre> <br /> 启动界面如下表示成功:<br /> <img alt="启动命令" class="img-thumbnail" src="/assist/images/blog/16893e83794c4636a416a2e604d61c30.png" /><br /> <br /> 这里只是采用默认的方式启动最基本的服务,通常使用中并不这么玩。<br /> <br /> 4.一些常用的配置项<br /> vi打开/etc/redis.conf文件<br /> 4.1>取消 bind 127.0.0.1<br /> <span style="color:#e74c3c">通过vi找到bind地址,注释掉</span><br /> 4.2>正如上面所见,Redis默认不是以守护进程的方式运行,修改daemonize值为yes使其后台运行<br /> <span style="color:#e74c3c">通过vi查找到daemonize,将后面的值改为yes</span><br /> 4.3>取消保护模式,默认情况下redis启动了保护模式,只能在本地访问不能远程访问。如果不取消将会报错:<br /> DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.<br /> <br /> <span style="color:#e74c3c">用vi找到protected-mode修改值为no</span><br /> <br /> 4.4>添加密码认证,默认情况redis是没有密码的但是实际使用中一般都会配置<br /> <span style="color:#e74c3c">通过vi查找到requirepass,可以发现默认有一行requirepass foobared被注释掉了。上面还有警告说明。将注释取消,后面跟的字符foobared便是密码改成自己需要的即可</span><br /> <br /> 5.通过指定配置文件的方式启动redis使其配置信息生效<br /> 虽然在第四步中我们配置了很多的信息,但是如果启动的时候不指定配置文件将不会生效<br /> 指定配置文件启动命令如下: <pre> <code>redis-server /etc/redis.conf</code></pre> <br /> <img alt="redis后台进程启动" class="img-thumbnail" src="/assist/images/blog/945661ffad5f4496a79583b89e717287.png" /><br /> 从上不难看出已经后台运行了<br /> <br /> 至此redis的安装配置实用说明结束,其他复杂配置后续补充。
  • Java编程中在高规模分布式环境中生成唯一的ID

    Java编程中在高规模分布式环境中生成唯一的IDJava编程中在高规模分布式环境中生成唯一的ID
  • 解决window系统中出现源文件名长度大于文件系统支持的长度问题

    源文件名长度大于文件系统支持的长度。请尝试将其移动到具有较短路径名称位置,或者在执行此操作前尝试将其重命名为较短的名称,文件名太长源文件名查毒大于文件系统支持的长度。请尝试将其移动到具有较短路径名称位置,或者在执行此操作前尝试将其重命名为较短的名称<br /> <img alt="原文件名太长" class="img-thumbnail" src="/assist/images/blog/7439e55d7f3742cbbd572d270b7e4a2b.png" /><br /> 解决办法:<br /> 1.安装一个压缩软件,一般系统都有就可不用安装。<br /> 2.添加到压缩,自定义压缩选择压缩后删除源文件<br /> <img alt="压缩后删除源文件" class="img-thumbnail" src="/assist/images/blog/e39ab272e9fa4b2982aa35018115e41a.png" /><br /> 3.压缩后就会发现之前的文件夹已经不再了,这时候删除已经压缩的文件包即可。<br /> <br /> 以上就是解决window系统中出现源文件名查毒大于文件系统支持的长度问题全部内容。
  • Linux系统SSH命令基础用法

    Linux系统SSH命令基础用法,Linux,Linux系统<h2>SSH远程登录</h2> <h3>口令登录</h3> <p>假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。</p> <pre> <code class="language-bash">$ ssh user@host  如:ssh pika@192.168.0.111</code></pre> <p><br /> 如果本地用户名与远程用户名一致,登录时可以省略用户名。</p> <pre> <code>$ ssh host</code></pre> <p><br /> SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。</p> <pre> <code>$ ssh -p 2222 user@host</code></pre> <p><br /> 上面这条命令表示,ssh直接连接远程主机的2222端口。<br /> 如果你是第一次登录对方主机,系统会出现下面的提示:</p> <pre> <code>$ ssh user@host The authenticity of host 'host (12.18.429.21)' can't be established. RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. Are you sure you want to continue connecting (yes/no)?</code></pre> <p><br /> 这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?<br /> 所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。<br /> 很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。<br /> 假定经过风险衡量以后,用户决定接受这个远程主机的公钥。</p> <pre> <code>Are you sure you want to continue connecting (yes/no)? yes</code></pre> <p><br /> 系统会出现一句提示,表示host主机已经得到认可。</p> <pre> <code>Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.</code></pre> <p><br /> 然后,会要求输入密码。</p> <pre> <code>Password: (enter password)</code></pre> <p><br /> 如果密码正确,就可以登录了。<br /> 当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。<br /> 每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。</p> <h3>公钥登录</h3> <p>使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。<br /> 所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。<br /> 这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:</p> <pre> <code>$ ssh-keygen</code></pre> <p><br /> 运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。<br /> 运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。<br /> 这时再输入下面的命令,将公钥传送到远程主机host上面:</p> <pre> <code>$ ssh-copy-id user@host</code></pre> <p><br /> 好了,从此你再登录,就不需要输入密码了。<br /> 如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面"#"注释是否取掉。</p> <pre> <code>      RSAAuthentication yes       PubkeyAuthentication yes       AuthorizedKeysFile .ssh/authorized_keys</code></pre> <p><br /> 然后,重启远程主机的ssh服务。</p> <pre> <code>      // ubuntu系统       service ssh restart       // debian系统       /etc/init.d/ssh restart</code></pre> <p><br /> authorized_keys文件<br /> 远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。<br /> 这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:</p> <pre> <code>$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub</code></pre> <p><br /> 这条命令由多个语句组成,依次分解开来看:(1)"$ ssh user@host",表示登录远程主机;(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)"$ mkdir -p .ssh"的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。<br /> 写入authorized_keys文件后,公钥登录的设置就完成了。</p>
  • MIME 参考手册/HTTP文件上传格式过滤

    MIME 参考手册/HTTP文件上传格式过滤MIME 参考手册/HTTP文件上传格式过滤​​​​​​​
  • Linux系统修改静态IP

    Linux系统修改静态IPLinux系统修改静态IP<br />   <pre> <code>#vi /etc/sysconfig/network-script/ifcfg-eth0</code></pre> <img alt="1" class="img-thumbnail" src="/assist/images/blog/a64b06b1-4098-4da6-8f5e-1ebfe662d755.png" style="height:152px; width:376px" /><br /> 修改为: <pre> <code>DEVICE="eth0" BOOTPROTO="static" HWADDR="00:0C:29:91:39:87" ONBOOT="yes" IPADDR=172.16.0.227 NETMASK=255.255.255.0 GATEWAY=172.16.0.1</code></pre>   <pre> <code>#/etc/init.d/network restart #ifconfig</code></pre> 以下为CentOS7修改示例:<br /> 修改前配置:<br /> <img alt="0" class="img-thumbnail" src="/assist/images/blog/05994a01-3259-435c-8137-f419ab85f1c4.png" style="height:337px; width:459px" /><br /> 修改后配置:[红色标记为修改操作]<br /> <img alt="11" class="img-thumbnail" src="/assist/images/blog/1159c282-3bcc-414a-9ba1-8ba159780eb8.png" style="height:498px; width:729px" /><br /> <span style="color:#cc0000"><strong>注意图片中是GATEWAY</strong></span><br /> <br /> <img alt="123" class="img-thumbnail" src="/assist/images/blog/222d7ab7-a643-42c4-82a8-562b51556f79.png" style="height:422px; width:717px" /><br /> [注意:由于测试机的centos7系统网卡名称为eno16777736,所以编辑的配置文件为:] <pre> <code>[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736</code></pre>