02 2023 档案
摘要:本指南的目的是提供你足够的信息用于根据自己的工作负载和系统配置调优RocksDB。 RocksDB非常灵活,这有好也有坏。你可以真多很多工作场景和存储技术进行调优。在Facebook,我们使用相同的代码跑内存工作压力,闪盘设备和机械硬盘。然而,灵活性不总是对用户友好的。我们引入了大量的调优参数,让人
阅读全文
摘要:并发 一个数据库可能同时只能被一个进程打开。RocksDB的实现方式是,从操作系统那里申请一个锁,以此来阻止错误的写操作。 在单进程里面,同一个rocksdb::DB对象可以被多个同步线程共享。举个例子,不同的线程可以同时对同一个数据库调用写操作,迭代遍历操作或者Get操作,而且不需要使用额外的同步
阅读全文
摘要:问:如果我的进程crash了,我的数据库数据会受影响吗?答:不会,但是如果你没有开启WAL没有刷入到存储介质的memtable数据可能会丢失。问:如果我的机器crash了,RocksDB能保证数据的完整吗?答:数据在你调用一个带sync的写请求的时候会被写入磁盘(使用WriteOptions.syn
阅读全文
摘要:简介 这篇论文介绍了一个新的键值存储系统,名为Faster,它支持点读、更新和读-改-写操作。Faster将一个高度缓存优化的并发哈希索引与一个混合日志结合起来:一个跨越主内存和存储的并发日志结构化记录存储,同时支持对内存中热数据集的快速原地更新。 创新点 Faster提出了一个新颖的“混合记录日志
阅读全文
摘要:Insert(pinode_fname,inode) 对DirTreeTable 的写请求首先访问内存中的Dir Table Cache,获取到pinode对应LogStore 指针,直接将KV 数据追加写入到LogStore 的尾部, 同时将返回的NVM 指针以及LogStore 指针写入到Ful
阅读全文
摘要:为了提高线程利用率并最小化开销,必须决定要使用的线程数量,并为每个线程合理分配任务 开始处理之前的线程间数据划分 简单算法最容易并行化,比如要并行化 std::for_each,把元素划分到不同的线程上执行即可。如何划分才能获取最优性能,取决于数据结构的细节,这里用一个最简单的划分为例,每 N 个元
阅读全文
摘要:阻塞的算法和数据结构使用 mutex、条件变量、期值来同步数据,但非阻塞不等价于 lock-free,比如自旋锁没有使用任何阻塞函数的调用,是非阻塞的,但并非 lock-free 非阻塞数据结构由松到严可分为三个等级:obstruction-free、lock-free、wait-free obst
阅读全文
摘要:并发访问 std::map 和 std::unordered_map 的接口的问题在于迭代器,其他线程删除元素时会导致迭代器失效,因此 thread-safe map 的接口设计就要跳过迭代器 为了使用细粒度锁,就不应该使用标准库容器。 红关联容器数据结构 一是二叉树(如红黑树),但每次查找修改都要
阅读全文
摘要:常见的 LSM 存储引擎,如 LevelDB 和 RocksDB,将用户写入的一组的 key 和 value 存放在一起,按顺序写入 SST。在 compaction 过程中,引擎将上层的 SST 与下层 SST 合并,产生新的 SST 文件。这一过程中,SST 里面的 key 和 value 都会
阅读全文
摘要:leveldb/rocksdb采用deque控制多线程只允许一个线程修改memtable, 是由于memtable不存在读-写冲突(采用MVCC,保证Sequence一定不同,memtable的key就一定不同,update/delete/insert操作一定不会修改已有key的数据) 这样只存在写
阅读全文
摘要:RocksDB Features that are not in LevelDB We stopped maintaining this page since 2016. New features are not added to the lists. Performance Multithread
阅读全文
摘要:leveldb是典型的LSM树实现,因此需要对内存中的数据进行持久化。一次内存数据的持久化过程,在leveldb中称为Minor Compaction。一次minor compaction的产出是一个0层的sstable文件,其中包含了所有的内存数据。但是若干个0层文件中是可能存在数据overlap
阅读全文
摘要:MVCC多版本是一个解决并发问题的模型,或者说是一种设计思路。 why MVCC? 如果有一份数据,无论它是存储在内存里还是磁盘上,当我们读取数据时可能有写操作正在修改它。传统思路就是将数据用一把锁保护起来: 读之前加读锁,这样就不会有写操作。 写之前加写锁,这样就不会有读操作和其他写操作。 如果数
阅读全文
摘要:template< class... MutexTypes > class scoped_lock; (since c++17) 作用 同时持有一个或多个Mutex的RAII机制的mutex包装器,可以一次性获取多个mutex,避免发生死锁。 当scoped_lock创建,它将会尝试获取所有mute
阅读全文
摘要:sstable(sorted string table)是google bigtable中引出的数据结构,在levelDB、RocksDB以及现在各类数据库存储中配合LSM有广泛应用,学习下很有必要,本位以RocksDB中SST的实现来了解SST。 优点 空间利用率高:sstable基于sorted
阅读全文
摘要:PaxosStore 中定义了一种名为 Command 的消息,模块间的通信通过 Command 的传递实现。消息传递的方式有两种,一种是通过消息队列传递,一种是使用 Protobuf 序列化后通过网络收发。 clsPaxosCmd 派生了 clsPaxosCmd / clsClientCMd /
阅读全文
摘要:迭代器的作用就是提供一个遍历容器内部所有元素的接口,因此迭代器的内部必须保存一个与容器相关联的指针,然后重载各种运算操作来方便遍历 其中最重要的就是* 运算符和-> 运算符,以及++、--等可能需要的运算符重载。 实际上这和C++标准库的智能指针(smart pointer)很像,智能指针也是将一个
阅读全文
摘要:内存管理总是程序中的重要一环,在多线程时代,一个好的内存分配大都在如下两点间权衡: 线程间竞争少。内存分配的粒度大都比较小,对性能敏感,如果不同的线程在大多数分配时会竞争同一份资源或同一把锁,性能将会非常糟糕,原因无外乎和cache一致性有关,已被大量的malloc方案证明。 浪费的空间少。如果每个
阅读全文
摘要:一些场景希望同样的请求尽量落到一台机器上,比如访问缓存集群时,我们往往希望同一种请求能落到同一个后端上,以充分利用其上已有的缓存,不同的机器承载不同的稳定working set。(类似redis集群分片,每一片负责一个set的keys,每个分片的数据互不相交) 而不是随机地散落到所有机器上,那样的话
阅读全文
摘要:LALB全称Locality-aware load balancing,是一个能把请求及时、自动地送到延时最低的下游的负载均衡算法,特别适合混合部署环境。 LALB可以解决的问题: 下游的机器配置不同,访问延时不同,轮询和随机分流效果不佳。 下游服务和离线服务或其他服务混部,性能难以预测。 自动地把
阅读全文
摘要:1.连接独占线程或进程 在这个模型中,线程/进程处理来自绑定连接的消息,在连接断开前不退也不做其他事情。当连接数逐渐增多时,线程/进程占用的资源和上下文切换成本会越来越大,性能很差,这就是C10K问题的来源。这种方法常见于早期的web server,现在很少使用。 2.单线程reactor 以lib
阅读全文
摘要:我们都知道多核编程常用锁避免多个线程在修改同一个数据时产生race condition。当锁成为性能瓶颈时,我们又总想试着绕开它,而不可避免地接触了原子指令。但在实践中,用原子指令写出正确的代码是一件非常困难的事,琢磨不透的race condition、ABA problem、memory fenc
阅读全文
摘要:Relaxed ordering Typical use for relaxed memory ordering is incrementing counters, such as the reference counters of std::shared_ptr, since this only
阅读全文