分布式小技巧
欢迎你来读这篇博客,这篇博客主要是关于分布式小技巧。
其中包括了关于我的见解和收集的知识分享。
序言
正文
一致性 Hash 问题
hash 问题
- 雪崩效应:微小的改变,散列后不可区分性的改变
- 严格雪崩准则
hash 冲突解决
- 开放寻址
- 拉链法
分布式场景 hash 的价值
- 负载均衡
- 分布式存储
普通 hash 算法的问题:当一个节点宕机后,之前的 hash 都要重新计算,缩容和扩容都会有这种问题,用户的会话都会丢失,大量请求的情况下,大量的用户体验不佳
一致性 Hash
- hash 槽成环,每个服务器负责一段
- 虚拟节点,每个服务器负责多个虚拟节点
nginx 一致性 hash
- https://github.com/replay/ngx_http_consistent_hash
- 下载第三方模块
- 编译第三方模块,添加到被 nginx 管理
- nginx 重新编译安装
- 修改配置文件
集群时钟同步问题
在集群环境中,各服务器时钟的一致性是保障系统正常运行的关键基础。若服务器间时钟不同步,可能导致日志时序混乱、分布式事务异常、任务调度错误等一系列问题,影响集群整体协同工作效率。
- 目标
- 确保集群内所有服务器时间高度一致(偏差控制在合理阈值内)
- 保障时钟同步系统的高可靠性和稳定性
- 实现时钟同步的自动化管理与监控
优化方案设计
3.1 分层级时钟同步架构
3.1.1 核心层(主时钟服务器)
- 部署 2-3 台主时钟服务器(避免单点故障)
- 通过不同网络线路与多个权威时间源同步:
- 国家授时中心服务器
- 公共 NTP 服务器(如 ntp.aliyun.com、cn.pool.ntp.org 等)
- 主时钟服务器之间相互同步,形成内部时间共识
3.1.2 区域层(二级时钟服务器)
- 按集群功能区域划分二级时钟节点
- 每个区域内所有业务服务器提供时间同步服务
- 定期向核心层主时钟服务器同步时间
3.1.3 节点层(业务服务器)
- 所有业务服务器根据所属区域,向对应的区域的二级时钟服务器同步时间
- 保持与集群时间基准的一致性
3.2 同步机制与技术实现
- 协议选择:采用 NTPv4 协议进行高精度时间同步
- 同步频率:
- 核心层:15-30 分钟同步一次
- 区域层:30-60 分钟同步一次
- 节点层:1-2 小时同步一次
- 精度控制:全网时间偏差控制在 ≤ 100ms
3.3 监控与告警体系
- 部署专门的时间监控系统,实时检测各节点时间状态
- 设置多级告警阈值:
- 警告阈值:时间偏差 > 50ms
- 严重阈值:时间偏差 > 100ms
- 告警方式:系统告警、邮件通知、短信提醒
- 日志记录:详细记录每次同步时间、偏差值、成功 / 失败状态
3.4 容错与应急处理
- 自动切换机制:主时钟服务器异常时,自动切换至备用节点
- 本地缓存策略:各服务器配置本地时钟缓存,通信中断时可维持时间准确性
- 手动校准流程:制定标准化手动校准操作手册,供应急场景使用
- 网络容错:主备时钟服务器使用不同网络路径,避免单点网络故障
3.5 自动化运维支持
- 使用 Ansible 等配置管理工具批量部署和更新时钟同步配置
- 集成到 CI/CD 流程,新加入集群的服务器自动完成时钟同步配置
- 定期生成时钟同步状态报告,分析同步质量和潜在问题
- 自动化校验机制,定期检测同步配置有效性
4. 实施步骤
- 部署核心层主时钟服务器并配置与权威时间源的同步
- 配置主时钟服务器之间的相互同步机制
- 部署区域层二级时钟服务器并配置与核心层的同步
- 批量配置所有业务服务器与对应区域时钟服务器的同步
- 部署监控系统并配置告警阈值
- 制定运维手册和应急处理流程
- 进行全面测试与优化
5. 预期效果
- 集群内所有服务器时间偏差控制在 100ms 以内
- 时钟同步系统可用性达到 99.99%
- 实现时钟异常的快速发现与自动恢复
- 降低人工运维成本,提高集群整体可靠性
分布式 ID
- UUID
- UUID 有多种,常见的是 UUIDv4,乱序的
- 目前数据库 DB 常用 UUIDv7 做主键
- 独立数据库自增 ID
- 类似发号器
- 雪花算法
- 基于 Redis 的 Incr 获取全局唯一 id
分布式任务调度
- Elastic-job
- xxl-job
Session 共享
- IP-hash,会话沾滞
- Session 复制
- 基于 redis 去做分布式 session 共享
- 现在基本上都是无 session 了
参考资料
启示录
富贵岂由人,时会高志须酬。
能成功于千载者,必以近察远。
分布式小技巧
https://allendericdalexander.github.io/2025/04/01/distributed_trick/