前言:
在分布式架构中,往往会有多个tomcat,然后你上传的图片只是在其中的某一个tomcat,你访问时是由集群的tomcat随机提供服务。当你访问的tomcat是有图片的那个时,图片能正常显示,如果恰巧是那个没有图片的tomcat时,图片就不能正常显示。这就完成了访问同一个图片,可能你刷新一次可以访问,再刷新一次图片就访问不到了。这时,我们就需要一个服务器用来专门存储图片,一般我们都用nginx。
1、nginx+vsftp:
上面分别介绍了nginx和vsftp,那么这两个东西怎么组合起来用呢?怎么实现这个图片服务器呢?我们知道,tomcat安装好启动后,在浏览器输入localhost:8080,就会出现tomcat的欢迎页,nginx也一样。比如linux的ip是192.168.50.122,那么启动nginx后,在浏览器访问这个地址也会出现nginx的欢迎页,其实是因为它有个默认的访问页面,完整的地址应该是192.168.50.122/index.html,那么我们就可以根据这个,把它默认的访问页面改成我们上传的图片的保存路径,比如上传了一张pic.jpg图片到linux的/home/ftpuser/images中,如果我们把默认访问页面改成/home/ftpuser,那么在浏览器中输入192.168.50.122/images/pic.jpg,就可以访问到这张图片了。下面就来介绍nginx、vsftp的安装以及配置。
<meta charset="utf-8">
1、安装:
2、添加ftp用户:
3、给ftp用户添加密码:
输入两次密码后修改密码。
4、修改selinux:
①查看状态:
执行这个命令可以看到
这两个都off,执行如下命令设置为on:
再次执行 getsebool -a | grep ftp 看到那两个状态是on就行了。
5、关闭匿名访问:
执行
命令:
还要在vsftp.conf文件最下面添加以下内容:
然后保存退出即可。
6、设置开机启动:
7、测试:
打开filezilla工具,输入虚拟机的ip,21端口,用户名和密码,点击快速连接,连接vsftp服务:
如图所示则连接成功。
<meta charset="utf-8">
按照以上步骤安装好nginx和vsftp后,还是不能访问上传的图片的,需要进行如下配置:
执行
命令,打开nginx的配置文件:
按道理这样就可以了,但是我访问却报错:
403 forbidden ,最后发现是因为ftpuser文件夹没有可读权限,执行如下命令:
再次访问即可成功!
至此图片服务器搭建完成!至于在Java中如何使用这个图片服务器,请参考 Java实现把图片上传到图片服务器 。
在搭建的过程中,遇到很多坑,因为我参考的教程是centos 6,防火墙是iptables,而centos 7是firewall,
https://github.com/chrislusf/seaweedfs/releases
经典论文翻译导读之《Finding a needle in Haystack: Facebook’s photo storage》
http://www.importnew.com/3292.html
下面一张图总结下相互关系:
weed master 创建的是一个master服务器。
参数:
-defaultReplication string 备份策略(详细见 https://github.com/chrislusf/seaweedfs/wiki/Replication )
-ip string
-mdir string选项用于配置保存生成的序列文件id的文件夹
-port int (default 9333)
-volumeSizeLimitMB uint 自定义不能大于30000(default 30000)
-whiteList string 白名单,ip地址用逗号隔开
master服务器可以创建多个来实现故障转移主服务器,详细见 https://github.com/chrislusf/seaweedfs/wiki/Failover-Master-Server
参数:
-dir string 数据保存的路径,如果master的mdir没有指定会使用这个,如果filer的dir没有指定会新增并使用该目录下的filer目录
-ip string
-mserver string (default "localhost:9333")
-port
-dataCenter string
-rack string
-whiteList string
weed volume会创建一个 datanode ,可以指定所属的 datacenter rack和master ,会根据配置存储文件,默认一开始没有volume,当开始存储文件的时候才会创建一个volume,当这一个volume大小超过了volumeSizeLimitMB 就会新增一个volume,当volume个数超过了max则该datanode就不能新增数据了。那就需要在通过weed volume命令新增一个datanode。
weed filer
参数
-collection string 所有数据将存储在此集合中
-dataCenter string更倾向于在这个数据中心写入卷
-dirListLimit int limit sub dir listing size (default 100000)
-ip string
-master string
-port int(default 8888)
更详细的说明请见: https://mp.csdn.net/mdeditor/85049078#
或者访问官网wiki : https://github.com/chrislusf/seaweedfs/wiki
出现如下提示说明启动成功
执行下面的命令:
出现DataCenters是null的原因是没有执行weed volume创建DataCenter。
" 这里说一下抽象概念":
我们抽象的认为我们的图片服务器,一个master需要两个datacenter叫imgdatacenter1,imgdatacenter2;imgdatacenter1需要两个rack叫imgrack1,imgrack2;然后imgrack1需要两个datanode1,datanode2;
创建datanode时 ,统一设置每个datanode包含10个volume即可。当datanode里面的volume满了以后再创建 新的datanode即可,方便扩展,并且不同datanode可以在不同磁盘位置;
(imgdatacenter1的imgrack2和imgdatacenter2按照上面的方式创建即可,见附录 )
目前我们只是用imgdatacenter1->imgrack1->datanode1中的datanode1 :
创建datanode1的时候 master命令行会打印,提示leader新增child imgdatacenter1成功;imgdatacenter1新增child imgrack1成功;imgdatacenter1,imgrack1新增child 9991成功;volume server在9991端口。
此时再执行查看master状态的命名;
DataCenters Racks DataNodes都存在了;
但是名为localhost:9991的datanode中的volumes为0,明明我们设置了10啊;
因为没有上传文件之前不会创建volume,volume会在上传文件的时候根据实际情况创建。
这里注意下layouts,现在是null,当上传文件的时候会出现一个名为""的collection,里面的writables就是volume 的id数组,如果你自定义了collection,name你自定义的collection也会出现在这里,并且所有collection的volume个数之和小于等于我们设置的10;
collection删除后再新增,里面的volume的id会一直递增,不会使用原先删除的volume id。
此时我们可以上传文件了。
上传文件有多种方式,这里我们先说明两个
1.先向master申请文件id,然后用文件id向datanode上传文件:
修改只需要在fid上传别的文件即可
上传成功后访问,只需要拼接url即可: localhost:9991/1,015b7256d5
2.直接向master上传文件,master自己生成文件id,并向datanode上传文件,然后返回结果:
此时你再查看状态发现volume就创建了10个。
此时查看datanode的状态:
因为我1.jpg上传了两次,而且第一次在id为1的volume中,第二次在id为3的volume中,所有你会发现这两个id的volume的FileCount都为1
并发的上传文件:
一个卷服务器一次只写一个卷。如果需要增加并发性,可以预先分配大量卷。下面是例子。您还可以组合所有不同的选项。状态详情见附录
删除文件:
文件的删除不是实时的,因为weed默认有个阈值,超过这个阈值才会清理没使用的空间,如果你一时间内删除了大量文件,想立马生效,可以用这种方式清理未使用的空间:
此时文件通过url的增删改查都可以了,下面把服务映射成文件系统来操作,可以方便的操作本地的大量文件
filer是将文件以文件目录的方式上传到图片服务,然后你根据文件目录的方式访问
默认使用leveldb保存映射关系,打开filer.toml文件修改保存映射文件的文件夹为ftmp(自定义)
然后启动filer服务
master打印如下信息说明成功
自身的log
直接往weed filer中拷贝目录或者文件(-include是文件模式通配符前使用??)
weed filer.copy nginxdir http://localhost:8888/aaa 把nginxdir拷贝到aaa目录下
weed filer.copy -include *.go . http://localhost:8888/github/
详细请见 https://github.com/chrislusf/seaweedfs/wiki/Filer-Server-API
然而我们时长会有这样的需求,批量把照片保存成图片文件备份起来,而不是备份一个bat文件;
或者我们想以目录结构的方式通过本地访问,而不是通过web访问?
此时最简单有效的方法就是把filer服务器mount到本地,然后直接操作文件系统:
weed mount 像访问本地目录一样访问文件系统,前提是开启了 master volume filer
(它使用bazil.org/FUSE,它允许在Linux和OSX上编写FUSE文件系统。在OSX上,它需要OSXFUSE)
可以指定 collection
关闭挂在需要关闭mount并且手动umont ~/mdir目录,如果一般用户失败请使用root用户
一个场景:
如果本地已经有很多文件了,如何快速的迁移到seaweedfs中呢?
1.启动master、volume、filer
2.启动mount
3.手动拷贝到mount目录中(单线程的)
4.使用weed filer.copy file_or_dir1 [file_or_dir2 file_or_dir3] http://localhost:8888/path/to/a/folder/ (多线程且绕过fuse层)
aws s3 兼容
Each bucket is stored in one collection, and mapped to folder /buckets/<bucket_name>by default
可以通过删除collection来快速删除一个bucket
异步复制
应该有两个SeawideFileSystems运行,可能跨数据中心运行。每个服务器都应该有自己的文件服务器、主服务器和卷服务器。
这是我执行了(curl " http://localhost:9333/vol/grow?collection=imgcoll&count=3 " )的结果
详细文档请见官方wiki
https://github.com/chrislusf/seaweedfs/wiki/Getting-Started
打开nginx官网 http://nginx.org/en/download.html
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
cd /usr/local/
tar -zxvf nginx-1.20.1.tar.gz
./configure --with-http_ssl_module
编译参数有很多,这边我只增加了SSL模块,小伙伴可以根据自身情况调整
--prefix=PATH:指定 nginx 的安装目录
--conf-path=PATH:指定 nginx.conf 配置文件路径
--user=NAME:nginx 工作进程的用户
--with-pcre:开启 PCRE 正则表达式的支持
--with-http_ssl_module:启动 SSL 的支持
--with-http_stub_status_module:用于监控 Nginx 的状态
--with-http-realip_module:允许改变客户端请求头中客户端 IP 地址
--with-file-aio:启用 File AIO
--add-module=PATH:添加第三方外部模块
make
执行完上述命令后,在解压目录下,多出一个Makefile文件
make install
因编译时未指定安装目录,执行make install 命令后看到反馈日志信息,实际安装目录为/usr/local/nginx
进入实际安装目录,看看,并在其sbin目录下执行启动nginx
cd /usr/local/nginx/
浏览器访问 http://ip:80 , 显示如下图则代表部署成功
进入 /usr/local/nginx/conf/ 文件夹,找到nginx.conf 文件
worker_processes 1
events {
worker_connections 1024
}
http {
include mime.types
default_type application/octet-stream
sendfileon
keepalive_timeout 65
server {
listen 8088
server_name localhost
location ~ .*.(gif|jpg|jpeg|png|apk|pdf)$ {
expires 24h
root /usr/local/img/#指定图片存放路径
access_log /usr/local/nginx/logs/images.log#日志路径
proxy_store on
proxy_store_access user:rw group:rw all:rw
proxy_temp_path /usr/local/img/#代理临时路径
proxy_redirect off
}
修改配置文件,内容如上
cd /usr/local/nginx/sbin
./nginx -s reload
浏览器输入 http://ip:8088/1.png ,查看是否能正常显示图片
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)