3个版本

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

#1509 in 异步

每月21次下载
mycelium中使用

MIT许可证

235KB
5K SLoC

Mycelium D.D.M.

Mycelium去中心化数据网格的目标是成为一个去中心化的数据存储,在多个设备(如手机、平板电脑和电脑)上创建数据网格,这些设备可以配置为以有用的方式在设备之间共享和复制数据。

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

我们现在在哪里?

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

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

我们有一个功能性的TCP堆栈,但没有p2p网络。UDP组播将创建一个网络节点网格。Mycelium的目标是在LAN上,节点将配置自己,一旦上线。Mycelium将根据数据的使用情况和一些配置在节点之间分发数据。在未来,经过一些重构以支持async/await后,我们将从Tokio迁移到rust-libp2p,Tokio作为执行器。

用户文档

Mycelium核心

数据IO库。

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许可证的保护。

依赖项

~11MB
~180K SLoC