YCSB 的介绍与使用方法
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
1. 什么是 YCSBYCSB 全称 Yahoo! Cloud Serving Benchmark,即是一个雅虎云基准测试工具。
根据官方 wiki 描述,其现支持以下数据库:
HBase
Hypertable
Cassandra
Couchbase
Voldemort
MongoDB
OrientDB
Infinispan
Redis
GemFire
DynamoDB
Tarantool
Memcached
… 等等更多(上述列出的数据库类型均为 NoSQL)。
我们很难知道哪个存储系统更适合我们的应用程序,一部分原因是不同的系统有不同特性,一部分原因是比较存储系统的性能比较困难。而 YCSB 主要用于解决后者 —— 测试某些存储系统的性能。
YCSB 项目的目标是开发一套框架和通用的工作负载,以评估不同的 “key-value” 和 “云” 服务的性能。该项目包括两件事:
YCSB 客户端,一个可扩展的工作负载生成器。
核心工作负载,一组将由生成器执行的工作负载方案。
尽管 YCSB 核心工作 ...
RocksDB -- Leveled Compaction
1. 文件结构磁盘上的文件以多个级别(levels)组织。我们称它们为 level-1,level-2 等,或者 L1,L2 等。特殊的 level-0(或简称 L0)包含刚从内存中写缓冲区(memtable)flush 的文件。每个级别(除 level-0)都是一个数据排序运行(sorted run),如下:
在每个级别(除级 level-0)内,数据范围分区为多个 SST 文件:
level 是排序运行,因为每个 SST 文件中的 key 都是排了序的(请参阅 Block-based Table Format 作为示例)。为了确定一个 key 的位置,我们首先对所有文件的开始/结束 key 进行二分查找,以识别哪个文件可能包含该 key,然后在文件内进行二分查找以找到确切的位置。总而言之,它是对 level 中所有 key 的二分查找。
所有非 0 level 都有目标大小。Compaction 的目标是将这些 level 的数据大小限制在目标之下。目标大小通常呈指数增长:
2. 压实(Compactions)当 L0 文件的数量到达 Level0_file_num_comp ...
MIT6.824 Students' Guide to Raft 翻译
原文传送门:Students’ Guide to Raft
此文章为原文翻译,非本人原创文章!此外,翻译内的人称均和原文保持一致!
在过去的几个月里,我一直是麻省理工学院 6.824: Distributed Systems 课程的助教。传统上,该课程有许多基于 Paxos 共识算法的实验,但今年,我们决定转向 Raft。Raft 的设计“易于理解”,我们希望这种改变可以让学生的生活更轻松。
这篇文章以及随附的 Instructors’ Guide to Raft 文章记录了我们使用 Raft 的旅程,希望对 Raft 协议的实现者和试图更好地理解 Raft 内部结构的学生有用。如果您正在寻找 Paxos 与 Raft 的比较,或者想要对 Raft 进行更多的教学分析,您应该阅读 Instructors’ Guide。这篇文章的底部包含 6.824 名学生常见的问题列表,以及这些问题的答案。如果您遇到本文主要内容中未列出的问题,请查看 Q&A。这篇文章很长,但它提出的所有观点都是很多 6.824 名学生(和助教)遇到的实际问题。这篇文章值得一读。
1. 背景在我们深入研究 ...
MIT6.824 Lab1,2,3,4 经验与总结
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
课程主页传送门:6.824: Distributed Systems
4 个 lab 传送门:Lab 1: MapReduceLab 2: RaftLab 3: Fault-tolerant Key/Value ServiceLab 4: Sharded Key/Value Service
Lab 1: MapReduceLab1 是实现自己的 MapReduce 模型,比较简单,在 6.824 这里我感觉就是给大家练手的。
主要适合我这种之前没用过 Go 语言的,这个 Lab 被我用来熟悉 Go 了。
没什么好讲的,只要按着论文里描述的写就好了。后面的几个 Lab 才是重头戏。
下面是正确实现后的输出,用作参考就好了。
123456789101112[gukaifeng@iZ8vbf7xcuoq7ug1e7hjk5Z main]$ sh ./test-mr.sh*** Starting wc test.--- wc test: PASS*** Starting indexer test.--- inde ...
Raft 论文阅读笔记
Raft 论文原文传送门:In Search of an Understandable Consensus Algorithm (Extended Version)
这篇文章大头是原文翻译,但我在很多地方加入了自己的理解,主要作为我自己的笔记,不保证读者可以看懂,但你若有问题可以写在评论区,我会回复。
论文第 9 节及以后没有在本文记录笔记,因为这之后的内容不再是 Raft 共识算法的一部分。
0. 摘要Raft 是一种用于管理复制日志的共识算法。
Raft 产生的结果和 (multi-)Paxos 一样,并且和 Paxos 一样高效,但是 Raft 的结构和 Paxos 不同。这使 Raft 比 Paxos 更容易理解,也为在构建实际系统提供了更好的基础。
为了更容易理解,Raft 分离了共识的关键要素,例如领导选举(leader election),日志复制(log replication)和安全性(safety)。
Raft 加强了一致性,以减少必须考虑的情况的数目。
一个用户研究的结果说明,对于学生来说,Raft 比 Paxos 更容易学。
Raft 还包括一种用于更改集群 ...
RocksDB -- statistics.h 中的枚举 Histograms 详解
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
RocksDB 的 Histograms 枚举定义在 statistics.h 中,相关代码在这里。
statistics.h 中还声明了一个 Histograms 枚举值与 rocksdb 属性的一一对应关系,相关代码在这里,而具体的定义在 statistics.cc 中,在这里。
下面按照 statistics.h 中 Histograms 枚举的属性定义顺序,来逐个介绍。
1. DB_GETHistograms::DB_GET 对应的 rocksdb 属性为 rocksdb.db.get.micros。
2. DB_WRITEHistograms::DB_WRITE 对应的 rocksdb 属性为 rocksdb.db.write.micros。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354{DB_GET, "rocksdb.db. ...
RocksDB -- statistics.h 中的枚举 Tickers 详解
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
RocksDB 的 Tickers 枚举定义在 statistics.h 中,相关代码在这里。
statistics.h 中还声明了一个 Tickers 枚举值与 rocksdb 属性的一一对应关系,相关代码在这里,而具体的定义在 statistics.cc 中,在这里。
下面按照 statistics.h 中 Tickers 枚举的属性定义顺序,来逐个介绍。
1. BLOCK_CACHE_MISSTickers::BLOCK_CACHE_MISS 对应的 rocksdb 属性是 rocksdb.block.cache.miss。
2. BLOCK_CACHE_HITTickers::BLOCK_CACHE_HIT 对应的 rocksdb 属性是 rocksdb.block.cache.hit。
RocksDB -- DB::Properties 中的属性详解
RocksDB 中的 DB 类中定义了一个结构体 Properties,里面是许多 RocksDB 的属性。
具体代码在 db.h 中,在这里查看。
结构体 Properties 中的每个成员都对应一个 rocksdb 属性,我们可以通过 GetProperty() 或 GetMapProperty() 等方法来获取其中的内容。具体方法说明详见 获取属性值的方法。
本文的所有属性示例均使用 GetProperty(),其他的方法的输出内容可能会略有不同,但大体一样。
例如:
123456789101112131415161718192021222324#include <iostream>#include <cassert>#include "rocksdb/db.h"int main(int argc, char *argv[]){ rocksdb::DB *db; rocksdb::Options options; options.create_if_missing = true; rocksdb::St ...
预览或引用 GitHub 仓库中资源的方法
目前我已知的,只有 html 文件预览,和图片资源的预览。
其中 html 的预览可以加载 css 等资源(js 本人不确定,因为我不是做前端的),
图片资源的预览链接可以直接作为图片 url 来使用的。
1. html 预览http://htmlpreview.github.io/
2. 图片预览预览链接以 https://raw.githubusercontent.com/ 开头,具体格式如下:
1https://raw.githubusercontent.com/用户名/仓库名/分支/资源路径
-
举个例子,假如我(GitHub 用户名为 gukaifeng)有一张图片,在仓库 example-repo 的 main 分支中的 /img/ 路径下,名字为 example.png,即该图片在 GitHub 上的全路径应为:
1https://github.com/gukaifeng/example-repo/blob/main/img/example.png
那么这张图片的预览路径为:
1https://raw.githubusercontent.com/gukaifeng/exa ...
Go 语言读取或写入 Json
Go 语言提供了关于 json 的标准库包 encoding/json。
详细官网文档见 json package - encoding/json - pkg.go.dev,这里只介绍几种常用操作。
Json 包最常用的场景主要有两个:
Json 文件与结构体对象的交互:
将一个 Json 文件中的内容读取到一个结构体对象的成员变量中。
将一个结构体对象的成员变量写入到一个 Json 文件中。
将对象进行 Json 编码/解码:
对一个对象进行 Json 编码。
从 Json 编码构造对象。
Json 文件与结构体对象交互,通常用来读取/写入配置文件,持久化某些信息等。
将对象进行 Json 编码与解码,通常用来在网络上传输传输对象。将对象进行 Json 编码得到一个字节数组 []byte,即字节流,然后进行网络传输,接收方可通过此 Json 编码,构造出该对象。
要注意的是,Json 中字段的 key 本身是不区分大小写的,Go 语言的 Json 包解析 Json 的时候也同样是不区分 key 的大小写的(虽然有些编程语言或包可能区分大小写)。
1. Jso ...