0%

storm核心概念与架构详解

Storm 作为一款高性能的实时计算框架,在实时数据处理领域有着广泛的应用。本文将基于已有内容,对 Storm 的核心概念、架构设计及流处理机制进行更深入的解析,帮助读者全面理解 Storm 的工作原理。

Storm 架构深度解析

Storm 集群采用主从架构设计,通过清晰的角色分工实现高效的实时数据处理。

管理节点(Master Node)

管理节点上运行的 Nimbus 进程是整个 Storm 集群的 “大脑”,主要承担以下核心职责:

  • 代码分发:将用户提交的 Topology 代码分发到集群中的所有工作节点
  • 任务分配:根据集群资源状况和 Topology 配置,将任务合理分配给各个工作节点
  • 集群监控:实时监控集群中所有节点和任务的运行状态,当发现异常时尝试重新分配任务
  • 资源调度:动态管理集群资源,确保计算资源的高效利用

Nimbus 本身是无状态的,其所有决策所需的元数据都存储在 ZooKeeper 中,这使得 Nimbus 具备良好的容错性 —— 即使 Nimbus 进程重启,也能从 ZooKeeper 中恢复集群状态。

工作节点(Worker Node)

工作节点上的 Supervisor 进程负责具体任务的执行管理,主要功能包括:

  • 任务生命周期管理:接收 Nimbus 分配的任务,启动或关闭相应的工作进程(Worker Process)
  • 资源隔离:通过配置限制每个节点上运行的工作进程数量,实现资源隔离
  • 状态汇报:向 Nimbus 汇报本节点的任务执行状态

每个工作进程(Worker Process)会运行一个或多个 Executor(线程),而每个 Executor 负责执行一个或多个 Task(具体计算逻辑单元)。这种多级结构使得 Storm 能够灵活地进行并行计算。

协调机制

Nimbus 和 Supervisor 之间不直接通信,所有协调工作均通过 ZooKeeper 完成:

  • ZooKeeper 存储了集群的元数据、任务分配信息和节点状态
  • Nimbus 通过监听 ZooKeeper 的节点变化获取集群状态
  • Supervisor 通过 ZooKeeper 接收任务分配并汇报执行状态
阅读全文 »

Linux 文件类型详解:五大类文件的特性与识别

Linux 系统中的文件不仅包含普通文本或二进制数据,还涵盖了目录、设备、链接等特殊类型。理解这些文件类型的特性和用途,是高效管理 Linux 系统的基础。本文将详细介绍 Linux 支持的五种主要文件类型,包括它们的特点、用途及识别方法。

普通文件(Regular File)

定义:存储实际数据(文本、图片、程序等)的文件,是最常见的文件类型。

特性

  • 包含用户可读写的数据,如文档、代码、二进制程序等。
  • 不包含文件系统的元数据(如目录结构)。
  • 可通过文本编辑器(如 vim)或程序打开。

常见类型

  • 文本文件:如 .txt.sh(脚本)、.conf(配置),内容为 ASCII 或 Unicode 字符。
  • 二进制文件:如可执行程序(/bin/ls)、图片(.png)、压缩包(.tar.gz),内容为二进制数据。
  • 数据文件:如数据库文件、日志文件(.log)。

识别方式

  • 通过ls -l查看时,文件名前的第一个字符为-(减号):

    1
    ls -l test.txt  # 输出:-rw-r--r-- 1 user user 123 Oct 1 10:00 test.txt
  • 通过file命令判断具体类型:

    1
    file test.sh  # 输出:test.sh: Bourne-Again shell script, ASCII text executable

目录(Directory)

定义:用于组织和存储其他文件或子目录的特殊文件,相当于 Windows 的 “文件夹”。

特性

  • 包含文件名与 inode 的映射关系(即目录项),而非实际数据。
  • 每个目录默认包含 .(当前目录)和 ..(父目录)两个特殊项。
  • 目录的权限控制用户是否能进入(x 权限)或查看其中的文件(r 权限)。

