weedfs的简易安装以及使用Java编写的简单上传代码
本帖最后由 ProgramerFangL 于 2017-11-14 14:55 编辑weedfs是一个适用于需要存储大量小文件的一个分布式文件系统,全名为Seaweed-fs,是一个使用go语言开发的简单的高可用的系统。开创之初weedfs是源于一篇Facebook的论文实现,下面介绍在服务器中的安装部署步骤。
一、安装
1、首先安装配置golang开发环境
go的最新版本是1.9.1 可到https://www.golangtc.com/download下载go1.9.1.linux-amd64.tar.gz
2、上传并解压到指定目录tar -zxf go1.9.1.linux-amd64.tar.gz
3、配置环境变量vim /etc/profile# go evnexportGOROOT=/opt/goexportPATH=$GOROOT/bin:$PATHexportGOPATH=$GORROT/workspacesource /etc/profile
4、执行go get github.com/chrislusf/seaweedfs/go/weed 下载并编译weedfs(需要VPN)没有VPN可以直接下载并解压wget https://bintray.com/artifact/download/chrislusf/seaweedfs/weed_0.70beta_linux_amd64.tar.gztar zxvf weed_0.70beta_linux_amd64.tar.gz
二、服务启动
1、进入weed的解压目录启动
-dir表示数据的存储文件地址,-max表示volume的最大数量,-mserver是主节点的ip以及端口,-port表示该volume的端口,-ip为启动volume的ip,publicurl表示外部访问存储数据的链接地址,在Java代码中有体现。
./weed volume-dir="/opt/weed_0.7/vol/" -max=5 -mserver="x.x.x.x:9333" -port=9081 -ip="x.x.x.x"-publicUrl="x.x.x.x:9081"&
-mdir表示主节点数据的存储路径,-defaultReplication表示该集群所采用的存储模式,weedfs提供了多种副本策略,如下:
000 no replication, just one copy
001 replicate once on the same rack
010 replicate once on a different rack in the same data center
100 replicate once on a different data center
200 replicate twice on two other different data center
110 replicate once on a different rack, and once on a different data center
./weed master-mdir="/opt/weed_0.7/mdata" -defaultReplication="200"-ip="x.x.x.x" -port=9333 &#启动master,设置集群模式
三、Java代码实现简单上传功能因为只是一个简单的测试代码,所以在此只贴出一个主方法实现功能。weedfs没有官方的api接口,只在git上找到了两个现成的JavaClient,其底层也是使用了http的请求来实现文件上传的功能。
public static void main(String[] args) {
CloseableHttpClient httpClient1 = null;
CloseableHttpResponse response1 = null;
try {
httpClient1 = HttpClients.createDefault(); //设置http请求的路径
HttpPost httpPost = new HttpPost("http://10.2.45.200:9333/submit");
httpPost.setHeader(new BasicHeader("Accept-Language", "zh-cn")); // 把文件转换成流对象FileBody
File file = new File("D:\\SAP用户Top10.txt");
FileBody bin = new FileBody(file);
HttpEntity reqEntity = MultipartEntityBuilder.create()
.setCharset(Charset.forName("UTF-8"))
// .addPart("file", bin)
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.addBinaryBody(URLEncoder.encode("SAP用户Top10.txt"), file)
.build();
httpPost.setEntity(reqEntity); // 发起请求 并返回请求的响应
System.out.println(httpPost.toString());
response1 = httpClient1.execute(httpPost);
ObjectMapper mapper = new ObjectMapper();
WeedfsFile weedfile = mapper.readValue(response1.getEntity().getContent(), WeedfsFile.class);
System.out.println(weedfile.getFileName());
System.out.println("The response value of token:" + response1.getFirstHeader("token")); // 获取响应对象
System.out.println(weedfile.toString());
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(response1 != null){
response1.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(httpClient1 != null){
httpClient1.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
由于集群没有搭在本地的虚拟机上,发布帖子时链接不到集群地址,所以暂时没有运行代码的截图,后期会尽快补充。 本帖最后由 ProgramerFangL 于 2017-11-13 18:20 编辑
求热心人的免费评分 what?难道都没有这个需求吗??? WeedfsFile这个类没有,需要在maven中引入什么呢? 梦到边缘 发表于 2019-2-22 11:36
WeedfsFile这个类没有,需要在maven中引入什么呢?
这是一个实体类,就是entity,里边定义了文件的一些信息
页:
[1]