0.1.5 • Published 6 years ago
sonofs v0.1.5
sonofs
sono nodejs distributed file system
简介
sonofs是一个轻量级、高性能的分布式文件系统。提供小文件合并、负载均衡、文件自动备份等功能
master 可上传和获取
slave 仅获取和同步,不可上传
如何使用
启动注册中心服务
scripts/registry.js
const { startRegistry } = require('sonofs');
startRegistry({
port: 8123
}, () => {
});启动文件服务
scripts/server.js
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
const { Server } = require('sonofs');
const cfg = {
// 服务分组id
groupId: 1,
// 服务id,同一`serverId`只能分配给一个进程
serverId: 1,
// 文件存储主目录,同一文件夹只能分配给一个进程
root: '/data/upload',
// 服务器端口号
port: 8124,
// 注册中心配置
registry: {
host: '127.0.0.1',
port: 8123
}
};
if (cluster.isMaster) {
Server.start(cfg, () => {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
});
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`, code, signal);
});
} else {
Server.childThread(cfg);
}启动slave文件服务
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
const { Server } = require('sonofs');
// 配置大部分与server一致
const cfg = {
// 服务分组id
groupId: 1,
// 服务id,同一`serverId`只能分配给一个进程
serverId: 1,
// 文件存储主目录,同一文件夹只能分配给一个进程
root: '/data/upload1',
// 表示是slave服务
isSlave: true,
// 服务器端口号
port: 8125,
// 注册中心配置,必须与master注册到同一注册中心
registry: {
host: '127.0.0.1',
port: 8123
}
};
if (cluster.isMaster) {
Server.start(cfg, () => {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
});
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`, code, signal);
});
} else {
Server.childThread(cfg);
}上传/访问文件
client.js
const { Controller } = require("egg");
const { createClient } = require('sonofs');
// 创建客户端
const fsClient = createClient({
// 上传的临时文件存放位置
tmpDir: '/data/tmp',
registry: {
port: 8123
}
});
class UploadController extends Controller {
// 上传文件
async testUpload() {
const { ctx } = this;
const stream = await ctx.getFileStream();
// 调用上传方法
const result = await fsClient.upload(stream.mime, stream);
console.log(result);
ctx.body = {
fileName: result
};
}
// 访问文件: /testGetFile?file=AA0000B0ABNX00Fjj
async testGetFile() {
const { ctx } = this;
try {
// 调用获取文件方法
const result = await fsClient.getFile(ctx.query.file);
ctx.type = result.mime;
ctx.body = result.buffer;
} catch (e) {
console.error(e);
ctx.body = {};
}
}
}技术细节
server config
groupId服务分组idserverId服务id,同一serverId只能分配给一个进程root文件存储主目录,同一文件夹只能分配给一个进程port端口号[master]仅slave机需要配置,master的ip地址+端口号文件名格式: groupId+serverId+dir+subDir+bundle+mime+fileStart+fileSize
- 文件初始化时会预先分配 1gb空间
mime
image/png:01image/jpeg:02image/gif:03text/plain:04text/html:05application/octet-stream:06