Tendis:基于 Redis 协议的高性能分布式存储系统项目

Tendis is a high-performance distributed storage system fully compatible with the Redis protocol.

分支7Tags58
文件最后提交记录最后更新时间
2 个月前
11 个月前
11 个月前
10 个月前
5 年前
2 个月前
10 个月前
1 年前
2 年前
1 年前
4 年前
2 个月前
5 年前
1 年前
5 个月前
5 个月前
11 个月前
5 个月前
1 年前
5 年前
5 年前
4 年前

tendis

Tendis 是一款高性能的分布式存储系统,完全兼容 Redis 协议。中文文档

目录

简介

Tendis 是一款高性能的分布式存储系统,完全兼容 Redis 协议。它采用 RocksDB 作为存储引擎,所有数据通过 RocksDB 持久化到磁盘。用户可以直接使用 Redis 客户端访问 Tendis,应用几乎无需修改。此外,Tendis 支持远超内存的存储容量,能显著降低用户的存储成本。

与 Redis 集群类似,Tendis 采用去中心化的分布式方案。节点间通过 gossip 协议进行通信,用户访问集群中任意节点都能路由到正确的目标节点。集群节点支持自动发现其他节点、检测故障节点,并在主节点发生故障时确保应用几乎不受影响。

特性

  • Redis 兼容性

    Tendis 支持的 Redis 协议和命令与 Redis 保持兼容。

  • 持久化存储

    采用 RocksDB 作为存储引擎。所有数据以特定格式存储在 RocksDB 中,支持 PB 级存储容量。

  • 去中心化分布式集群

    实现方式类似 Redis 集群,节点间通过 gossip 协议进行通信。

  • 水平扩展能力

    支持节点间数据在线迁移。高性能且线性扩展,可扩展至 1000 个节点。

  • 故障自动转移

    自动检测故障节点,并在发生故障时将从节点提升为主节点。

  • Tendis 混合存储版的核心组件

    得益于其设计和内部优化,Redis 与 Tendis 可协同工作形成混合存储版。该版本适用于 KV 存储场景,能够平衡性能与成本,在冷数据占比较大的场景中,可将业务运营成本大幅降低 80%。

快速开始

环境要求

  • g++(C++17 要求,版本 >= 5.5)
  • cmake(版本 >= 3.13.0)

构建

$ git clone https://github.com/Tencent/tendis.git --recursive
$ git submodule update --init --recursive
$ mkdir build
$ cd build & cmake ..
$ make -j12

运行与体验

$ ./build/bin/tendisplus tendisplus.conf

通过 redis-cli 连接服务器

$ redis-cli -p 51002

测试

您可以对代码进行一些修改,并确保以下测试脚本能够通过。

$ sh ./testall.sh

性能

硬件规格

CPU:2.50 GHz,48 core
DISK:NVMe SSD
MEM:192GB

基准测试与 QPS 数据

tendisplus:工作线程数 = 56

./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="set __key__ __data__" --key-prefix="kv_" --key-minimum=1 --key-maximum=500000000 --random-data --data-size=128 --test-time=1800
./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="get __key__" --key-prefix="kv_" --key-minimum=1 --key-maximum=500000000 --test-time=1800
./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="incr __key__" --key-prefix="int_" --key-minimum=1 --key-maximum=1000000 --test-time=1800
./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="lpush __key__ __data__" --key-prefix="list_" --key-minimum=1 --key-maximum=1000000 --random-data --data-size=128 --test-time=1800
./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="sadd __key__ __data__" --key-prefix="set_" --key-minimum=1 --key-maximum=1000000 --random-data --data-size=128 --test-time=1800
./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="zadd __key__ __key__ __data__" --key-prefix="" --key-minimum=1 --key-maximum=1000000 --random-data --data-size=128 --test-time=1800
./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="hset __key__ __data__ __data__" --key-prefix="hash_" --key-minimum=1 --key-maximum=1000000 --random-data --data-size=128 --test-time=1800

image.png

延迟:

SET    1.6ms    99%
SET    2.2ms    99.9%
SET    6.9ms    99.99%
SET    9.4ms    100.00%

不同负载下的 QPS

tendisplus:工作线程数 = 56

./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="set __key__ __data__" --key-prefix="kv_" --command-key-pattern=R --random-data --data-size=128 --test-time=1800
./memtier_benchmark -t 20 -c 50 -s 127.0.0.1 -p 51002 --distinct-client-seed --command="get __key__" --key-prefix="kv_" --command-key-pattern=R --test-time=1800

image.png

我们先测试 set 操作半小时,再测试 get key 操作半小时。由于数据量不大,大部分数据都在内存中,因此不同 payload 下的 get qps 几乎相同。

贡献

有关提交 issue 或 pull request 的更多信息,请查看 CONTRIBUTING

支持

查看 support 获取常见问题解答,或加入我们的讨论组。

许可

Tendis 采用 GNU General Public License Version 3.0 许可。版权和许可信息可在文件 LICENSE.txt 中找到。

本仓库中与腾讯代码相关的版权声明此前以“THL A29 Limited”名义发布。该实体现已注销。对于之前分发的所有代码副本,您应将其版权声明视为以“腾讯”名义发布。

项目介绍

Tendis 是一款完全兼容 Redis 协议的高性能分布式存储系统。【此简介由AI生成】

定制我的领域
583.16 K343访问 GitHub