NiFi叢集架
NiFi採用Zero-Master Clustering範例。叢集中的每個節點對資料執行相同的任務,但每個節點都在不同的資料集上執行。其中一個節點自動選擇(通過Apache ZooKeeper)作為叢集協調器。然後,群集中的所有節點都會向此節點傳送心跳/狀態資訊,並且此節點負責斷開在一段時間內未報告任何心跳狀態的節點。此外,當新節點選擇加入群集時,新節點必須首先連線到當前選定的群集協調器,以獲取最新流。如果群集協調器確定允許該節點加入(基於其配置的防火牆檔案),則將當前流提供給該節點,並且該節點能夠加入群集,假設節點的流副本與群集協調器提供的副本匹配。如果節點的流配置版本與群集協調器的版本不同,則該節點將不會加入群集。
NiFi預設埠及conf/nifi.properties
檔案中相應屬性
功能 | 屬性 | 預設值 |
---|---|---|
HTTP埠 | nifi.web.http.port | 8080 |
HTTPS埠* | nifi.web.https.port | 9443 |
遠端輸入套接字埠* | nifi.remote.input.socket.port | 10443 |
叢集節點協議埠* | nifi.cluster.node.protocol.port | 11443 |
叢集節點負載均衡埠 | nifi.cluster.node.load.balance.port | 6342 |
Web HTTP轉發埠 | nifi.web.http.port.forwarding |
標有星號(*)的埠的屬性值在conf/nifi.properties
中預設為空白
嵌入式Zookeeper
功能 | 屬性 | 預設值 |
---|---|---|
Zookeeper客戶端埠 | clientPort | 2181 |
Zookeeper伺服器仲裁和Leader選舉埠 | server.1 |
叢集搭建
參考文件:
本次演示為三節點
- 10.200.0.11(nifi-01)
- 10.200.0.12(nifi-02)
- 10.200.0.13(nifi-03)
本地使用包:Orack JDK 1.8.231 、NiFi 1.9.2
環境配置
- 上傳nifi及jdk包至每臺伺服器的
/tmp/nifi_install
路徑下 - 在所有伺服器新增host解析
# cat >> /etc/hosts << EOF > 10.200.0.11 nifi-01 > 10.200.0.12 nifi-02 > 10.200.0.13 nifi-03 > EOF 複製程式碼
部署
- 建立部署路徑
# mkdir -p /data/nifi 複製程式碼
- 解壓NiFi與JDK
# tar -zxvf /tmp/nifi_install/nifi-1.9.2-bin.tar.gz -C /data/nifi/ # tar -zxvf /tmp/nifi_install/jdk-8u231-linux-x64.tar.gz -C /data/nifi/ 複製程式碼
- 在NiFi配置檔案
conf/nifi-env.sh
中新增JAVA_HOME
值,指定為我們上傳的JDK# sed -i "21iexport JAVA_HOME=/data/nifi/jdk1.8.0_231/" /data/nifi/nifi-1.9.2/bin/nifi-env.sh 複製程式碼
配置Zookeeper
注:NiFi有整合的Zookeeper, 可以不在單獨安裝, 而是通過NiFi配置啟用內建Zookeeper服務
編輯conf/zookeeper.properties
# vim /data/nifi/nifi-1.9.2/conf/zookeeper.properties
複製程式碼
在檔案中新增server值
# zookeeper埠
clientPort=2181
initLimit=10
autopurge.purgeInterval=24
syncLimit=5
tickTime=2000
dataDir=./state/zookeeper
autopurge.snapRetainCount=30
# 新增nifi叢集嵌入的zookeeper地址
server.1=nifi-01:2888:3888
server.2=nifi-02:2888:3888
server.3=nifi-03:2888:3888
複製程式碼
注:server.1 中的數字1為伺服器的ID,需要與myid檔案中的id一致,下一步將配置myid
配置myid
在每個例項中新建資料夾${NIFI_HOME}/state/zookeeper
,並在此資料夾中新建檔案myid
,且輸入內容為1
(請根據上述conf/zookeeper.properties
中server.
配置)
注意:每臺伺服器上配置myid不同,請根據server.N
填寫
# mkdir -p /data/nifi/nifi-1.9.2/state/zookeeper
# echo 1 > /data/nifi/nifi-1.9.2/state/zookeeper/myid
複製程式碼
修改nifi配置
編輯conf/nifi.properties
檔案
# vim /data/nifi/nifi-1.9.2/conf/nifi.properties
複製程式碼
修改內容如下(已省略部分配置說明)
...
####################
# State Management #
####################
nifi.state.management.configuration.file=./conf/state-management.xml
nifi.state.management.provider.local=local-provider
nifi.state.management.provider.cluster=zk-provider
# 指定此NiFi例項是否應執行嵌入式ZooKeeper伺服器,預設是false
nifi.state.management.embedded.zookeeper.start=true
nifi.state.management.embedded.zookeeper.properties=./conf/zookeeper.properties
...
# web properties #
nifi.web.war.directory=./lib
# HTTP主機,當前nifi安裝伺服器IP。預設為空白
nifi.web.http.host=nifi-01
# HTTP埠。預設值為8080
nifi.web.http.port=8080
nifi.web.http.network.interface.default=
nifi.web.https.host=
nifi.web.https.port=
nifi.web.https.network.interface.default=
nifi.web.jetty.working.directory=./work/jetty
nifi.web.jetty.threads=200
nifi.web.max.header.size=16 KB
nifi.web.proxy.context.path=
nifi.web.proxy.host=
...
# cluster node properties (only configure for cluster nodes)
# 如果例項是群集中的節點,請將此設定為true。預設值為false
nifi.cluster.is.node=true
# 節點的完全限定地址,當前nifi安裝伺服器IP。預設為空白
nifi.cluster.node.address=nifi-01
# 節點的協議埠。預設為空白
nifi.cluster.node.protocol.port=28001
nifi.cluster.node.protocol.threads=10
nifi.cluster.node.protocol.max.threads=50
nifi.cluster.node.event.history.size=25
nifi.cluster.node.connection.timeout=5 sec
nifi.cluster.node.read.timeout=5 sec
nifi.cluster.node.max.concurrent.requests=100
nifi.cluster.firewall.file=
# 指定在選擇Flow作為“正確”流之前等待的時間量。
# 如果已投票的節點數等於nifi.cluster.flow.election.max.candidates屬性指定的數量,
# 則群集將不會等待這麼長時間。預設值為5 mins
nifi.cluster.flow.election.max.wait.time=1 mins
nifi.cluster.flow.election.max.candidates=
...
# zookeeper properties, used for cluster management #
# 連線到Apache ZooKeeper所需的連線字串。這是一個以逗號分隔的hostname:port對列表
nifi.zookeeper.connect.string=nifi-01:2181,nifi-02:2181,nifi-03:2181
nifi.zookeeper.connect.timeout=3 secs
nifi.zookeeper.session.timeout=3 secs
nifi.zookeeper.root.node=/nifi
複製程式碼
修改state-management
編輯conf/state-management.xml
檔案
# vim /data/nifi/nifi-1.9.2/conf/state-management.xml
複製程式碼
內容如下
<cluster-provider>
<id>zk-provider</id>
<class>org.apache.nifi.controller.state.providers.zookeeper.ZooKeeperStateProvider</class>
<!-->配置為nifi節點的ip加zookeeper埠號,以逗號分隔<-->
<property name="Connect String">nifi-01:2181,nifi-02:2181,nifi-03:2181</property>
<property name="Root Node">/nifi</property>
<property name="Session Timeout">10 seconds</property>
<property name="Access Control">Open</property>
</cluster-provider>
複製程式碼
配置NiFi執行記憶體
# vim /data/nifi/nifi-1.9.2/conf/bootstrap.conf
複製程式碼
修改如下內容
# JVM memory settings
java.arg.2=-Xms2048m
java.arg.3=-Xmx4096m
複製程式碼
注:可根據伺服器效能合理設定nifi記憶體
啟動NiFi服務
# ln -s /data/nifi/nifi-1.9.2/bin/nifi.sh /etc/init.d/nifi
# service nifi start
複製程式碼
使用Nginx代理
使用Nginx反向代理NiFi叢集並做負載均衡
安裝Nginx
增加對應的Nginx源
$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
複製程式碼
yum安裝Nginx
$ yum -y install nginx
複製程式碼
編寫NiFi.conf
# vim /etc/nginx/conf.d/nifi-cluster.conf
複製程式碼
內容如下
upstream nifi-cluster {
server nifi-01:8080 max_fails=3 fail_timeout=15;
server nifi-02:8080 max_fails=3 fail_timeout=15;
server nifi-03:8080 backup;
}
server {
listen 81;
server_name _;
location /nifi/ {
proxy_pass http://nifi-cluster/nifi/;
proxy_set_header X-ProxyScheme http;
proxy_set_header X-ProxyHost $http_host;
proxy_set_header X-ProxyPort $server_port;
proxy_set_header X-ProxyContextPath /;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_redirect off;
}
location /nifi-api/ {
proxy_pass http://nifi-cluster/nifi-api/;
proxy_set_header X-ProxyScheme http;
proxy_set_header X-ProxyHost $http_host;
proxy_set_header X-ProxyPort $server_port;
proxy_set_header X-ProxyContextPath /;
}
location /nifi-docs/ {
proxy_pass http://nifi-cluster/nifi-docs/;
proxy_set_header X-ProxyScheme http;
proxy_set_header X-ProxyHost $http_host;
proxy_set_header X-ProxyPort $server_port;
proxy_set_header X-ProxyContextPath /;
}
}
複製程式碼
儲存並退出,然後使用nginx -t
命令檢查配置是否正常
啟動Nginx
# systemctl start nginx
複製程式碼
現在可以瀏覽器中訪問http://ip:81/nifi/
即可進入nifi叢集