Veri akış yönetimi ve entegrasyon süreçlerinde, sistemin kesintisiz çalışması (High Availability) ve gelen veri yükünün sunucular arasında dengeli paylaşılması (Load Balancing) sistem mimarisinin en kritik yapı taşlarıdır. Apache NiFi, büyük ölçekli veri üretim ortamlarında bu ihtiyacı yerel olarak desteklediği Aktif-Aktif (Active-Active) cluster mimarisiyle çözer.
Bu yazı dizisinde, kurumsal ortamlarda veri kaybının önüne geçmek ve işleme kapasitesini iki katına çıkarmak için kullanabileceğiniz ölçeklenebilir bir NiFi kümesi inşa edeceğiz. Yapıdaki tüm node’ların aynı akışları eş zamanlı işlemesini sağlarken, bir node’un çökmesi durumunda diğerinin trafiği nasıl kesintisiz devralacağını adım adım görececeğiz.
Rehberimizin bu ilk bölümünde, Red Hat Enterprise Linux (RHEL) üzerinde, Apache NiFi 2.9.0 ve Java 21 cluster mimarisini sıfırdan ayağa kaldıracağız. NiFi 2.x mimarisiyle birlikte gömülü (embedded) ZooKeeper desteği tamamen kaldırıldığı için, bu rehberde koordinasyon katmanını harici (external) bir ZooKeeper cluster’ı ile entegre olacak şekilde kurgulayacağız.
1.) Apache NiFi 2.0 Cluster Kurulumu: OS, Network ve Güvenlik Ayarları
Apache NiFi cluster mimarisinin sağlıklı, kararlı ve performanslı çalışabilmesi için işletim sistemi ve network seviyesindeki konfigürasyonların eksiksiz yapılması gerekir. NiFi node’ları hem kendi aralarında (Cluster Protokolü) hem de iç koordinasyonu sağlayan harici ZooKeeper servisiyle sürekli ve milisaniyeler seviyesinde el sıkışmak (heartbeat) zorundadır. Networkteki anlık bir kesinti veya yanlış yapılandırılmış bir firewall kuralı, cluster’ın bölünmesine (split-brain) yol açabilir.
Bu bölümde, RHEL işletim sistemine sahip iki sunucumuzun network, hostname, SELinux ve firewall ayarlarını yapılandıracağız.
1.1. Sunucu Bilgileri ve Hostname Yapılandırması
Kurulumumuzda IP adresleri üzerinden değil, kalıcı hostname (sunucu adı) tanımlamaları üzerinden ilerleyeceğiz. Bu, cluster mimarilerinde IP değişikliklerinden etkilenmemek için en güvenli yöntemdir.
Mevcut laboratuvar topolojimiz:
- Node 1 IP:
10.10.10.11-> Belirlenen Hostname:nifi01.cluster - Node 2 IP:
10.10.10.12-> Belirlenen Hostname:nifi02.cluster
Hostname Tanımlama Komutları
Sistemlerin birbirini çözebilmesi için (DNS sunucunuz yoksa) her iki sunucunun `/etc/hosts` dosyasına bu iki node’u da eklememiz gerekiyor.
10.10.10.11 nifi01.cluster nifi01
10.10.10.12 nifi02.cluster nifi02
1.2. RHEL 8.9 Güvenlik Ayarları (SELinux ve Limits)
RHEL 8.9 üzerinde varsayılan olarak gelen bazı kısıtlamalar, NiFi’ın yüksek performansla çalışmasını veya cluster portlarına bağlanmasını engelleyebilir.
SELinux Yapılandırması
Test ve lokal simülasyon ortamlarında süreçlerin kısıtlanmaması adına SELinux’u Permissive moda çekiyoruz.
# Geçici olarak permissive moda alır
sudo setenforce 0
# Kalıcı hale getirmek için dosyayı düzenleyin
sudo vi /etc/selinux/config
Dosya içindeki SELINUX=enforcing satırını SELINUX=permissive olarak güncelleyin.
OS Kaynak Limitlerinin (Ulimits) Artırılması
Apache NiFi, doğası gereği aynı anda binlerce dosyayı açıp işleyebilir ve çok sayıda thread (iş parçacığı) kullanır. RHEL’in varsayılan kullanıcı limitleri NiFi için yetersiz kalacaktır ve loglarda java.lang.OutOfMemoryError: unable to create new native thread veya Too many open files hatası almanıza neden olur.
Bunu önlemek için limitler dosyasını açın:
sudo vi /etc/security/limits.conf
Dosyanın en sonuna, ileride oluşturacağımız nifi kullanıcısı için şu satırları ekleyin:
nifi soft nofile 65536
nifi hard nofile 65536
nifi soft nproc 10000
nifi hard nproc 10000
1.3. Firewall (Güvenlik Duvarı) Kuralları
Geldik en kritik aşamaya. İki node’un birbiriyle sorunsuz konuşabilmesi için RHEL üzerinde firewalld servisine gerekli izinleri tanımlamalıyız. Apache NiFi 2.0 Cluster yapısında açılması gereken portlar ve görevleri şunlardır:
| Port Numarası | Protokol | Kullanım Amacı |
| 8443 | TCP | NiFi HTTPS Web Kullanıcı Arayüzü (UI) ve API Portu |
| 11443 | TCP | Cluster Node Protokol Portu (Node’ların birbiriyle konuşması) |
| 2181 | TCP | Gömülü ZooKeeper İstemci Bağlantı Portu |
| 2888 | TCP | Gömülü ZooKeeper Leader Seçim Portu |
| 3888 | TCP | Gömülü ZooKeeper Node’lar Arası Senkronizasyon Portu |
Firewall Komutları
Her iki RHEL sunucusunda da aşağıdaki komut bloğunu sırasıyla çalıştırarak kuralları kalıcı hale getirin:
# Gerekli tüm portları kalıcı (permanent) olarak açıyoruz
sudo firewall-cmd --permanent --add-port=8443/tcp
sudo firewall-cmd --permanent --add-port=11443/tcp
sudo firewall-cmd --permanent --add-port=2181/tcp
sudo firewall-cmd --permanent --add-port=2888/tcp
sudo firewall-cmd --permanent --add-port=3888/tcp
# Değişikliklerin devreye girmesi için firewall servisini yeniden yüklüyoruz
sudo firewall-cmd --reload
Açtığınız portları doğrulamak için şu komutu kullanabilirsiniz:
sudo firewall-cmd --list-ports
Çıktıda 8443/tcp 11443/tcp 2181/tcp 2888/tcp 3888/tcp portlarını görmelisiniz.
Portları tek tek açmakla uğraşmamak için RHEL üzerindeki firewall servisini tamamen kapatıp devre dışı bırakarak da erişim sorununu çözebilirsiniz:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
2.) Java ve NiFi Paket Hazırlığı
Bu bölümde, sunucularımız için gerekli olan Java 21 (OpenJDK) and Apache NiFi 2.0.0 (LTS) paketlerinin indirme linklerini ve sunucu üzerindeki dizin hazırlıklarını tamamlayacağız.
2.1. Java 21 (OpenJDK LTS) ve Nifi 2.0 İndirme Linkleri
Apache NiFi 2.x sürümleri çalışmak için en az Java 21’ye ihtiyaç duyar. RHEL uyumlu resmi Red Hat OpenJDK veya genel Linux x64 OpenJDK paketini indirebilirsiniz.
2.2. Sunucularda Kullanıcı ve Dizin Mimarisinin Hazırlanması
Paketleri sunucuya transfer etmeden önce, her iki RHEL sunucusunda da NiFi servisinin çalışacağı izole ve güvenli bir sistem kullanıcısı ile ana dizin yapısını kurgulamalıyız.
Her iki node üzerinde de root kullanıcısıyla şu komutları çalıştırın:
# nifi adında özel bir sistem kullanıcısı oluşturun
sudo useradd -m -s /bin/bash nifi
# NiFi ve Java klasörlerini barındıracak ana dizini oluşturun
sudo mkdir -p /opt/nifi
# Bu dizinin tüm sahipliğini ve yetkisini nifi kullanıcısına devredin
sudo chown -R nifi:nifi /opt/nifi
2.3. Paketlerin Çıkarılması ve Alternatif Java Sürümünü Değiştirme
İndirdiğiniz jdk-21.0.3_linux-x64_bin.tar.gz and nifi-2.0.0-bin.zip dosyalarını WinSCP veya SCP gibi bir araçla her iki RHEL sunucusunun /opt/nifi dizinine aktarın.
Transfer bittikten sonra her iki sunucuda da nifi kullanıcısına geçiş yapıp arşivleri açalım:
# nifi kullanıcısına geçiş yapın
sudo su - nifi
cd /opt/nifi
# Paketleri arşivden çıkartın
tar -xvf jdk-21.0.3_linux-x64_bin.tar.gz
unzip nifi-2.9.0-bin.zip
Sürüm Yönetimi İçin Sembolik Link (Kısayol) Tanımlama
İleride sürüm yükseltme işlemlerinde konfigürasyon yollarını bozmamak için dizinlere sembolik link tanımlıyoruz:
ln -s jdk-21.0.3 java_home
ln -s nifi-2.9.0 current
Mevcut Sistem Java Sürümünü Değiştirme ve Ezme
RHEL 8.9 üzerinde halihazırda sistem seviyesinde kurulu bir Java (örneğin eski bir Java 8 veya Java 11) bulunabilir. NiFi servisinin işletim sistemindeki diğer Java sürümlerinden etkilenmemesi ve tamamen bizim indirdiğimiz Oracle JDK 21’yi kullanması için nifi kullanıcısının profil değişkenlerini ezmemiz gerekir.
Bunu yapmak için nifi kullanıcısının ev dizinindeki .bash_profile dosyasını düzenliyoruz:
vi ~/.bash_profile
Dosyanın en altına, sistemdeki mevcut tüm PATH tanımlamalarının önüne geçecek şekilde şu satırları ekleyin:
export JAVA_HOME=/opt/nifi/java_home
export PATH=$JAVA_HOME/bin:$PATH
Püf Noktası:
$JAVA_HOME/binifadesini$PATHdeğişkeninin soluna (önüne) yazdığımız için, işletim sistemi bir java komutu aldığında sistemdeki eski Java’lara bakmadan direkt olarak bizim belirttiğimiz Java 21 klasörünü tetikleyecektir.
Değişikliklerin profil üzerinde aktif olması için dosyayı okutun ve sürümü doğrulayın:
source ~/.bash_profile
# Doğrulama Komutu
java -version
Eğer ekranda başarıyla aşağıdaki çıktıyı görüyorsanız, sistemde başka hangi Java sürümü olursa olsun nifi kullanıcısı için bu durum tamamen ezilmiş ve Java 21 varsayılan yapılmış demektir.
3. Harici ZooKeeper Kümesi Kurulumu ve Yapılandırması
Apache NiFi cluster mimarisinde, düğümlerin (node) birbirini tanıması, küme durumunun izlenmesi ve bir node çöktüğünde liderlik seçiminin (Primary Node ve Cluster Coordinator) saniyeler içinde yapılabilmesi için arka planda bir koordinasyon servisi çalışmalıdır. NiFi, bu iş için Apache ZooKeeper mimarisini kullanır.
Çok Kritik NiFi 2.x+ Değişikliği: Apache NiFi 2.0 ve üzeri (LTS) sürümleriyle birlikte, eski versiyonlarda yer alan Gömülü (Embedded) ZooKeeper desteği tamamen kaldırılmıştır. Dolayısıyla, modern bir NiFi cluster yapısı kurarken, koordinasyon katmanını harici (external) ve bağımsız bir ZooKeeper kümesi olarak yapılandırmak zorunludur. Bu bölümde, her iki sunucumuza da resmi Apache ZooKeeper paketini kuracak ve 2 node’lu bir koordinasyon omurgası ayağa kaldıracağız.
3.1. ZooKeeper Paketinin İndirilmesi ve Çıkarılması
Güvenlik ve yetki karmaşasını önlemek adına ZooKeeper servisini de sistemde oluşturduğumuz izole nifi kullanıcısı altında çalıştıracağız. Her iki sunucuda da sırasıyla nifi kullanıcısına geçiş yapıp güncel ve kararlı Apache ZooKeeper paketini indirelim:
# nifi kullanıcısına geçiş yapın
sudo su - nifi
cd /opt/nifi
# Resmi arşivden paketi indirin ve çıkartın
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin.tar.gz
tar -xvf apache-zookeeper-3.9.2-bin.tar.gz
# Sürüm yönetimi için sembolik link (symlink) oluşturun
ln -s apache-zookeeper-3.9.2-bin zookeeper
Dosya içerisinde nifi.state.management.embedded.zookeeper.start parametresini bulun ve değerini true yapın:
nifi.state.management.embedded.zookeeper.start=true
3.2. zoo.cfg Dosyasının Düzenlenmesi
ZooKeeper, varsayılan olarak konfigürasyonunu zoo.cfg dosyasından okur. Paketle birlikte gelen örnek şablonu kopyalayarak düzenlemeye başlıyoruz. Her iki sunucuda da aşağıdaki komutları çalıştırın:
vi /opt/nifi/current/conf/zookeeper.properties
Dosyanın en altına gelin ve aşağıdaki satırları ekleyin. Bu satırlar, ZooKeeper’a kümede 2 adet sunucu olduğunu ve birbirlerine nasıl erişeceklerini söyler:
cp /opt/nifi/zookeeper/conf/zoo_sample.cfg /opt/nifi/zookeeper/conf/zoo.cfg
vi /opt/nifi/zookeeper/conf/zoo.cfg
Dosya içerisindeki varsayılan geçici dataDir parametresini kalıcı bir dizine yönlendirin ve dosyanın en sonuna gelerek cluster sunucu tanımlamalarını ekleyin:
# Verilerin kalıcı olarak yazılacağı dizin
dataDir=/opt/nifi/zookeeper/data
# İstemci (NiFi) bağlantı portu
clientPort=2181
# 2-Node ZooKeeper Cluster Sunucu Tanımlamaları
server.1=nifi01.cluster:2888:3888
server.2=nifi02.cluster:2888:3888
📌 Portların Görevi: 2181 portu NiFi’ın bu servise bağlanacağı istemci portudur. 2888 portu ZooKeeper düğümlerinin lider sunucuya bağlanması (follower-to-leader) için, 3888 portu ise kendi aralarında yeni bir lider seçmek (Leader Election) için kullanılır.
3.3. Benzersiz Kimliklerin Oluşturulması (myid Dosyası)
ZooKeeper mimarisinde en kritik kural, her bir koordinasyon servisinin küme içinde benzersiz bir ID (numara) ile tanımlanması zorunluluğudur. zoo.cfg dosyasında server.1 and server.2 olarak verdiğimiz benzersiz numaraları, sunucuların kendi data dizinlerine el ile yazmalıyız.
Öncelikle veri dizinini her iki sunucuda da oluşturalım:
mkdir -p /opt/nifi/zookeeper/data
Şimdi sunuculara özel kimliklerini yazıyoruz:
1. Sunucuda (nifi01.cluster) çalıştırın:
echo "1" > /opt/nifi/zookeeper/data/myid
2. Sunucuda (nifi02.cluster) çalıştırın:
echo "2" > /opt/nifi/zookeeper/data/myid
3.4. ZooKeeper Servislerinin Başlatılması
Yapılandırma tamamlandı. NiFi cluster servislerini tetiklemeden önce, arka plandaki bu koordinatör mekanizmasının ayakta ve hazır olması gerekir. Her iki sunucuda da ZooKeeper servisini başlatın:
/opt/nifi/zookeeper/bin/zkServer.sh start
Servisin durumunu ve hangi node’un lider (leader/follower) olduğunu doğrulamak için şu komutu kullanabilirsiniz:
/opt/nifi/zookeeper/bin/zkServer.sh status
3.5. state-management.xml Dosyasının Düzenlenmesi
NiFi’ın kendi içindeki işlemcilerin (Stateful Processors) anlık durum bilgilerini az önce kurduğumuz harici kümeye yazabilmesi için NiFi tarafındaki dosyayı hazırlıyoruz. Her iki sunucuda da aşağıdaki dosyayı açın:
vi /opt/nifi/current/conf/state-management.xml
Dosya içerisinde <cluster-provider> etiketini bulun. Bu etiketin altındaki sınıf yolunu (NiFi 2.x mimarisine uygun yeni paket yoluyla) ve Connect String kısmını harici ZooKeeper cluster’ımızı görecek şekilde güncelleyin:
<cluster-provider>
<id>zk-provider</id>
<class>org.apache.nifi.controller.state.providers.zookeeper.ZooKeeperStateProvider</class>
<property name="Connect String">nifi01.cluster:2181,nifi02.cluster:2181</property>
<property name="Root Node">/nifi</property>
<property name="Session Timeout">10 seconds</property>
<property name="Access Control">Open</property>
</cluster-provider>
3.6 Test Adımları
Quorum (Lider/Takipçi) Testi
İki sunucunun birbiriyle konuşup bir küme oluşturabildiğini anlamanın en kolay yolu statülerini kontrol etmektir. Her iki sunucuda da şu komutu çalıştır:
/opt/nifi/zookeeper/bin/zkServer.sh status
Beklenen Sonuç: Çıktının en alt satırında sunuculardan birinin Mode: leader, diğerinin ise Mode: follower olarak görünmesi gerekir. Eğer böyleyse kendi aralarında anlaşmışlar ve cluster kurulmuş demektir.
Port ve Erişim Testi
nifi01 makinesindeyken nifi02‘nin 2181 portuna erişebildiğimizi (firewall kurallarının vs. doğru çalıştığını) netcat komutu ile doğrulayalım:
nifi01 üzerinden şunu çalıştır:
nc -zv nifi02.cluster 2181
nifi02 üzerinden de şunu çalıştır:
nc -zv nifi01.cluster 2181
Beklenen Sonuç: Connection to nifiXX.cluster 2181 port [tcp/*] succeeded! veya succeeded kelimesini içeren bir çıktı görmelisin.
İstemci (CLI) Testi (En Garantisi)
NiFi’ın bağlanırken yapacağı işlemin aynısını ZooKeeper’ın kendi komut satırı aracıyla simüle edelim. Herhangi bir sunucuda şu komutu çalıştırıp cluster’a bağlanmayı dene:
/opt/nifi/zookeeper/bin/zkCli.sh -server nifi01.cluster:2181,nifi02.cluster:2181
Ekrana bir sürü log akacak ve en sonunda [zk: nifi01.cluster:2181,nifi02.cluster:2181(CONNECTED) 0] gibi bir komut satırına düşeceksin. Buraya ls / yazıp Enter’a bas. Sana [zookeeper] gibi bir klasör listesi dönüyorsa, bağlantı okuma/yazma işlemleri tıkır tıkır çalışıyor demektir. Çıkmak için quit yazıp Enter’a basabilirsin.
4. Sunucu ve HTTPS Ayarları
Apache NiFi 2.9.0 sürümü, modern kurumsal güvenlik standartları gereği varsayılan olarak tamamen güvenli (Secure HTTPS) modda ayağa kalkar. Eski 1.x sürümlerindeki güvensiz HTTP konfigürasyonları bu versiyonda tamamen kaldırılmıştır. Bu nedenle, cluster mimarisindeki node’ların hem arayüze erişirken HTTPS kullanması hem de kendi aralarındaki cluster iç iletişim trafiğini (Cluster Protocol) güvenli SSL kanallarından akıtması gerekir.
Bu bölümde, her iki node üzerindeki ana konfigürasyon dosyası olan nifi.properties şablonunu kurumsal cluster standartlarına göre satır satır güncelleyeceğiz.
4.1. Node-1 (nifi-node01) İçin nifi.properties Ayarları
İlk olarak 1. Sunucumuza (10.10.10.11) giriş yapın ve ana konfigürasyon dosyasını açın:
vi /opt/nifi/current/conf/nifi.properties
Dosya içerisindeki ilgili alanları bulun ve tam olarak aşağıdaki gibi güncelleyin (Arama kolaylığı için başlık isimleri korunmuştur):
# ====================================================================
# Web Properties (Kullanıcı Arayüzü ve API Erişimi)
# ====================================================================
nifi.web.https.host=nifi01.cluster
nifi.web.https.port=8443
# ====================================================================
# Cluster Node Properties (Cluster İletişim Kuralları)
# ====================================================================
# Bu sunucunun cluster yapısına dahil bir node olduğunu belirtiyoruz
nifi.cluster.is.node=true
# Node'ların birbiriyle konuşacağı adres ve port (Bölüm 1'de firewall izni vermiştik)
nifi.cluster.node.address=nifi01.cluster
nifi.cluster.node.protocol.port=11443
# Cluster içindeki anlık durum ve bağlantı zaman aşımı süreleri
nifi.cluster.node.protocol.threads=10
nifi.cluster.node.connection.timeout=15 sec
nifi.cluster.node.read.timeout=15 sec
# ====================================================================
# ZooKeeper Properties (Bölüm 3'te kurduğumuz harici yapıya bağlantı)
# ====================================================================
# NiFi'ın liderlik seçimi ve koordinasyon için bağlanacağı ZooKeeper adresleri
nifi.zookeeper.connect.string=nifi01.cluster:2181,nifi02.cluster:2181
4.2. Node-2 (nifi-node02) İçin nifi.properties Ayarları
Şimdi 2. Sunucumuza (10.10.10.12) giriş yapın ve aynı dosyayı açın:
vi /opt/nifi/current/conf/nifi.properties
Bu sunucuda adres tanımlamalarını kendi hostname bilgisine (nifi-node02) göre güncelliyoruz:
# ====================================================================
# Web Properties
# ====================================================================
nifi.web.https.host=nifi02.cluster
nifi.web.https.port=8443
# ====================================================================
# Cluster Node Properties
# ====================================================================
nifi.cluster.is.node=true
nifi.cluster.node.address=nifi02.cluster
nifi.cluster.node.protocol.port=11443
nifi.cluster.node.protocol.threads=10
nifi.cluster.node.connection.timeout=15 sec
nifi.cluster.node.read.timeout=15 sec
# ====================================================================
# ZooKeeper Properties
# ====================================================================
nifi.zookeeper.connect.string=nifi01.cluster:2181,nifi02.cluster:2181
4.3. Kritik Cluster Sertifika Zorunluluğu (Ortak CA Mimarisi)
Apache NiFi tek başına (Standalone) çalıştırıldığında, ilk açılışta otomatik olarak kendinden imzalı (Self-Signed) bir SSL sertifikası üretme yeteneğine sahiptir. Ancak bu otomatik mekanizma Cluster mimarilerinde kesinlikle çalışmaz.
Eğer node’ları bu şekilde kendi hallerine bırakıp doğrudan başlatırsanız, nifi01 kendi sertifikasını, nifi02 ise tamamen bağımsız başka bir sertifika üretecektir. Sunucular 11443 portu üzerinden el sıkışmaya çalıştıklarında birbirlerinin sertifikalarına güvenmeyecekler ve loglarda SSLHandshakeException: PKIX path building failed hatası fırlatarak cluster yapısını kuramayacaklardır.
Net Çözüm: Cluster yapısındaki tüm node’ların aynı kök sertifika otoritesinden (Common CA) imzalanmış veya birbirine güveni doğrulanmış Keystore ve Truststore dosyalarını kullanması şarttır.
4.4. Java Keytool ile Küme Sertifikalarının Manuel Üretilmesi
NiFi 2.x mimarisinde artık otomatik sertifika sihirbazı (tls-toolkit) bulunmadığı için, cluster node’larının güvenle el sıkışmasını sağlayacak sertifikaları Java’nın yerel keytool komutunu kullanarak el ile üreteceğiz.
Sadece Node-1 (nifi01.cluster) sunucusuna nifi kullanıcısı ile bağlanın ve aşağıdaki komutları sırasıyla çalıştırın:
# Geçici sertifika üretim dizinini oluşturun ve içine girin
mkdir -p /opt/nifi/certs
cd /opt/nifi/certs
# 1. Node (nifi01) için Keystore üretimi
keytool -genkeypair -alias nifi01 -keyalg RSA -keysize 3072 -validity 3650 \
-keystore nifi01.keystore.p12 -storetype PKCS12 -storepass 123456 \
-dname "CN=nifi01.cluster" -ext SAN=dns:nifi01.cluster
# 2. Node (nifi02) için Keystore üretimi
keytool -genkeypair -alias nifi02 -keyalg RSA -keysize 3072 -validity 3650 \
-keystore nifi02.keystore.p12 -storetype PKCS12 -storepass 123456 \
-dname "CN=nifi02.cluster" -ext SAN=dns:nifi02.cluster
# Sertifikaların birbirine güvenmesi için public (.cer) dosyalarını dışarı aktarıyoruz
keytool -exportcert -alias nifi01 -keystore nifi01.keystore.p12 -storepass 123456 -file nifi01.cer
keytool -exportcert -alias nifi02 -keystore nifi02.keystore.p12 -storepass 123456 -file nifi02.cer
# Her iki node'un da ortak kullanacağı Truststore dosyasını oluşturup iki sertifikayı da içine gömüyoruz
keytool -importcert -alias nifi01 -keystore truststore.p12 -storepass 123456 -file nifi01.cer -noprompt
keytool -importcert -alias nifi02 -keystore truststore.p12 -storepass 123456 -file nifi02.cer -noprompt
Bu aşamada /opt/nifi/certs dizininizde nifi01.keystore.p12, nifi02.keystore.p12 and truststore.p12 isimli 3 adet kritik anahtar dosyası oluşmuş durumdadır. .cer uzantılı dosyalar ise geçici ara elemanlar olduğu için onlarla işimiz bitmiştir.
[nifi@nifi01 certs]$ ls
nifi01.cer nifi01.keystore.p12 nifi02.cer nifi02.keystore.p12 truststore.p12
Hâlâ Node-1 (nifi01.cluster) sunucusundayken, az önce ürettiğimiz dosyalardan Node-1’e ait olanları NiFi’ın konfigürasyon klasörüne (conf) taşıyoruz ve isimlerini sadeleştiriyoruz:
# Node-1'in kendi keystore dosyasını taşıyın ve adını keystore.p12 yapın
cp /opt/nifi/certs/nifi01.keystore.p12 /opt/nifi/current/conf/keystore.p12
# Ortak truststore dosyasını taşıyın
cp /opt/nifi/certs/truststore.p12 /opt/nifi/current/conf/truststore.p12
Yine Node-1 (nifi01.cluster) sunucusu üzerindeyken, Node-2’ye ait olan anahtarları güvenli kopyalama protokolü (SCP) aracılığıyla karşı sunucuya fırlatıyoruz.
(Not: Bu komutun çalışması için sunucular arasında SSH erişiminin açık olması gerekir. Karşı sunucunun şifresi sorulursa nifi kullanıcısının şifresini girmeniz yeterlidir).
# Node-2'nin keystore dosyasını karşıya gönderin ve adını keystore.p12 olarak kaydedin
scp /opt/nifi/certs/nifi02.keystore.p12 nifi@nifi02.cluster:/opt/nifi/current/conf/keystore.p12
# Ortak truststore dosyasını karşı sunucuya kopyalayın
scp /opt/nifi/certs/truststore.p12 nifi@nifi02.cluster:/opt/nifi/current/conf/truststore.p12
Dağıtım işlemi bittiğinde sunucularınızın iç mimarisi tam olarak şu net tabloda göründüğü gibi olmalıdır. Devam etmeden önce her iki sunucuda da ilgili dizini kontrol ederek doğruluğundan emin olun:
| İşlem Yapılacak Sunucu | Dosyanın Kaynağı | Atılacağı Hedef Dizin ve Yeni Adı | Dosyanın Amacı |
| Node-1 (nifi01.cluster) | Lokal dizinden kopyalandı | /opt/nifi/current/conf/keystore.p12 | Node-1’in SSL Kimliği |
| Node-1 (nifi01.cluster) | Lokal dizinden kopyalandı | /opt/nifi/current/conf/truststore.p12 | Ortak Güven Havuzu |
| Node-2 (nifi02.cluster) | Node-1’den SCP ile geldi | /opt/nifi/current/conf/keystore.p12 | Node-2’nin SSL Kimliği |
| Node-2 (nifi02.cluster) | Node-1’den SCP ile geldi | /opt/nifi/current/conf/truststore.p12 | Ortak Güven Havuzu |
nifi.properties İçerisindeki Security Alanlarının Güncellenmesi
Sertifikaları yerleştirdikten sonra, her iki sunucuda da nifi.properties dosyasını açıp aşağıdaki alanları bu yeni PKCS12 dosyalarımıza ve belirlediğimiz ortak parolaya göre güncelliyoruz:
# ====================================================================
# Security Properties
# ====================================================================
nifi.security.keystore=/opt/nifi/current/conf/keystore.p12
nifi.security.keystoreType=PKCS12
nifi.security.keystorePasswd=123456
nifi.security.keyPasswd=123456
nifi.security.truststore=/opt/nifi/current/conf/truststore.p12
nifi.security.truststoreType=PKCS12
nifi.security.truststorePasswd=123456
NiFi servislerini start etmeden önce, oluşturduğumuz PKCS12 dosyalarının bütünlüğünü ve şifrelerin doğruluğunu Java’nın kendi aracıyla kontrol edebiliriz.
keytool -list -keystore /opt/nifi/current/conf/keystore.p12 -storetype PKCS12 -storepass 123456
Beklenen Çıktı: Komut hata vermeden çalışmalı ve içerisinde sırasıyla nifi01 and nifi02 alias (takma ad) içeren private key logunu basmalıdır. Eğer Keystore password is incorrect veya Not a valid PKCS12 file gibi bir hata alıyorsanız, şifreleri veya kopyalamayı kontrol etmeniz gerekir.
5. Servislerin Başlatılması ve Doğrulama
Konfigürasyonlarımızı kurumsal standartlara getirdiğimize ve SSL sertifikalarımızı güvene aldığımıza göre artık cluster yapımızı ateşleyebiliriz. Apache NiFi 2.9.0 güvenli modda açıldığında bir kullanıcı adı ve şifreye ihtiyaç duyar. Cluster’ı başlatmadan önce bu kimlik bilgilerini el ile set edeceğiz.
5.1. NiFi Servislerinin Sırayla Başlatılması
NiFi 2.x mimarisinde ilk kurulumda arayüze erişebilmek için her iki node üzerinde de ortak bir admin kullanıcısı tanımlamamız gerekir. Kurumsal parola politikası gereği şifrenin en az 12 karakter olması şarttır.
Her iki sunucuda da (nifi01 and nifi02) sırasıyla şu komutu çalıştırarak ilk giriş bilgilerini sisteme enjekte edin:
cd /opt/nifi/current
./bin/nifi.sh set-single-user-credentials admin Password123456
Hem Node-1 hem de Node-2 sunucularında ana konfigürasyon dosyasını aç:
vi /opt/nifi/current/conf/nifi.properties
Dosya içinde nifi.sensitive.props.key satırını bul (varsayılan olarak boştur) ve iki sunucuya da birebir aynı olacak şekilde en az 12 karakterli ortak bir anahtar yaz. Örneğin:
nifi.sensitive.props.key=Password123456
5.2. Küme Elemanlarının Sıralı Başlatılması
Bir NiFi cluster yapısında node’ların liderlik seçimi yapabilmesi ve veri tutarlılığı için harici ZooKeeper servisinin ayakta olması şarttır. Bu nedenle aşağıdaki başlatma sırasına milimetrik olarak uymamız gerekir:
- ZooKeeper Kontrolü: Bölüm 3’te kurduğumuz harici ZooKeeper cluster’ın (
nifi01:2181andnifi02:2181) ayakta ve çalışır durumda olduğundan emin olun. - Node-1 Başlatma: İlk olarak ana koordinatör adayımız olan
nifi01.clustersunucusuna gelin ve NiFi servisini arka planda ayağa kaldırın:
/opt/nifi/current/bin/nifi.sh start
Node-1 Log Takibi: Node-1’in tamamen ayağa kalkmasını ve Jetty web sunucusunun SSL portunu dinlemeye başladığını loglardan doğrulayın:
tail -f /opt/nifi/current/logs/nifi-app.log
Loglardaki şu satır her şeyin yolunda olduğunu söylüyor:
Cluster is still voting on which Flow is the correct flow for the cluster. Election will complete in 284 seconds
Bu Log Tam Olarak Ne Anlama Geliyor?
NiFi Cluster mimarisinde ilk kurulumda veya tüm node’lar sıfırdan başlarken “Flow Election” (Akış Seçimi) adında koruyucu bir mekanizma devreye girer.
NiFi şunu der: “Ben şu an 2 node’lu bir cluster’ım. Node’lardan birinde eski ya da farklı bir akış tasarımı (flow.xml.gz / flow.json.gz) kalmış olabilir. Veri kaybı veya senkronizasyon hatası olmasın diye bekleyeceğim, tüm node’lar ayağa kalkıp bana kendi akış şemalarını raporlayacak, biz de ortaklaşa en doğru akışa oylama ile karar vereceğiz.”
Şimdi Ne Yapman Gerekiyor?
Şu an her şey tıkırında. 5 dakika (300 saniye) boyunca Node-1’in oylama süresinin bitmesini beklemene gerek yok.
Hemen şimdi Node-2 (nifi02) sunucusuna geç ve orada da NiFi’ı başlat:
/opt/nifi/current/bin/nifi.sh start
Her iki node da başlatıldıktan sonra sunuculardan herhangi birinde nifi-app.log dosyasını izleyerek düğümlerin birbiriyle el sıkışıp sıkışmadığını kontrol edin:
tail -f /opt/nifi/current/logs/nifi-app.log
INFO [Heartbeat Monitor Thread-1] o.a.n.c.h.AbstractHeartbeatMonitor Finished processing 2 heartbeats in 17312 nanos
Loglar Bize Ne Diyor?
from nifi01.cluster:8443andfrom nifi02.cluster:8443adreslerinden gelen kalp atışları (HEARTBEAT) başarıyla alınmış.Finished processing 2 heartbeatsifadesi, her iki node’un da şu an el sıkıştığını, birbirini tanıdığını ve cluster’ın 2/2 şeklinde aktif olarak kalbinin attığını söylüyor.- Aradaki SSL sertifikaları, anahtarlar, şifreler, ZooKeeper bağlantıları ve firewall kuralları milimetrik olarak doğru çalışmış ki en ufak bir el sıkışma hatası (
SSLHandshakeException) düşmemiş.
Şimdi Tarayıcıdan Arayüze Akma Zamanı!
Hemen tarayıcını aç ve şu adreslerden birine git:
- URL:
[https://nifi01.cluster:8443/nifi/](https://nifi01.cluster:8443/nifi/)(Veyanifi02.cluster:8443) - Kullanıcı Adı:
admin - Şifre: Bölüm 5.1’de
set-single-user-credentialsile girdiğin o en az 12 karakterli güçlü şifre(Password123456).
Arayüze girdiğinde sağ üst köşedeki menüden ya da sol üstteki ikonlardan Cluster durumuna bak. Orada yan yana yanan yeşil ışıkları ve Connected durumundaki 2 node’u gördüğünde bu serinin haklı gururunu yaşayabilirsin.







Leave a Reply