2 个版本

0.1.1 2019年10月27日
0.1.0 2019年10月23日

#1 in #mycelium

24 每月下载量
2 个crate中使用 (通过 mycelium_lib)

MIT 许可证

275KB
6K SLoC

Mycelium D.D.M.

Mycelium 分散数据网格的目的是成为一个分散的数据存储,在多个设备上创建数据网格,如手机、平板电脑和PC,可以配置为以有用的方式在设备之间共享和复制数据。

  • 该项目正在从学习项目转变为项目组合。在遥远的未来,将有一个功能数据库。我们有一个博客、维基页面、代码文档、CI构建和优秀的代码仓库。Mycelium 是一个P2P分布式数据库项目。目前使用Docker-Compose来测试基本网络功能。主要是因为它既快又简单。一旦完成,我们将使用类似ns-3的工具。

我们现在在哪里?

Mycelium 核心使用基本的键/桶存储。这些数据桶被称为标签。Mycelium 生态系统的基础数据结构使用Crossbeam库。Mycelium 目前作为一个内存数据库运行,但可以将其自身写入磁盘。目前此操作速度较慢,且在操作系统文件系统之上运行。

Mycelium 索引也使用Crossbeam的SkipLMS结构来索引回核心。Mycelium 索引还将创建不同标签项之间的关系。从长远来看,我希望使用机器学习来代替索引(pdf)。

我们有一个功能性的TCP堆栈,但没有P2P网络。UDP多播将创建网络节点的网格。Mycelium 的目标是网格节点将配置自己,随着它们通过局域网上线。Mycelium 将根据数据的使用和某些配置在节点之间分发数据。在未来的某个时候,我们将通过一些重工作来支持异步/等待,将使用类似rust-libp2p的工具,Tokio作为执行器。

用户 文档

Mycelium 核心库

数据IO库。

Mycelium 索引库

Mycelium 索引将创建关系数据库功能。数据以紧凑的二进制格式存储。为了创建关系,每条数据可以给定一个或多个索引术语。稍后,将添加关系,允许您关联数据。最终,在索引上进行连接/过滤和操作。索引可以包含节点中包含的任何数据,可以是公开的。

Mycelium

Web服务器

节点之间的TCP正常请求。

UDP将用于使用UDP本地多播注册节点P2P。也将用于网格上的通用请求。

Mycelium 库

将Mycelium嵌入到另一个应用程序的主要库。

使用说明

当前使用方式不够人性化。包结构在一个单独的工作空间内。最终,随着项目的进一步发展,将分为多个库、可执行文件和工具。

  • 克隆此仓库
  • 创建项目
  • 在新项目的 cargo.toml 中使用 lib_mycelium 的路径
[dependencies]
lib_mycelium = { path = "../myceliumdds/lib_mycelium" }

main.rs

extern crate lib_mycelium;


// Start a TCP Server default 127.0.0.1:34120
let config = Config::default();
let db = Mycelium::init_db(config);
mycelium_lib::start_local(db.clone());

// TCP Connect and run:
// msql insert [0, 0, 0, 0] doctor
    // insert byte[] into the database container doctor. Statement creates container if it does
    // not currently exists. 
// msql select doctor
    // selects all items that have been inserted into the container doctor

或者不需要 TCP 服务器


let config = Config::default();
let db = Mycelium::init_db(config);
let cmd_txt = format!("Insert {} duck", "Quack Quack!".as_bytes());
let cmd = Command::parse(cmd_txt.as_str()).unwrap();    
match db.execute_command(cmd).unwrap() {
    (Result::Id(id), None, None) => {
        println!("ID of inserted item: {:?}", id)
    }
    _ => { unimplemented!() }
}

// or a list of results
let cmd = Command::parse("Select from duck").unwrap();
match db.execute_command(cmd).unwrap() {
    (Result::List, None, Some(list)) => {
        for item in list {
            println!("item: {:?}", item)
        }
    },
    _  => { unimplemented!() }
}

集成

项目用于测试开发库的可使用性和一致性。

基准测试

库,用于跟踪和图表函数性能随时间的变化。

安装/使用 Mycelium D.D.S.

安装 rust。克隆此仓库。使用 cargo 构建和运行。

附加文档

克隆此仓库后,可以通过运行 "cargo doc" 找到开发附加文档。

贡献!

我欢迎对这个项目的任何贡献。项目和所有贡献都将采用 MIT 许可证。

依赖项

~6.5MB
~122K SLoC