nifi是一个Zero-Master的集群模式,每一个node承担着一样的角色,但是处理数据的不同部分。有一个Cluster Coordinator的角色,通过选举产生。其他节点必须向Cluster Coordinator发送心跳,Cluster Coordinator来决定剔除节点或者加入节点。当一个新节点要加入集群,那么它的flow配置文件的版本必须与Cluster Coordinator的节点的一样,如果不一致,则不允许加入。可以通过删除新增加节点的配置文件(conf/flow.xml.gz)来加入集群。
当数据量比较大的时候,单个nifi节点处理不过来,就需要多个节点。但是多个节点管理起来非常麻烦,所以cluster是非常必要的。以下几个概念比较重要:
Primary Node
每个cluster有一个Primary Node,用来执行"Isolated Processors"。可以利用zookeeper自动选举Primary Node,也可以在用户界面的Cluster Management页来直接决定谁是Primary Node。
Isolated Processors
在集群中只能单实例运行(比如ListFTP,如果在多个节点同时执行,那么获取数据会重复),会在Primary Node上执行。如果配置得当,那么可以自动负载均衡分发数据到其他节点。
Dealing with Disconnected Nodes
当一个节点因为网络原因掉了以后,那么在它加入集群之前无法改变flow的配置。如果非要更改,可以在用户界面的Cluster Management页手动remove这个节点出集群。
Flow Election
cluster启动的时候每一个node会提交自己的flow.xml.gz到集群中,然后每台对和自己一样的flow进行投票,如果投票时间(nifi.cluster.flow.election.max.wait.time)到了或者某一个flow.xml.gz已经达到票数(nifi.cluster.flow.election.max.candidates),则选出一个正确的flow.xml.gz。不一致的node自动挂掉,除非它自己没有flow.xml.gz。
CLuster分发数据
关于cluster分发数据,官方文档说的有点儿不清楚,有一篇文章说的很清楚:How Do I Distribute Data Across an Apache NiFi Cluster
文中提到了三种方法:第一种是数据源自己push数据,就是需要在processor前边加一个Load Banlacer。
第二种是数据源的数据依靠processor去拉取数据,最典型的是GetKafka processor,由kafka自己的机制(使用同一个group.id)来保证数据的分发。
另外一种拉取数据的案例是一个在主节点上执行的list操作,然后通过site-to-site协议把数据分发到各个节点,然后后端的processor拉取数据。如图所示,当RPG生效的时候 ,Node1的rpg建立一个SiteToSiteClient,保存cluster的状态信息(动态跟新)。当进行数据发送时,根据负载状态,同node1或者node2的InputPort建立socket连接,然后把数据发出去。
第三种就是单纯的两个NIFI实例之间的通过site-to-site协议交换数据来实现数据分发。
NIFI site-to-site
当NIFI实例之间进行数据交互的时候,有很多协议可以使用,但是最好的应该是NiFi Site-to-Site 协议。Site-to-Site 使得NIFI和其他NIFI实例或者其他消费者应用之间的数据传输更加高效和安全。
使用Site-to-Site有以下几个优点:
Easy to configure
输入远端NIFI实例的URL之后,有效的端口(在NIFI的root process group定义的port)会被发现并列到下拉列表里边。
Secure
Site-to-Site可以使用证书来加密数据或者提供认证。每一个port可以授权给指定的用户,只有授权过的用户才能看到这些port。
Scalable
Site-to-Site可以自动发现远端cluster中的所有节点的状态,然后数据会发送给所有集群中的节点(不能指定发给某几个节点)。
Efficient
为了避免创建链接的开销,Site-to-Site会批量发送数据。
Reliable
等数据传输完毕后,sender 和 receiver会自动向对方发送Checksums,如果checksums不匹配,那么重新传输。
Automatically load balanced
当node下线,或者node的负载出现波动,和这个节点有关的数据会自动进行调整。
FlowFiles maintain attributes
FlowFile的属性会一起被传输。
Adaptable
协议向下兼容,两个不同版本的nifi也可以交互。