本文主要是使用Java RMI 实现一个简单的GFS(谷歌文件系统,google file system),这里提供演示运行视频、系统实现以及源代码相关。
🧨 大年初二,走亲访友🏮 🧧
🏮祝大家新年快乐!🏮
ʰᵅᵖᵖʸ ⁿeᵚ ʸᵉᵅʳ
家人闲坐 灯火可亲
辞旧迎新 新年可期
系统整体介绍、背景以及设计信息:
演示运行视频
1. 系统组织结构
如图所示,整个MyGFS分布式文件系统由SPI、Common API,Master,ChunkServer和Client五个模块组成:
SPI:定义Master与ChunkServer需要实现的接口,并实现存放Chunk及其信息的抽象类。MasterApi与ChunkServerApi均继承自Remote接口,标识着这是一个远程接口。
Master:实现远程接口实现类MasterEngine,继承自UnicastRemoteObject类并实现MasterApi接口,负责与Client的通信与对ChunkServer的管理。
ChunkServer:实现远程接口实现类ChunkServerEngine,继承自UnicastRemoteObject类并实现ChunkServerApi接口,接收Master的调度并负责对Chunk的管理。
Client:使用分布式文件系统的本地端,通过与Master直接通信来间接地对文件系统进行操作。
Common:该模块负责实现工具类与配置文件,例如生成UUID,将文件读入内存等操作。
其具体的三方通讯流程如下图所示:
2. Master模块
2.1 心跳机制
使用Java RMI方式,在Master端检测每个ChunkServer是否在线。具体操作如下:
通过RMI方式来检测Chunk服务器的心跳,直接以try-catch方式判断。若服务器宕机则加入failedChunkServerList中。
检查正常ChunkServer上的所有Chunk的Hash值,若不一致则加入到Chunk失败列表中。
最后进行错误处理。
public synchronized void heartbeatScan() {
System.out.println("heartbeat checking...");
// 错误Chunk列表
Map> failedChunkMap = new LinkedHashMap<>();
// 错误Server列表
List failedChunkServerList = new ArrayList<>();
ChunkServerApi chunkServerApi;
Map hashMap;
int index = 0;
for(String chunkServer : chunkServerList) {
// 使用RMI检测心跳
try{
chunkServerApi = (ChunkServerApi) Naming.lookup("rmi://" + chunkServer + "/chunkServer");
// 获取Hash,用来检测Chunk错误
hashMap = chunkServerApi.getHashMap();
} catch (Exception e) {
// 服务器宕机
System.out.println("ChunkServer: " + chunkServer + " is down!");
failedChunkServerList.add(chunkServer);
}
try {
List failedList = new ArrayList<>();
for (ChunkInfo chunkInfo : serverInfoMap.get(chunkServer)) {
String hash = hashMap.get(chunkInfo.getChunk().getChunkId());
if (hash == null || !hash.equals(chunkInfo.getHash())) {
System.out.println("chunk:" + chunkInfo.getChunk().getChunkFileName() + " ERRO