DragonflyDB 部署与运维实战:从单实例跑通到高可用集群
【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly
业务要用 Redis,但数据量涨上去之后,单节点内存上限和成本都扛不住。DragonflyDB 是一个兼容 Redis 和 Memcached 协议的内存数据库,现有客户端代码基本不用改,可以直接替换上线。下面按上线任务线走一遍:拉镜像、配生产参数、扩集群、盯指标、兜底备份。
一、五分钟快速上手:从拉镜像到 ping 通
最短路径就是docker run两条命令,镜像默认同时开 6379(Redis)和 11211(Memcached)端口:
# 官方镜像启动,memlock=-1 必须加,否则大内存下性能明显下降 docker run -d --name dragonfly --network=host \ --ulimit memlock=-1 docker.dragonflydb.io/dragonflydb/dragonfly # 验证连通性,返回 PONG 即可用 redis-cli -p 6379 ping生产上一般用 Compose 管理,仓库里有一份现成配置可参考:contrib/docker/docker-compose.yml。
二、上线前清单:生产环境必做的 4 件事
🔒 上线前把这四件事过一遍,每项对应下面这张参数表,按「参数 / 默认值 / 建议值 / 不这样配会怎样」来核对:
- 认证与 TLS:没密码的实例等于裸奔,内网也建议开启
- 内存与资源:给进程一个明确的内存上限,别让它把宿主机吃光
- 数据持久化:快照目录必须落在宿主机可挂载的位置
- 健康检查:官方镜像自带检查脚本(用 nc 发 PING 探测端口,见 tools/docker/healthcheck.sh),在 Compose 里启用即可,不用自己写
| 参数 | 默认值 | 生产建议值 | 不这样配会怎样 |
|---|---|---|---|
| requirepass | 空 | 强密码 | 无认证,网络内任何人可读写 |
| tls_cert_file / tls_key_file | 空 | 挂载有效证书 | 流量明文,可被中间链路嗅探 |
| maxmemory | 自适应 | 系统内存 70%~80% | 无驱逐上限,进程被 OOM Kill |
| proactor_threads | 全部核心 | 对齐物理核数 | 超分导致上下文切换开销变大 |
| dir / dbfilename | 空 / 带时间戳文件名 | 独立磁盘目录 | 快照落在容器层,重建即丢 |
| admin_port | 与业务同端口 | 独立端口并绑定 127.0.0.1 | 管理接口暴露给业务流量 |
证书可以不用手搓,仓库提供了生成脚本 tools/generate-tls-files.sh。
三、规模上来之后:集群模式与高可用
先划清边界,两种模式选错后面全白做:
- emulated 模式(
cluster_mode=emulated):每个节点保存全量数据,客户端按单节点方式连接,适合用多节点横向扩吞吐、但单节点放得下全部数据的场景 - real cluster 模式(
cluster_mode=yes):数据按 16384 个槽位分片到各节点,客户端必须用集群感知连接,适合总量超过单节点内存的场景
关键参数:
| 参数 | 默认值 | 建议值 | 说明 |
|---|---|---|---|
| cluster_mode | no | emulated 或 yes | 先定模式再扩节点 |
| cluster_node_id | 自动生成 | 固定标识 | 重启后节点身份不漂移 |
| cluster_announce_ip | 本地回环 IP | 内网可达 IP | 配错则其他节点无法连回 |
| announce_port | 与 port 一致 | 实际对外端口 | NAT 或端口映射环境必须显式设置 |
组集群用官方脚本 tools/cluster_mgr.py:
# 本地建 3 主 + 每主 1 副本的集群 python3 tools/cluster_mgr.py --action=create_locally --num_masters=3 --replicas_per_master=1复制与故障转移:副本端执行REPLICAOF跟上主节点,异步复制、秒级追平;主节点挂掉后,把最健康的副本执行REPLICAOF NO ONE提升为新主,再把业务连接切过去。
集群细节可进一步看 docs/cluster-mode.md。
四、日常运维:真正需要盯的监控指标
指标从管理端口的/metrics拉取(Prometheus 格式)。全量指标不用看,下面 7 个是半夜会叫醒你的:
| 指标 | 建议阈值 | 含义 |
|---|---|---|
| dfly_used_memory | 超过 maxmemory 90% | 内存逼近上限,驱逐即将开始 |
| dfly_evicted_keys | 持续 > 0 | 热 key 正在被逐出,缓存实际失效 |
| dfly_client_connections | 超过 maxclients 80% | 连接泄漏或流量洪峰前兆 |
| dfly_rejected_connections | 任何增长 | 新连接已在被拒绝 |
| 复制偏移差 / 复制积压 | 落后数秒或积压超 10MB | 副本追不上,故障切换会丢数据 |
| 进程 uptime 归零 | 出现即告警 | 进程重启过,先查 OOM 与日志 |
| 快照写入耗时 | 超过 5 分钟 | 备份窗口撑不住,恢复点会漂移 |
五、数据兜底:备份与恢复怎么做
定时快照一行命令就够:
# 每天 03:00 自动快照,文件带时间戳落在 dir 指定目录 dragonfly --snapshot_cron="0 3 * * *" --dir=/data/dump恢复流程:起一个新实例,--dir指向存有快照的目录,启动时会自动加载最新一份快照,无需手动 restore;恢复完成后让副本重新REPLICAOF跟上即可。
⚠️ 高频踩坑点:快照只和它落盘的位置一样可靠。如果 dir 指向容器匿名卷,重建容器快照就没了,务必挂载命名卷或宿主机目录,并定期验证一次「从快照起新实例」的恢复演练。
六、常见坑 FAQ
Q:docker run报端口被占用?先用ss -ltnp查 6379 是否已被 Redis、11211 是否被 Memcached 占用;用--port/--memcached_port换端口即可,客户端同步改连接串。
Q:重启后数据少了?内存库本来就只保内存中的数据,崩溃或重建会丢未落盘部分。配置snapshot_cron并挂载数据卷后,丢失窗口可压缩到最近一次快照之内。
Q:副本读明显滞后?看复制偏移与主节点写入速率,写压力大时副本必然有延迟。读多写少的工作负载放副本,对实时性敏感的业务仍走主节点。
【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考