介绍
Pacemaker 是一个旨在处理 worker 心跳的 storm 守护进程. 随着 storm 的扩大, ZooKeeper 由于 worker 进行心跳的大量写入而开始成为瓶颈. 当 ZooKeeper 尝试维护一致性时, 会产生大量写入磁盘和跨网络的流量.
因为心跳是短暂的, 它们不需要被持久化到磁盘或跨节点同步; 会在内存�的存储中来做. 这是 Pacemaker 的作用. Pacemaker 作为一个简单的 key/value 存储, 具有类似 ZooKeeper 的目录样式键和字节数组值.
相应的 Pacemaker client 是 ClusterState
接口的插件 org.apache.storm.pacemaker.pacemaker_state_factory
. 心跳调用由漏斗 ClusterState
由生产 pacemaker_state_factory
到 Pacemaker 服务进程, 而另一 set/get 操作被转发到 ZooKeeper.
配置
pacemaker.host
: (已弃用) Pacemaker 守护程序正在运行的主机pacemaker.servers
: Pacemaker 守护程序正在运行的主机 - 这取代了pacemaker.host
pacemaker.port
: Pacemaker 监听端口pacemaker.max.threads
: Pacemaker 守护进程将用于处理请求的最大线程数.pacemaker.childopts
: 任何需要转到 Pacemaker 的 JVM 参数.(由 storm-deploy 项目使用)pacemaker.auth.method
: 使用的身份验证方法(以下更多信息)
示例
要使 Pacemaker 启动并运行, 请在所有节点上的集群配置中设置以下选项:
storm.cluster.state.store: "org.apache.storm.pacemaker.pacemaker_state_factory"
Pacemaker 服务器还需要在所有节点上设置:
pacemaker.servers:
- somehost.mycompany.com
- someotherhost.mycompany.com
pacemaker.host 配置仍适用于单个 pacemaker, 尽管它已被弃用.
pacemaker.host: single_pacemaker.mycompany.com
然后启动所有的守护进程(包括 Pacemaker):
$ storm pacemaker
Storm 集群现在应该通过 Pacemaker 来推动所有 worker 的心跳.
安全
目前支持摘要(基于密码)和 Kerberos 安全性. 安全性目前只在于读取而不是写入. 写入可以由任何人执行, 而读取只能由授权和认证的用户执行. 这是未来发展的一个领域, 因为它让群集开放给 DoS 攻击, 但它阻止任何敏感信息到达未经授权的眼睛, 这是主要目标.
Digest
要配置摘要身份验证, 请 pacemaker.auth.method: DIGEST
在集群配置中设置托管 Nimbus 和 Pacemaker 的节点. 节点也必须 java.security.auth.login.config
设置为指向包含以下结构的 JAAS 配置文件:
PacemakerDigest {
username="some username"
password="some password";
};
配置了这些设置的任何节点将能够从 Pacemaker 中读取. Worker 节点不需要设置这些配置, 并且可以保留 pacemaker.auth.method: NONE
设置, 因为它们不需要从 Pacemaker 守护进程读取.
Kerberos
要配置Kerberos身份验证, 请 pacemaker.auth.method: KERBEROS
在主机 Nimbus 和 Pacemaker 的节点上的集群配置中进行设置. 节点也必须 java.security.auth.login.config
设置为指向 JAAS 配置.
Nimbus 上的 JAAS 配置必须看起来像这样:
PacemakerClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/etc/keytabs/nimbus.keytab"
storeKey=true
useTicketCache=false
serviceName="pacemaker"
principal="nimbus@MY.COMPANY.COM";
};
Pacemaker 上的 JAAS 配置必须如下所示:
PacemakerServer {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/etc/keytabs/pacemaker.keytab"
storeKey=true
useTicketCache=false
principal="pacemaker@MY.COMPANY.COM";
};
- Nimbus 主机上
PacemakerClient
部分中的客户端用户主体必须与 Storm 集群上的nimbus.daemon.user
配置值相匹配. - 在, 客户端的
serviceName
值必须与 Pacemaker主机上PacemakerServer
部分的服务器的用户主体相匹配.
容错
Pacemaker 作为单个守护进程运行, 使其成为潜在的单点故障.
如果 Pacemaker 由 Nimbus 无法通过崩溃或网络分区, worker 将继续运行, Nimbus 将重复尝试重新连接. Nimbus 的功能将受到干扰, 但 topology 本身将继续运行. 如果 Nimbus 和 Pacemaker 位于分区同一侧的集群分区, 分区另一侧的 worker 将无法心跳, Nimbus 将重新安排其他任务. 这可能是我们想要发生的事情.
ZooKeeper 比较
与 ZooKeeper 相比, Pacemaker 使用更少的 CPU, 更少的内存, 当然也没有磁盘用于相同的负载, 这是由于缺乏维护节点之间的一致性的开销. 在千兆网络上, 有6000个节点的理论限制.然而, 实际限制可能在2000-3000节点之间.这些限制还没有被测试. 在拥有 topology 结构的270个管理员集群中, Pacemaker 的资源利用率是一个核心的70%, 在具有4个 Intel(R) Xeon(R) CPU E5530 @ 2.40GHz
和 24GiB RAM 的机器上的近 1GiB 的 RAM.
Pacemaker 在支持 HA.多个 Pacemaker 实例可以在 Storm 群集中一次使用, 以实现大规模的可扩展性. 只需将 Pacemaker 主机的名称包含在 pacemaker.servers 配置中, worker 和 Nimbus 将开始与他们进行通信. 他们也是容错的.只要至少有一个 Pacemaker 运行, 系统就会继续工作 - 只要它可以处理负载.