Java分布式篇5——FastDFS
2023-09-14 09:01:23 时间
Java分布式篇5——FastDFS
分布式文件系统
1、主流的分布式文件系统
1.1、 HDFS
(Hadoop Distributed File System)Hadoop 分布式文件系统
- 高容错的系统,适合部署到廉价的机器上
- 能提供高吞吐量的数据访问,非常适合大规模数据应用
- HDFS采用主从结构,一个HDFS是由一个name节点和N个data节点组成
- name节点储存元数据,一个文件分割成N份存储在不同的data节点上
- 生态好
1.2、GFS
Google File System
- 可扩展的分布式文件系统,用于大型的,分布式的,对大量数据进行访问的应用
- 运行于廉价的普通硬件上,可以提供容错功能
- 它可以给大量的用户提供总体性能较高的服务
- GFS采用主从结构,一个GFS集群由一个master和大量的chunkserver(分块服务器)组成
- 一个文件被分割若干块,分散储存到多个分块server中
1.3、FastDFS
- fastDFS特别适合图 片,小视频等小文件,因为fastDFS对文件是不分割的,所以没有文件合并的开销
- 网络通信用socket,速度快
2、工作原理
- Tracker(追踪者):负载均衡和调度,它管理着存储服务(Storage Server),可以集群,实现高可用
- Storage(仓库):文件存储的位置
- storage集群采用分组的方式,同组内的每台服务器是平等关系,数据同步,目的是实现数据备份,从而高可用,而不同组的服务器之间是不通信的
- 同组内的每台服务器的存储量不一致的情况下,会选取容量最小的那个,所以同组内的服务器之间软硬件最好保持一致
- Storage Server会连接集群中的所有Tracker Server,定时向他们汇报自己的状态,例如:剩余空间,文件同步情况,文件上传下载次数等信息
3、上传下载原理
3.1、上传
3.2、下载
4、FastDFS安装
libfastcommon 百度云:https://pan.baidu.com/s/1js5_xYNU_d1wV29BF1GQIg提取码:4q2m
FastDFS_v5.05 百度云:https://pan.baidu.com/s/11hBxbbxy6cneRYTLjOgXYg提取码:2rxp
4.1、安装gcc环境
yum install -y gcc gcc-c++
4.2、安装libevent
yum -y install libevent
4.3、安装libfastcommon
#安装解压zip包工具
yum install -y unzip
#解压zip
unzip libfastcommon.zip
#进入目录
cd libfastcommon-master
#编译
./make.sh
#如果出现权限不允许
chmod 777 make.sh
./make.sh
#安装
./make.sh install
4.4、安装Tracker
#解压
tar -zxvf FastDFS_v5.05.tar.gz
#进入目录
cd FastDFS
#编译
./make.sh
#安装
./make.sh install
4.5、拷贝配置文件
cp /usr/local/fastdfs/FastDFS/conf/* /etc/fdfs/
4.6、配置Tracker
#作为文件存储目录,可以自行定义
mkdir /home/fastdfs
vim /etc/fdfs/tracker.conf
tracker.conf
base_path=/home/fastdfs
4.7、配置Storage
#作为文件存储目录,可以自行定义
mkdir /home/fastdfs/fdfs_storage
vim /etc/fdfs/storage.conf
storage.conf
base_path=/home/fastdfs
store_path0=/home/fastdfs/fdfs_storage
tracker_server=.101.34.116.9:22122
4.8、启动
[root@VM-0-3-centos bin]# pwd
/usr/bin
[root@VM-0-3-centos bin]# fdfs_trackerd /etc/fdfs/tracker.conf restart
[root@VM-0-3-centos bin]# fdfs_storaged /etc/fdfs/storage.conf restart
[root@VM-0-3-centos bin]# ps -ajx|grep fdfs
1 15717 15716 15716 ? -1 Sl 0 0:00 fdfs_trackerd /etc/fdfs/tracker.conf restart
1 17544 17543 17543 ? -1 Sl 0 0:00 fdfs_storaged /etc/fdfs/storage.conf restart
11458 17573 17572 11458 pts/0 17572 R+ 0 0:00 grep --color=auto fdfs
[root@VM-0-3-centos bin]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1383/master
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 15717/fdfs_trackerd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1495/sshd
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 17544/fdfs_storaged
tcp6 0 0 ::1:25 :::* LISTEN 1383/master
tcp6 0 0 :::22 :::* LISTEN 1495/sshd
5、文件上传
5.1、导入依赖
<dependencies>
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
5.2、配置文件
##fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = 101.34.116.9:22122
5.3、测试
public class FastDFSTest {
@Test
public void upload_file() throws IOException, MyException {
// 加载配置文件
ClientGlobal.initByProperties("fastdfs-client.properties");
// 创建tracker客户端
TrackerClient trackerClient=new TrackerClient();
// 通过tracker客户端获取tracker的连接服务
TrackerServer connection = trackerClient.getConnection();
// 声明storage服务
StorageServer storageServer=null;
// 定义storage客户端
StorageClient storageClient = new StorageClient(connection, storageServer);
// 元数据
NameValuePair[] nameValuePair = new NameValuePair[1];
nameValuePair[0]=new NameValuePair("fileName","witch");
// 上传文件
String[] strings = storageClient.upload_file("C:\\Users\\yoya\\Pictures\\1555296384.jpeg", "jpeg", nameValuePair);
System.out.println(Arrays.toString(strings));
connection.close();
// [group1, M00/00/00/rBEAA2EJE8qAGmD5AAOoqzLzJBg09.jpeg]
}
}
6、文件查询
public class FastDFSTest {
@Test
public void select_file() throws IOException, MyException {
// 加载配置文件
ClientGlobal.initByProperties("fastdfs-client.properties");
// 创建tracker客户端
TrackerClient trackerClient=new TrackerClient();
// 通过tracker客户端获取tracker的连接服务
TrackerServer connection = trackerClient.getConnection();
// 声明storage服务
StorageServer storageServer=null;
// 定义storage客户端
StorageClient storageClient = new StorageClient(connection, storageServer);
// 查询文件
FileInfo fileInfo = storageClient.query_file_info("group1", "M00/00/00/rBEAA2EJE8qAGmD5AAOoqzLzJBg09.jpeg");
System.out.println(fileInfo);
connection.close();
// source_ip_addr = 172.17.0.3, file_size = 239787, create_timestamp = 2021-08-03 18:00:42, crc32 = 854795288
}
}
7、文件下载
public class FastDFSTest {
@Test
public void download_file() throws IOException, MyException {
// 加载配置文件
ClientGlobal.initByProperties("fastdfs-client.properties");
// 创建tracker客户端
TrackerClient trackerClient=new TrackerClient();
// 通过tracker客户端获取tracker的连接服务
TrackerServer connection = trackerClient.getConnection();
// 声明storage服务
StorageServer storageServer=null;
// 定义storage客户端
StorageClient storageClient = new StorageClient(connection, storageServer);
// 查询文件
byte[] bytes = storageClient.download_file("group1", "M00/00/00/rBEAA2EJE8qAGmD5AAOoqzLzJBg09.jpeg");
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:/123.jpeg"));
fileOutputStream.write(bytes);
fileOutputStream.close();
connection.close();
System.out.println("下载成功");
}
}
相关文章
- http 各个状态码及对应的java 编程
- Java常用类库--Arrays、比较器(comparable、Comparator)
- java实现遍历树形菜单方法——index.jsp实现
- java实现遍历树形菜单方法——Dao层
- Java实现 LeetCode 819 最常见的单词(暴力)
- Java 第十一届 蓝桥杯 省模拟赛 递增序列
- Java实现 LeetCode 482 密钥格式化
- Java实现 洛谷 P1036 选数
- Java实现 蓝桥杯VIP 算法提高 栅格打印问题
- Java实现 蓝桥杯VIP 算法训练 平方计算
- 图解 & 深入浅出Java初始化与清理:构造器必知必会
- java 环境变量classpath的作用
- Java微服务分布式架构
- JAVA分布式篇1——Linux
- java分布式面试题之Dubbo部分
- 大型Java web项目分布式架构演进-分布式部署
- 使用java搜索包含了指定关键字的新浪微博
- 用Java打造高效可扩展的分布式数据流处理系统
- 蓝桥杯2018省赛——哪天返回(Java)
- 详解Java中static关键字和final关键字的功能
- Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略
- 寒窗苦学3年,说好的没学好Java转行测试,最后我8K,他15K?
- java 分布式面试题
- 【java】分布式场景下的资损防控