Linux下NiFi叢集部署

akiya發表於2019-11-25

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.231NiFi 1.9.2

環境配置

  1. 上傳nifi及jdk包至每臺伺服器的/tmp/nifi_install路徑下
  2. 在所有伺服器新增host解析
    # cat >> /etc/hosts << EOF
    > 10.200.0.11 nifi-01
    > 10.200.0.12 nifi-02
    > 10.200.0.13 nifi-03
    > EOF
    複製程式碼

部署

叢集部署單機部署方式除個別配置檔案需改動外基本一致

  1. 建立部署路徑
    # mkdir -p /data/nifi
    複製程式碼
  2. 解壓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/
    複製程式碼
  3. 在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.propertiesserver.配置)

注意:每臺伺服器上配置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叢集

相關文章