资讯动态

如何完成 Dragonfly 集群的初始配置并用 DFLYCLUSTER CONFIG 下发槽位归属

发布时间:2026/9/12 20:29:04 来源:尧图企业网站定制
如何完成 Dragonfly 集群的初始配置并用 DFLYCLUSTER CONFIG 下发槽位归属【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly从零搭建 Dragonfly 集群时你会遇到一个具体问题节点之间不互相通信no gossip、也不共享任何状态所以新启动的节点并不知道“自己应该拥有哪些槽位”。集群拓扑必须由外部集群管理器cluster manager编排出一份 JSON再用一条DFLYCLUSTER CONFIG命令推送到每一个节点。在首次配置到达之前任何节点都不拥有槽位用户流量会被拒绝。本文基于仓库中的 docs/cluster-mode.md 与自带的集群管理脚本 tools/cluster_mgr.py演示如何完成一组--cluster_modeyes节点的初始槽位分配并验证槽位路由是否真正生效。集群状态下发机制先理解 DFLYCLUSTER CONFIG 的定位Dragonfly 集群是一组共同拥有 16384 个槽位[0, 16383]的节点。槽位归属被划分给各个 master 节点每个 master 可以有零个或多个 replica。关于初始配置有几条规则决定了操作顺序集群管理器是集群状态的唯一权威来源它把同一份 JSON推送到所有节点——master 和 replica 都要收到。replica 需要这份状态来通过-MOVED重定向客户端、并响应拓扑查询命令。节点在收到第一份DFLYCLUSTER CONFIG之前不拥有任何槽位数据面命令会被拒绝错误信息为-ERR Cluster is not yet configured。每次节点重启后都要重新推送当前配置每次拓扑变更后也必须先把新配置推到所有节点再编制下一份配置——否则未收到新配置的节点会用过期槽位归属应答客户端可能在互相矛盾的-MOVED之间来回跳转。DFLYCLUSTER是隐藏的 admin 命令。按 docs/cluster-mode.md 的说明它必须通过--admin_port配置的 admin listener 访问客户端监听端口会拒绝它而CLUSTER子命令SHARDS、SLOTS、NODES、MYID、KEYSLOT等是只读内省命令在任意监听端口都可用。准备条件无论走哪条路径每个节点都必须以真实集群模式启动dragonfly --port端口 --cluster_modeyes --admin_portadmin端口 [--cluster_node_idid] [--cluster_announce_ipip]--admin_port默认为0关闭真实集群模式--cluster_modeyes下需要配置DFLYCLUSTER和内部命令DFLYMIGRATE只在该监听端口上接受连接。--cluster_node_id指定节点身份必须与配置 JSON 里master.id/replicas[].id中嵌入的 id 一致不指定时使用 master replication id默认值。--cluster_announce_ip控制返回给客户端的 IP出现在CLUSTER SLOTS/SHARDS/NODES输出和MOVED回复中不指定时使用本地绑定地址。如果打算使用仓库自带的集群管理脚本还需要 Python 环境脚本头注释写明安装方式为pip install -r requirements.txt对应仓库中的 tools/requirements.txt脚本本身依赖redis等包pip install -r tools/requirements.txt主路径用 cluster_mgr.py 一次完成初始配置tools/cluster_mgr.py 是一个手工集群管理器Manual Cluster Manager支持本地和远程集群。它对每个动作create_locally、attach、move、migrate等的处理逻辑与上面描述的管理器职责一一对应发现节点身份CLUSTER MYID、建立复制REPLICAOF、生成槽位划分并推送DFLYCLUSTER CONFIG。副作用说明下一条命令会在本机启动若干个 Dragonfly 进程默认从 7001 端口起把日志写入/tmp/dfly.cluster.node.port.log并自动完成后续全部配置推送。需要本机已有 Dragonfly 可执行文件默认路径为../build-opt/dragonfly可用--dragonfly_bin指定实际路径cd tools ./cluster_mgr.py --actioncreate_locally --num_masters3 --replicas_per_master1参数说明均取自脚本--help参数默认值用途--num_masters3master 节点数量--replicas_per_master0每个 master 的 replica 数--first_port7001第一个 master 的端口后续节点依次递增--threads2每个节点的线程数--dragonfly_bin../build-opt/dragonflyDragonfly 可执行文件路径脚本会按 16384 除以 master 数均分槽位余数计入最后一个 master。上例3 个 master中三个槽位范围分别为0–5460、5461–10921、10922–16383。执行过程会依次打印集群规模信息、各节点 ID、replica 的REPLICAOF结果、生成的配置 JSON以及每个节点的下发结果形如- Push to 7001: ...。关于--admin_port的一个事实差异按 docs/cluster-mode.md 的说明DFLYCLUSTER应经由--admin_port配置的 admin listener 访问而create_locally的启动参数中并未包含--admin_port配置是直接经由节点主端口下发的。本地实验用工具路径以脚本实际行为为准当你手动管理远程节点时按文档要求带上--admin_port。可选分支向已有远程节点下发初始配置如果你的 Dragonfly 实例已经启动并初始化了--cluster_modeyes工具--help中的前置条件可以不走create_locally而是逐步搭建# 让一个已有节点成为拥有全部槽位的单节点集群目标默认为 127.0.0.1:6379 ./cluster_mgr.py --actionconfig_single_remote --target_hosthost --target_portport # 把新节点挂入已有集群master 形式不拥有槽位加 --attach_as_replicaTrue 则作为 target 的 replica ./cluster_mgr.py --actionattach --attach_hosthost --attach_portportconfig_single_remote会先探测目标节点若节点已有数据或已配置则中止脚本提示Node either not found or already configured。attach要求新节点已以 master或已指向 target 的 replica身份运行。对每个新节点重复执行attach后用下文介绍的--actionmove或--actionmigrate在节点间分配槽位。手动下发时必读配置 JSON 的结构与校验理解脚本替你做了什么就能在不用脚本的场景里手动下发。管理器的工作流程docs/cluster-mode.md §2.2是以--cluster_modeyes --admin_portp等参数启动每个节点在每个节点上执行CLUSTER MYID获取身份任意监听端口可用向每个计划中的 replica 发送REPLICAOF master_ip master_port通过DFLYCLUSTER CONFIG json把集群 JSON 推送到所有节点节点重启或拓扑变更后重新推送当前配置。JSON 是一个 shard 数组每个 shard 的字段要求如下摘自 docs/cluster-mode.md §4.1字段必填说明slot_ranges[].start/.end是闭区间0..16383start end同一 shard 内各范围互不重叠master.id是必须与该节点CLUSTER MYID的输出一致master.ip/master.port是广播给客户端并嵌入MOVED回复的端点master.health否online|loading|fail|hidden默认online过滤规则见 docs/cluster-node-health.mdreplicas[]是可为空数组仅描述性字段它本身不会让任何节点开始复制复制必须另行用REPLICAOF建立migrations[]否该 master 的出向槽位迁移用于迁移场景初始配置无需提供文档给出的完整示例文档示例id需替换为你实际CLUSTER MYID的输出ip/port替换为真实端点[ { slot_ranges: [ { start: 0, end: 8191 } ], master: { id: node-A, ip: 10.0.0.1, port: 7000, health: online // optional, default online }, replicas: [ { id: node-A-r1, ip: 10.0.0.2, port: 7000, health: loading } ], migrations: [ // optional; presence drives the migration state machine { node_id: node-B, ip: 10.0.0.3, port: 7000, // admin port of the target slot_ranges: [ { start: 4096, end: 8191 } ] } ] }, { slot_ranges: [ { start: 8192, end: 16383 } ], master: { id: node-B, ip: 10.0.0.3, port: 7000 }, replicas: [] } ]下发前节点会做校验出现以下任一情况即整份配置被拒绝回复-ERR Invalid cluster configuration.且节点保留原配置不变某个槽位被 0 个或 2 个以上 shard 拥有同一个节点 id 两次作为master或同一 master 的 replica 中 id 重复migrations[]条目指向迁移自身所在的源 shard或目标 id 不是本配置中的某个 master同一源 shard 对同一目标有两条migrations[]条目migrations[]的槽位范围为空、非法、超出源 shard 范围或与同源的其它迁移条目重叠。推送本身通过任意能发送多参数 RESP 命令的客户端完成cluster_mgr.py用 redis-py 的execute_command发送[dflycluster, config, json_str]其中json_str是序列化后的整份 JSON。验证槽位归属是否生效配置推送完成后按下面几项确认集群已按预期工作1. 查看各节点的槽位与拓扑。内省命令CLUSTER SHARDS/CLUSTER SLOTS/CLUSTER NODES在任意监听端口可用。也可以让脚本替你重建并打印当前配置默认连接127.0.0.1:6379用--target_host/--target_port覆盖./cluster_mgr.py --actionprint_config它连接目标节点执行CLUSTER SHARDS并把解析出的配置每个 shard 的slot_ranges、master、replicas打印为 JSON。输出示例文档示例来自 docs/cluster-node-health.md 对CLUSTER SHARDS的展示127.0.0.1:6379 CLUSTER SHARDS 1) 1) slots 2) 1) (integer) 0 2) (integer) 16383 3) nodes 4) 1) 1) id 2) node-master-1 3) endpoint 4) 10.0.0.1 5) ip 6) 10.0.0.1 7) port 8) (integer) 7000 9) role 10) master ...核对要点slots段覆盖0–16383且无遗漏nodes中各端点、role与你下发的配置一致。2. 验证槽位路由与 MOVED 重定向。先用CLUSTER KEYSLOT key计算某个 key 的槽位然后分别连接不同节点执行该 key 的读写在拥有该槽位的节点上执行命令应正常成功在不拥有该槽位的节点上执行节点会回复-MOVED slot ip:port端点是本地配置中该槽位的当前属主。客户端应刷新槽位映射CLUSTER SHARDS或CLUSTER SLOTS后重试。3. 用错误回复反查配置状态。三个有明确文档依据的判断信号现象含义数据面命令返回-ERR Cluster is not yet configured该节点尚未收到任何配置新启动节点的正常初始状态DFLYCLUSTER CONFIG返回-ERR Invalid cluster configuration.新配置被拒绝节点继续沿用旧配置在--cluster_mode未设为yes的节点上调用DFLYCLUSTER返回 cluster-disabled 错误说明该节点根本不是真实集群模式调整槽位分布move 与 migrate 的取舍初始配置完成后若需要把某段槽位划给另一个 master工具提供两个动作副作用差异很大# 只改配置、不迁移数据 ./cluster_mgr.py --actionmove --slot_start10 --slot_end20 --target_host目标master主机 --target_port目标master端口 # 带数据迁移的槽位搬迁 ./cluster_mgr.py --actionmigrate --slot_start10 --slot_end20 --target_host目标master主机 --target_port目标master端口--target_host/--target_port中的值替换为你希望接收槽位的那个 master 的主机与端口示例中的X是脚本--help原文的占位写法。两者的区别脚本帮助原文--actionmove不会迁移既有数据被移动槽位里的数据会被清除——只适合集群尚无数据或可以接受丢数据的场景--actionmigrate会把数据搬到新属主脚本先在源 shard 写入migrations[]条目并推送轮询DFLYCLUSTER SLOT-MIGRATION-STATUS直到状态变为FINISHED出现FATAL会直接报错退出最后推送收尾配置把槽位正式划给目标。迁移的状态机细节CONNECTING/SYNC/ERROR/FINISHED/FATAL状态、失败恢复表在 docs/cluster-mode.md §6–§7 有完整描述这里不再展开。限制与注意事项replicas[]不建立复制配置里的 replica 列表仅供CLUSTER NODES/SHARDS/SLOTS展示拓扑让一个节点真正开始复制必须由外部发REPLICAOF。真实集群模式的命令限制--cluster_modeyes存储为单 DBSELECT其它库索引被拒绝全局 pub/subPUBLISH/SUBSCRIBE/PSUBSCRIBE被拒绝跨槽路由的 sharded pub/subSPUBLISH/SSUBSCRIBE/SUNSUBSCRIBE可用跨多个槽位的多 key 命令、MULTI/EXEC块和 Lua 脚本会返回-CROSSSLOT。detach 的注意点--actiondetach移除节点后被摘除的节点不会收到新配置仍“以为”自己属于集群脚本建议 detach 后关闭该节点。--cluster_modeemulated不是本场景emulated 模式下单节点拥有全部 16384 个槽位且不提供DFLYCLUSTER它面向开发、迁移过渡和资源受限场景。实验集群用完后的清理./cluster_mgr.py --actionshutdown --target_portport。警告该命令会关闭集群所连接的全部 Dragonfly 服务端进程仅在确认这些节点都可以关闭时使用。完成上述步骤后你的集群已经处于 docs/cluster-mode.md 所描述的标准形态每个节点持有同一份配置槽位归属可通过CLUSTER SHARDS随时核对不属于本节点的 key 一律通过-MOVED重定向到属主节点。【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价