引言
Dragonfly可能是宇宙中最快的内存存储!Redis和Memcached的现代替代品
Dragonfly是一个现代的内存数据存储,与Redis和Memcached API完全兼容。Dragonfly在多线程,无共享架构之上实现了新颖的算法和数据结构。因此,与 Redis 相比,Dragonfly 的性能达到了 x25,并且在单个实例上支持数百万 QPS。
Dragonfly 的核心特性使其成为经济高效、高性能且易于使用的 Redis 替代品。
Dragonfly入门
Dragonfly是一个现代的内存数据存储,与Redis和Memcached API完全兼容。Dragonfly在多线程,无共享架构之上实现了新颖的算法和数据结构。因此,与 Redis 相比,Dragonfly 的性能达到了 x25,并且在单个实例上支持数百万 QPS。
Dragonfly 的核心特性使其成为经济高效、高性能且易于使用的 Redis 替代品。
许可证
Dragonfly在BSL 1.1下发布。简而言之,这意味着它是免费使用的,只要您不使用它为Dragonfly提供付费支持或竞争托管服务,就可以免费更改。
运行环境
Dragonfly在Linux上运行。它使用相对较新的Linux特定io-uring API进行I / O,因此它需要Linux版本5.10或更高版本。Debian/Bullseye,Ubuntu 20.04.4或更高版本符合这些要求。
Docker下安装
代码语言:shell复制docker pull docker.dragonflydb.io/dragonflydb/dragonfly &&
docker tag docker.dragonflydb.io/dragonflydb/dragonfly dragonfly
docker run --network=host --ulimit memlock=-1 --rm dragonfly
redis-cli PING # redis-cli can be installed with "apt install -y redis-tools"
需要 –ulimit memlock=-1,因为一些 Linux 发行版将容器的默认 memlock 限制配置为 64m。当然,作为内存数据存储,Dragonfly需要更多。
从源代码构建
您需要安装依赖项才能在 Ubuntu 20.04 或更高版本上构建:
代码语言:shell复制git clone --recursive https://github.com/dragonflydb/dragonfly && cd dragonfly
# 安装依赖项
sudo apt install ninja-build libunwind-dev libboost-fiber-dev libssl-dev
autoconf-archive libtool cmake g
# 配置构建
./helio/blaze.sh -release
#构建
cd build-opt && ninja dragonfly
#运行
./dragonfly --alsologtostderr
直接使用发行版
开发者维护 x86 和 arm64 架构的二进制版本。您需要安装 lib 才能运行二进制文件。libunwind8
Releases
配置
在适用的情况下,Dragonfly 支持常见的 redis 参数。例如,可以运行:
dragonfly --requirepass=foo --bind localhost
Dragonfly 目前支持以下特定于 Redis 的参数:
port
bind
requirepass
maxmemory
dir
- 默认情况下,蜻蜓泊坞窗使用文件夹进行快照。您可以使用 Docker 选项将其映射到主机文件夹。/data-v
dbfilename
此外,它还具有Dragonfly特定的参数选项:
memcache_port
- 在此端口上启用内存缓存兼容 API。默认情况下禁用。keys_output_limit
- 命令中返回的密钥的最大数量。默认值为 8192。 是一个危险的命令。我们截断其结果,以避免在获取太多键时在内存中爆炸。keyskeys
dbnum
- 支持的最大数据库数。select
cache_mode
- 请参阅下面的缓存部分。
有关日志管理或 tls 支持等更多选项,请运行 dragonfly --help
背景
Dragonfly最初是一个实验,旨在了解内存数据存储在2022年设计时的外观。根据我们作为内存存储用户和为云公司工作的工程师的经验中吸取的教训,我们知道我们需要为Dragonfly保留两个关键属性:A:为其所有操作提供原子性保证,以及B:在非常高的吞吐量上保证低的亚毫秒级延迟。
我们的第一个挑战是如何利用目前在公共云中可用的服务器充分利用CPU,内存和I/O资源。为了解决这个问题,我们使用了无共享架构,它允许我们在线程之间对内存存储的键空间进行分区,以便每个线程管理自己的字典数据切片。我们将这些切片称为分片。为无共享架构的线程和 I/O 管理提供支持的库在这里是开源的。
为了给多键操作提供原子性保证,我们利用了最近学术研究的进展。我们选择了论文“VLL:主内存数据库系统的锁管理器重新设计”来开发Dragonfly的事务框架。无共享架构和 VLL 的选择允许我们在不使用互斥锁或自旋锁的情况下编写原子多键操作。这是我们PoC的一个重要里程碑,其性能从其他商业和开源解决方案中脱颖而出。
我们的第二个挑战是为新商店设计更高效的数据结构。为了实现这一目标,我们将核心哈希表结构基于“Dash:持久内存上的可扩展哈希”。。本文本身以持久内存域为中心,与主内存存储没有直接关系。然而,它非常适用于我们的问题。它提出了一种哈希表设计,该设计允许我们维护Redis字典中存在的两个特殊属性:a)它在数据存储增长期间的增量哈希能力b)它使用无状态扫描操作在更改下遍历字典的能力。除了这2个属性之外,Dash在CPU和内存方面的效率要高得多。通过利用达世币的设计,我们能够通过以下功能进一步创新:
- TTL 记录的高效记录过期。
- 一种新颖的缓存逐出算法,可实现比其他缓存策略(如 LRU 和 LFU)更高的命中率,且内存开销为零。
- 一种新颖的无分叉快照算法。
在我们为Dragonfly奠定了基础并且我们对它的性能感到满意之后,我们继续实现Redis和Memcached功能。到目前为止,我们已经实现了大约130个Redis命令(相当于v2.8)和13个Memcached命令。
结语
我们的使命是为云工作负载构建一个设计精良、超快速、经济高效的内存中数据存储,以利用最新的硬件进步。我们打算解决当前解决方案的痛点,同时保留其产品API和主张。