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
环境配置
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.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集群