Redis Cluster 按分配给各分片的哈希槽路由整个键。

Redis Cluster 把键分到不同的槽位

Redis Cluster 把键的落点与机器身份分成两层:键先映射到一万六千三百八十四个固定槽之一,再由集群元数据描述各槽的主节点和副本。增加机器不会改变槽哈希函数,运维需要重新分配槽,客户端则发现当前拓扑并处理路由变化。槽、分片、主节点与副本不是可以相互替代的概念。 键选择槽,不要求机器持有连续区间 普通映射使用键的 CRC16/XMODEM 值对一万六千三百八十四取模。如果第一个左花括号与其后第一个右花括号之间存在非空标签,则只哈希这部分。例如 profile:{42} 和 quota:{42} 的完整键名不同,却位于同一个槽。标签只是数据放置规则,不是权限控制或租户隔离机制。 一个主节点可以拥有多个不连续的槽段。拓扑稳定时,一个槽有权威主节点;整个键属于该槽,大 hash 或有序集合不会被自动拆到多台机器。CLUSTER SHARDS 能显示分片成员及其槽段。尤其不能把“同一主节点”误当成“同一个槽”:前者是当前机器分配关系,后者才是多键操作需要的条件。 客户端也参与路由 支持集群的客户端维护槽映射,并连接拓扑中公布的节点。访问错误的主节点可能收到带目标地址的 MOVED,而不是得到键不存在。MOVED 要求更新路由;ASK 是迁移期间的临时重定向,需要先向目标发送 ASKING 再发送被重定向的命令,不能因此把该槽永久改归目标节点。 迁移也不是所有参与方瞬间同步更新地图。不同客户端可能暂时持有不同拓扑,多键涉及的数据在迁移期间分散到两端时,还可能得到 TRYAGAIN。应使用维护中的集群客户端,不能假设随便连一个入口就会自动代理所有命令。公布的地址不仅要让 Redis 节点互相可达,也必须能从应用所在网络访问。 放置关系不等于事务范围 MSET 这类服务端多键命令要求所有键属于同一个槽,仅仅处在同一物理主节点上仍不够。哈希标签可以满足同槽条件,但把所有租户都放进同一个标签又会集中负载,削弱分布能力。某个客户端方法如果拆成多个独立命令执行,也不能被当成一个原子的多键命令。 分片分配数据归属,复制则为一个分片提供副本。复制是异步的,所以副本读取可能落后。故障转移提升的是受影响分片的副本,并不是把整个集群作为不可分割的一组一起切换。发生故障时仍可能丢失已经确认的写入;连接中断也可能让调用者无法确定某条写操作最终有没有执行。 坏掉的样子 槽覆盖不完整或可达主节点不足,都可能阻止服务。在 cluster-require-full-coverage yes 下,一个分片不可用会使其他仍健康的主节点也拒绝键命令。三个没有副本的主节点能够展示数据分布,却没有能力从根本不存在的副本中恢复故障节点的数据,不能据此宣布已经具备高可用。 应一起检查槽覆盖、集群状态、副本健康、地址通告和客户端重定向错误。只增加节点不会自动搬迁已有数据,也不会自动拆开单个热键;重新分片、副本放置与客户端重试语义分别需要设计。应测试准备容忍的具体故障,而不是把节点握手成功当成高可用验收结果。 快速验证 准备 POSIX 环境、C 编译器、make、curl、tar 和 Python 3.10 以上版本。实验已在 macOS、Redis 8.10.1、redis-py 8.1.0、Python 3.14.4 上运行。下面仅用 libc 构建 Redis 核心,并在临时虚拟环境中安装客户端,不修改系统级安装。 ...

十一月 26, 2027 · 4 分钟 · XB Field Notes
两个命名空间共享节点容量,但对象名称、API 权限与配额判断分别受到明确规则约束。

命名空间划分对象范围,其他边界需要政策

命名空间为 Kubernetes 集群中的许多对象限定范围。两个团队都可以创建名为 settings 的 ConfigMap,因为包含命名空间后的完整身份不同。这种组织边界很有价值,但不会自动提供网络隔离、独立内核、专属节点容量或完整租户隔离。工作负载实际需要哪一种保障,就应确认额外由什么政策和执行机制落实,而不是把它们都归因于命名空间。 名称范围取决于资源类型 Pod、Service、ConfigMap 和许多工作负载控制器属于命名空间资源。Node、命名空间本身以及其他集群级资源,则不会因为客户端指定了某个命名空间,就被划分成另一份独立副本。应查看具体资源的 API 范围,不能假定所有对象都住在某个房间里面。命名空间也不是由独立子集群构成的嵌套层级。 在 Pod 内部,服务短名称通常按所在命名空间解析。带限定的名称可以指向别处,例如默认集群域下的 api.other.svc.cluster.local。这种约定负责定位目的地址,并不决定允许还是拒绝连接。集群域也可以另行配置,因此示例中的后缀不是所有安装都必须采用的常量。诊断 DNS 时需要结合实际域和工作负载所在位置。 自动化中的命名空间选择应保持明确。对象名称即使正确,如果当前活动命名空间错误,仍然会访问另一个资源。尤其是修改操作,应有意指定 kubeconfig、上下文和命名空间,而不是依赖操作者终端之前留下的状态。对象范围让身份更清楚,但具有广泛权限的管理员依然能够跨范围修改内容,不能因此省略权限审查。 坏掉的样子 没有适用网络政策的命名空间,仍然按照集群网络本身的行为保持连通。仅创建命名空间,或在 DNS 中加入它的名称,并不会拒绝其他 Pod。网络隔离需要正确的政策,以及真正执行这些政策的网络实现。应用认证还是另一层:域名能解析,只说明找到了地址,并不能证明某个调用者应该获准读取返回内容。 RBAC 则单独控制 API 操作。一个 RoleBinding 可以让账号读取本命名空间的 ConfigMap,而不给它读取其他范围的能力。但权限是叠加的,另一个广泛绑定仍可能授予更多访问。应以目标身份实际验证允许和拒绝的请求,不能认为添加一份较小角色,就自动取消先前更大的授权。网络流量政策也不会代替这一层 API 权限。 ResourceQuota 主要在准入阶段约束对象数量,以及汇总的资源请求或限制等指标。它本身不会节流正在运行的进程,也不会预留物理节点容量。LimitRange 可以为新接纳的工作负载提供默认值和边界,运行时资源限制则由其他机制执行。这些政策都需要明确配置;只有一个命名空间,并不能让会争抢共享资源的邻居自动变得无害。 快速验证 准备使用默认 cluster.local 域的临时 Kubernetes 集群,确保 kubectl 管理员能够执行测试 impersonation,节点已有 python:3.11-slim-bookworm 镜像。把代码保存为 namespaces.py,执行 python3 namespaces.py KUBECONFIG_PATH CONTEXT,明确传入测试配置。实测集群是 Kubernetes 1.34.11,采用 kind 网络。脚本创建两个唯一命名空间,并在结束后删除两者。 ...

八月 25, 2027 · 4 分钟 · XB Field Notes