常见目录

  • 系统目录:如 /etc(配置文件)、/home(用户主目录)、/var(可变数据)。
  • 用户创建的目录:如 Documents/Projects/

识别方式

阅读全文 »

Linux alias 别名:简化命令操作的实用技巧

在 Linux 系统中,alias 命令允许用户为常用命令或复杂指令设置简短别名,大幅提升操作效率。本文将详细介绍别名的创建、管理和持久化方法,帮助你通过自定义别名简化日常工作。

alias 基本用法:创建与查看别名

创建别名

alias 命令的基本格式为:

1
alias 别名='原始命令'
示例:常用别名设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 为 ls -l 设置别名 ll(最常用的别名之一)
alias ll='ls -l'

# 为 ls -la 设置别名 la(显示所有文件,包括隐藏文件)
alias la='ls -la'

# 为清除屏幕命令设置别名 cls(类似 Windows 的 cls)
alias cls='clear'

# 为目录切换命令设置别名(快速进入常用目录)
alias cdh='cd /home/user'
alias cdd='cd /data/documents'

# 为带参数的复杂命令设置别名(如强制删除并显示详细信息)
alias rm='rm -v' # 删除时显示被删除的文件
alias rmf='rm -rf' # 强制删除目录(谨慎使用)
阅读全文 »

Paxos 协议:分布式一致性的经典解决方案

在分布式系统中,多个节点通过消息传递协同工作时,如何就某个值达成一致(如数据更新、主节点选举)是核心挑战。Paxos 协议是解决这一问题的经典算法,由 Leslie Lamport 提出,其设计目标是在节点可能崩溃(但不会恶意篡改消息)的情况下,保证分布式系统的一致性。

Paxos 的核心背景与前提

问题定义

分布式系统中,节点可能因网络延迟、崩溃等原因导致状态不一致。Paxos 协议需解决的问题是:让所有节点对某个 “提议”(如一条日志、一个决策)达成一致,即使部分节点故障,最终仍能确定一个唯一的结果

前提假设(非拜占庭环境)

Paxos 协议不解决 “拜占庭将军问题”(节点恶意发送虚假消息),其前提是:

  • 节点故障为 “崩溃 - 恢复” 模式(崩溃后可重启,不会篡改数据);
  • 消息可能丢失、延迟,但不会被篡改或伪造。

核心角色

Paxos 协议中,节点被划分为三种角色(同一节点可同时承担多个角色):

角色 功能描述
Proposer(提议者) 提出 “提议”(Proposal),每个提议包含一个唯一编号(Proposal ID)和提议值(Value)。
Acceptor(接受者) 接收并判断提议,决定是否接受。只有当提议被多数 Acceptor 接受时,该提议才算 “通过”。
Learner(学习者) 不参与提议过程,仅学习已通过的提议,同步最终一致的结果(如从 Acceptor 获取通过的提议)。

协议执行过程

Paxos 协议通过 “准备(Prepare)” 和 “批准(Accept)” 两个阶段,确保最终只有一个提议被通过,且所有节点对此达成一致。

阶段一:准备阶段(Prepare Phase)

Proposer 发起提议前,需先确认自身提议的编号足够大,避免与其他提议冲突。

  1. Proposer 动作
    • 选择一个全局唯一的提议编号 n(编号需递增,确保后续提议编号更大);
    • 向所有 Acceptor 发送 Prepare(n) 消息,请求确认是否可以用编号 n 发起提议。
  2. Acceptor 动作
    • 维护两个状态:max_n(已响应的最大提议编号)、accepted_n(已接受的提议编号)、accepted_v(已接受的提议值);
    • 若收到的n > max_n:
      • 更新 max_n = n,承诺不再响应编号小于 n 的提议;
      • 回复 Promise(n, accepted_n, accepted_v) 消息,告知 Proposer 自己已接受的提议(若有);
    • n <= max_n:忽略该消息(遵守之前的承诺)。

