1.介绍
Tendis存储版是腾讯互娱CROS DBA团队 & 腾讯云数据库团队 自主设计和研发的开源分布式高性能KV存储。完全兼容redis协议,并使用rocksdb作为存储引擎。用户可以通过redis client访问Tendis存储版,几乎不用修改代码。同时,Tendis存储版支持远超内存的磁盘容量,可以大大降低用户的存储成本。
GitHub:https://github.com/Tencent/Tendis
官方文档:http://tendis.cn/#/
下载地址:https://github.com/Tencent/Tendis/releases/tag/2.4.3-rocksdb-v5.13.4
2.特性
- 1.Redis兼容性:完全兼容redis协议,支持绝大多数redis的指令
- 2.持久化存储:使用rocksdb作为存储引擎,所有数据以特定格式存储在rocksdb中,最大支持PB级存储
- 3.去中心化架构:类似于redis cluster的分布式实现,所有节点通过gossip协议通讯,可指定hashtag来控制数据分布和访问,使用和运维成本极低
- 4.水平扩展:集群支持增删节点,并且数据可以按照slot在任意两节点之间迁移,扩容和缩容过程中对应用运维人员透明,支持扩展至1000个节点
- 5.故障高可用:自动检测故障节点,当故障发生,slave会提升为master继续对外服务
3.性能报告
官方性能报告,单机硬件配置
- CPU:2.50 GHz,48 core
- DISK:NVMe SSD
- MEM:192GB
以下是一个NVME SSD的 tendisplus.conf 配置参考,供参考
bind 127.0.0.1
port 51002
loglevel notice
cluster-enabled on
storage rocks
pidfile ./home/tendisplus.pid
# 数据和日志目录要提前创建
logdir ./home/log
dir ./home/db
dumpdir ./home/dump
# tendis的密码,按需指定
#requirepass 123
#masterauth 123
# binlog清理相关参数
truncateBinlogIntervalMs 100
truncateBinlogNum 500000
binlogDelRange 500000
# 网络线程池数量,建议cpu数量/4,
netiothreadnum 8
# 工作线程池数量,建议略多于cpu数量
executorthreadnum 56
# 其他线程池数量配置,根据实际情况配置,想看参数配置
# incrPushThreadnum 4
# migrateSenderThreadnum 2
# migrateReceiveThreadnum 4
# migrateClearThreadnum 2
# rocksdb的blockcache大小,建议使用30%系统内存(64GB)
rocks.blockcachemb 65536
# rocksdb相关配置
rocks.cache_index_and_filter_blocks 0
rocks.max_open_files -1
rocks.compress_type lz4
#rocks.level0_compress_enabled no
#rocks.level1_compress_enabled no
rocks.level_compaction_dynamic_level_bytes 1
# [n >= 4, n <= 64, n ~= cpu_cores]
rocks.max_background_compactions 64
#rocks.max_write_buffer_number 16
#rocks.min_write_buffer_number_to_merge 14
rocks.write_buffer_size 67108864
rocks.target_file_size_base 67108864
rocks.max_bytes_for_level_base 536870912
# mapping-command dbsize emptyint
# mapping-command keys emptymultibulk
# 数据迁移相关配置
cluster-migration-slots-num-per-task 10
cluster-migration-rate-limit 500
cluster-migration-binlog-iters 20
cluster-migration-distance 10000
4.Tendis存储版 vs Redis cluster 对比
4.1.优点:
- 所有数据存储到磁盘,提供更大的容量和更低的成本,数据可靠性更高
- 多线程架构,单进程的性能吞吐比redis单进程更高(30wQPS vs 13wQPS)
- 独立的gossip网络线程,支持更多的节点通讯,支持更大规模的集群
- 更强大的数据搬迁能力,原redis cluster的搬key实现,如果遇到大key,会导致比较恶劣的全局阻塞
- 基于rocksdb的镜像和完善的binlog实现,支持任意时间点的回档,社区版redis暂无这个能力
- 支持增量复制及复制断开断点续传,redis复制断开需要全量复制
4.2.缺点:
- 对比纯内存的redis,Tendis存储版的延时更大
- 部分命令还不支持(pubsub, geo等),正在完善中
- 对于单key更新,由于Tendis存储版内部并发控制,无法发挥多线程的优势,会退化为单线程,性能较低
5.快速试用
- 1.下载tendis,并上传到服务器(演示机器为VMware 虚拟机 centos7.5)
- 2.解压:tar -xvzf tendisplus-2.3.4-rocksdb-v5.13.4.tgz
- 3.进入tendis的scripts目录:cd tendisplus-2.3.4-rocksdb-v5.13.4/scripts
- 4.启动tendis:sh start.sh
此时一个最基本的tendis进程启动了,由于默认bind 127.0.0.1 只能在服务器上用 redis-cli 命令访问,cd tendisplus-2.3.4-rocksdb-v5.13.4/bin ,redis-cli -p 51002 就进入到redis客户端了
- 5.修改tendisplus.conf ,能外网访问
# tendisplus configuration for testing
# 绑定本机IIP
bind 192.168.148.140
#设置访问密码
requirepass 123456
port 51002
daemon yes
#设置单机模式,非集群模式,默认值no
cluster-enabled no
loglevel notice
logdir ./home/log
dumpdir ./home/dump
dir ./home/db
pidfile ./home/tendisplus.pid
slowlog ./home/log/slowlog
rocks.blockcachemb 4096
executorThreadNum 48
再次用客户端连接:redis-cli -h 192.168.148.140 -p 51002 -a 123456
用redis desktop manager连接
6.tendis集群篇
请参考:http://tendis.cn/#/Tendisplus/%E8%BF%90%E7%BB%B4/new_cluster
- 1.配置文件必须确保cluster-enabled为yes
- 2.启动多个tendis实例,拉起了6个tendis进程,端口号分别是30000~30005:30000、30001、30002、30003、30004、30005
- 3.节点握手:拉起tendis服务进程之后,就可以像使用类似Redis命令一样来建立tendis集群
# 连接30000节点meet其他所有节点
shell> redis-cli -p 30000
127.0.0.1:30000> cluster meet 127.0.0.1 30001
127.0.0.1:30000> cluster meet 127.0.0.1 30002
127.0.0.1:30000> cluster meet 127.0.0.1 30003
127.0.0.1:30000> cluster meet 127.0.0.1 30004
127.0.0.1:30000> cluster meet 127.0.0.1 30005
- 4.分配slots,默认情况下,Tendis存储版跟Redis一样,将所有的数据映射到16384个slot中,每个key都会对应一个槽。只有把slot分配给了Tendis节点,Tendis节点才能响应与slot相关的命令,否则就会-MOVE到其他节点
#分配slots可使用cluster add slots指令
#将16384个slots平均的分配给3个节点
shell> redis-cli -p 30000 cluster addslots {0..5461}
OK
shell> redis-cli -p 30002 cluster addslots {5462..10922}
OK
shell> redis-cli -p 30004 cluster addslots {10923..16383}
OK
#等待若干秒后,可以通过cluster info指令查看集群状态
127.0.0.1:30000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
- 5.主从复制,这里将3个实例分配了slots,剩余三个实例可以作为他们的slave,使用cluster replicate命令
shell> redis-cli -p 30001 cluster replicate 4233f87b9899774feb71bcef1cfeec964de0535b
OK
shell> redis-cli -p 30003 cluster replicate b072bdd0f3d6cf75edcee1345da0d33f59177da0
OK
shell> redis-cli -p 30005 cluster replicate c980e1e23d20e9169aca0cbe7751d8a76b73859f
OK
就可以搭建一个三主三从的集群
127.0.0.1:30000> cluster nodes
20f8df612b19c879c92149458856ec08af50d459 127.0.0.1:30001@16374 slave 4233f87b9899774feb71bcef1cfeec964de0535b 0 1606964904000 5 connected
4233f87b9899774feb71bcef1cfeec964de0535b 127.0.0.1:30000@16379 myself,master - 0 1606964903000 0 connected 0-5461
f9d8c3f6679badc6366087d498f005849ad3b14d 127.0.0.1:30003@16375 slave b072bdd0f3d6cf75edcee1345da0d33f59177da0 0 1606964901000 4 connected
b072bdd0f3d6cf75edcee1345da0d33f59177da0 127.0.0.1:30002@16378 master - 0 1606964902996 1 connected 5462-10922
c980e1e23d20e9169aca0cbe7751d8a76b73859f 127.0.0.1:30004@16377 master - 0 1606964904598 2 connected 10923-16383
cd3c5da6415d5c1d125961e0f78badd162c7f7d3 127.0.0.1:30005@16376 slave c980e1e23d20e9169aca0cbe7751d8a76b73859f 0 1606964894000 3 connected