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("下载成功");
}
}