阶段二:批准阶段(Accept Phase)

Proposer 收到多数 Acceptor 的 Promise 响应后,进入批准阶段,确定最终提议值并请求 Acceptor 接受。

  1. Proposer 动作
    • 若多数 Acceptor 回复了Promise:
      • 检查响应中是否有已接受的提议(accepted_v)。若有,选择其中编号最大的 accepted_v 作为本次提议值;
      • 若没有已接受的提议,Proposer 自行决定提议值 v
    • 向所有 Acceptor 发送 Accept(n, v) 消息,请求接受编号为 n、值为 v 的提议。
  2. Acceptor 动作
    • 若收到的n >= max_n(不违背之前的承诺):
      • 接受该提议,更新 accepted_n = naccepted_v = v
      • 回复 Accepted(n, v) 消息,确认接受;
    • n < max_n:忽略该消息。

阶段三:学习阶段(Learn Phase)

当一个提议被多数 Acceptor 接受(即收到多数 Accepted 响应),该提议正式 “通过”。

  • Proposer 向所有 Learner 广播通过的提议(n, v);
  • Learner 接收并记录该提议,最终所有节点均同步为一致的值 v

关键机制:避免冲突与活锁

1. 提议编号的唯一性与递增性

  • 每个 Proposer 的提议编号必须全局唯一(可通过 “节点 ID + 自增序号” 生成,如 n = 节点ID * 1000 + 序号);
  • 编号需严格递增,确保新提议不会被旧提议的承诺阻塞,保证协议能推进。

2. 解决活锁问题

若多个 Proposer 同时发起提议,可能导致彼此的提议编号相互覆盖,陷入 “提议 - 被拒 - 再提议” 的循环(活锁)。

  • 解决方案:选举一个唯一的 “Leader Proposer”,所有提议由 Leader 发起。Leader 崩溃后重新选举,避免多 Proposer 竞争。

与两阶段提交(2PC)的对比

特性 Paxos 协议 两阶段提交(2PC)
核心目标 解决多个节点对 “单一值” 的一致性问题 解决跨节点事务的原子性(全提交或全回滚)
适用场景 分布式日志同步、主节点选举等 分布式事务(如跨库转账)
容错性 允许少数节点故障,仍能达成一致 协调者故障可能导致阻塞
复杂性 较高(多阶段协商,需处理冲突) 较低(固定两阶段流程)

实际应用

Paxos 协议是分布式系统一致性的基础,许多主流技术均基于其思想实现:

  • ZooKeeper:使用简化版的 Zab 协议(基于 Paxos 思想)实现集群数据一致性;
  • Google Chubby:分布式锁服务,核心一致性算法基于 Paxos;
  • MySQL Group Replication:通过 Paxos 保证多节点数据同步

两阶段提交协议(2PC):分布式事务的经典解决方案

在分布式系统中,确保跨多个节点的事务原子性(要么全成功,要么全失败)是核心挑战。两阶段提交协议(Two-phase Commit,2PC)是实现分布式事务的经典方案,通过 “准备” 与 “提交” 两个阶段协调所有参与者,保证数据一致性。

核心角色与目标

1. 角色划分

  • 协调者(Coordinator):全局事务的管理者,负责发起事务、收集参与者反馈、最终决定提交或回滚。
  • 参与者(Participants):分布式事务的执行者(如数据库节点、服务实例),负责执行本地事务,并响应协调者的指令。

2. 核心目标

保证跨节点事务的 ACID 特性,尤其是原子性(Atomicity):所有参与者要么都提交事务,要么都回滚,避免出现部分节点成功、部分节点失败的不一致状态。

执行流程

两阶段提交协议通过 “准备阶段” 和 “提交阶段” 分步骤完成分布式事务,具体流程如下:

阶段一:准备阶段(Vote Phase)

协调者向所有参与者发起 “准备提交” 请求,参与者执行本地事务但不提交,反馈执行结果。

阅读全文 »