# Pacemaker
### 介紹
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 運行, 系統就會繼續工作 - 只要它可以處理負載.
- Storm 基礎
- 概念
- Scheduler(調度器)
- Configuration
- Guaranteeing Message Processing
- 守護進程容錯
- 命令行客戶端
- Storm UI REST API
- 理解 Storm Topology 的 Parallelism(并行度)
- FAQ
- Layers on Top of Storm
- Storm Trident
- Trident 教程
- Trident API 綜述
- Trident State
- Trident Spouts
- Trident RAS API
- Storm SQL
- Storm SQL 集成
- Storm SQL 示例
- Storm SQL 語言參考
- Storm SQL 內部實現
- Flux
- Storm 安裝和部署
- 設置Storm集群
- 本地模式
- 疑難解答
- 在生產集群上運行 Topology
- Maven
- 安全地運行 Apache Storm
- CGroup Enforcement
- Pacemaker
- 資源感知調度器 (Resource Aware Scheduler)
- 用于分析 Storm 的各種內部行為的 Metrics
- Windows 用戶指南
- Storm 中級
- 序列化
- 常見 Topology 模式
- Clojure DSL
- 使用沒有jvm的語言編輯storm
- Distributed RPC
- Transactional Topologies
- Hooks
- Storm Metrics
- Storm 狀態管理
- Windowing Support in Core Storm
- Joining Streams in Storm Core
- Storm Distributed Cache API
- Storm 調試
- 動態日志級別設置
- Storm Logs
- 動態員工分析
- 拓撲事件檢查器
- Storm 與外部系統, 以及其它庫的集成
- Storm Kafka Integration
- Storm Kafka 集成(0.10.x+)
- Storm HBase Integration
- Storm HDFS Integration
- Storm Hive 集成
- Storm Solr 集成
- Storm Cassandra 集成
- Storm JDBC 集成
- Storm JMS 集成
- Storm Redis 集成
- Azue Event Hubs 集成
- Storm Elasticsearch 集成
- Storm MQTT(Message Queuing Telemetry Transport, 消息隊列遙測傳輸) 集成
- Storm MongoDB 集成
- Storm OpenTSDB 集成
- Storm Kinesis 集成
- Storm Druid 集成
- Storm and Kestrel
- Container, Resource Management System Integration
- Storm 高級
- 針對 Storm 定義一個不是 JVM 的 DSL
- 多語言協議
- Storm 內部實現
- 翻譯進度