Contexte :

Nous allons voir comment configurer un cluster d’indexers multisites dans le cadre d’un POC (pas d’optimisations), pour cela nous allons utiliser vagrant.

Nous utiliserons des CentOS 8 avec Splunk en version 8.2.1.
Nous aurons aussi besoin du cluster de SH que nous avons créé dans l’article ICI.

Nous utiliserons la documentation suivantes :

Préparation de l’environnement avec Vagrant :

Nous partirons avec 4 IDX (idx1-4) et un 1 US (us2) pour le Cluster Master/Manager Nodes.

Vagrantfile :

$ mkdir -p ~/.my_vagrant/demoSplunkIDXCluster

$ vi ~/.my_vagrant/demoSplunkIDXCluster/Vagrantfile
#Version 0.1
# Command system/custom/add packages ....
$packagesinstall = <<-SCRIPT
	# Package custom
	sudo yum install -y lsof vim git bind-utils

	# Package to Splunk health check iowait
	sudo yum install -y sysstat


	# Package installing
	echo "# Splunk RPM installation"
	sudo yum localinstall -y /vagrant/splunk-8.2.1-ddff1c41e5cf-linux-2.6-x86_64.rpm
  
	# Setup Splunk config
	echo "# Set permissions on Splunk folder"
	sudo chown -R vagrant:vagrant /opt/splunk

	# Splunk apps :
	# Manage min Free Space to POC instance
	echo "# Set minFreeSpace to POC instance"
	sudo mkdir -p /opt/splunk/etc/apps/my_customsplunk/local/
	sudo echo  "[diskUsage]" > /opt/splunk/etc/apps/my_customsplunk/local/server.conf 
	sudo echo  "minFreeSpace = 50" >> /opt/splunk/etc/apps/my_customsplunk/local/server.conf 
	sudo chown -R vagrant:vagrant /opt/splunk/etc/apps/my_customsplunk/


	echo "# Splunk activation on boot with Vagrant user"
	sudo /opt/splunk/bin/splunk enable boot-start  -systemd-managed 1 --accept-license -user vagrant --seed-passwd changeme

  echo "# Launch Splunk"
	sudo /opt/splunk/bin/splunk start  --no-prompt 
SCRIPT

#Get IP to display after vagrant up
$getip= <<-SCRIPT
	echo "IP of $(hostname) : "
	ip -4 addr sh eth1
	echo ""
	echo "Splunk Version ; "
	/opt/splunk/bin/splunk version
SCRIPT
#Message post up
$postupmessage = <<-SCRIPT
	Congratulations VM/box available.
  Generate by Vagrant !
SCRIPT


#Customise OS env
$customenv= <<-SCRIPT
	echo "Custom environnement"
  #Bash profile
	echo "Set .bash_profile to Vagrant user"
	sudo curl -sk "https://raw.githubusercontent.com/alasta/dotfiles/master/.bash_profile_vagrant"  -o /home/vagrant/.bash_profile

	#inputrc
	echo "Set inputrc"
	echo "Set inputrc to Vagrant user"
	sudo curl -sk  "https://raw.githubusercontent.com/alasta/dotfiles/master/.inputrc" -o /home/vagrant/.inputrc	
	
	#.vimrc
	echo "Set vimrc"
	sudo curl -sk "https://raw.githubusercontent.com/alasta/dotfiles/master/.vimrc" -o /home/vagrant/.vimrc
	
	#bash profile and inputrc to root 
	sudo curl -sk "https://raw.githubusercontent.com/alasta/dotfiles/master/.bash_profile_root" -o /root/.bash_profile

	#Set timezone
	echo "# Set timezone"
	timedatectl set-timezone 'Europe/Paris'

	# Manage DNS server to disable DNS on private net
  echo "# Disable DNS private net"
	sudo sed -i -e 's/.*10.0.*//g' /etc/resolv.conf

SCRIPT


#Config box
Vagrant.configure("2") do |config|
	(1..4).each do |i|
		config.vm.define "idx#{i}" do |vm1|
			#vm1.vm.provider "virtualbox" do |v|
 			#	v.memory = 2048
 		 	#	v.cpus = 2
			#end
			#vm1.vm.box = "centos/7"
			vm1.vm.box = "centos/8"
			vm1.vm.hostname = "idx#{i}"
			vm1.vm.box_url = "centos/8"
			vm1.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)", auto_config: false
			vm1.vm.provision "file", source: "~/Downloads/splunk-8.2.1-ddff1c41e5cf-linux-2.6-x86_64.rpm", destination: "/vagrant/"
			vm1.vm.provision "shell", inline: $packagesinstall
			vm1.vm.provision "shell", inline: $customenv
			vm1.vm.provision "shell", inline: $getip, run: "always"
			vm1.vm.post_up_message = $postupmessage
			#vm1.vm.provision "shell", inline: "ip -4 addr sh eth1", run: "always"
		end
	end
	config.vm.define "us2" do |vm1|
      #vm1.vm.provider "virtualbox" do |v|
      # v.memory = 2048
      # v.cpus = 2
      #end
      #vm1.vm.box = "centos/7"
      vm1.vm.box = "centos/8"
      vm1.vm.hostname = 'us2'
      vm1.vm.box_url = "centos/8"
      vm1.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)", auto_config: false
      vm1.vm.provision "file", source: "~/Downloads/splunk-8.2.1-ddff1c41e5cf-linux-2.6-x86_64.rpm", destination: "/vagrant/"
      vm1.vm.provision "shell", inline: $packagesinstall
      vm1.vm.provision "shell", inline: $customenv
      vm1.vm.provision "shell", inline: $getip, run: "always"
      vm1.vm.post_up_message = $postupmessage
      #vm1.vm.provision "shell", inline: "ip -4 addr sh eth1", run: "always"
    end

end

Déploiement de l’environnement :

$ vagrant up
....

Un moment plus tard ….
Disponible aussi via GitHub (avec les updates futures).

Note :
Nous avons besoin du cluster de Search Head, il ne faut pas oublier d’utiliser celui créer dans le précédent article.
Utiliser le splunk.secret et passwd identique de ceux utilisés par les SHC.

Configuration de Splunk :

Cluster Master / Manager Nodes :

Sur us2 :

$ cd /opt/splunk/etc/apps

$ mkdir -p myappclustermaster/local

$ vi myappclustermaster/local/server.conf
[general]
site = site1

[clustering]
mode = manager
multisite = true
available_sites = site1,site2
site_replication_factor = origin:1,total:2
site_search_factor = origin:1,total:2
pass4SymmKey = mysecuritykey2
cluster_label = idxclusterpoc
#To set default parameter
replication_factor=2
search_factor=2

Redémarrage de Splunk pour prise en compte des modifications :

$ sudo systemctl restart Splunkd

Indexers :

Comme nous allons mettre en place un cluster multi-site, il faut définir quel IDX sera sur quel site :

  • Site 1 : IDX 1 & 2
  • Site 2 : IDX 3 & 4

Il y a une configuration minimale à faire en local pour indiquer le site.
Site 1 :

$ cd /opt/splunk/etc/apps

$ mkdir -p myappclusteridxsite1/local

$ vi myappclusteridxsite1/local/server.conf
[general]
site = site1

Site 2 :

$ cd /opt/splunk/etc/apps

$ mkdir -p myappclusteridxsite2/local

$ vi myappclusteridxsite2/local/server.conf
[general]
site = site2

Et une autre app pour déclarer le Cluster Master, sur les 2 sites.

$ cd /opt/splunk/etc/apps

$ mkdir -p myappclusteridxcommon/local

$ vi myappclusteridxcommon/local/server.conf
[replication_port://9887]
disabled = false

[clustering]
manager_uri = https://us2.udmiot.lab:8089
mode = peer
pass4SymmKey = mysecuritykey2

Redémarrage de Splunk pour prise en compte :

$ sudo systemctl restart Splunkd

Vérifions l’état du cluster IDX : Depuis us2 (Cluster Master)

$ /opt/splunk/bin/splunk show cluster-status

 Replication factor met
 Search factor met
 All data is searchable
 Indexing Ready YES

 idx2 	 15E8906A-A42A-4100-ACFF-36331EDAFBFB	 site1 
	 Searchable YES
	 Status  Up
	 Bucket Count=7 

 idx3 	 5EC1F638-E8CC-48BC-9C4E-E1953BACDBC4	 site2 
	 Searchable YES
	 Status  Up
	 Bucket Count=6 

 idx4 	 676DC36E-DABC-410D-9A53-173208E62249	 site2 
	 Searchable YES
	 Status  Up
	 Bucket Count=6 

 idx1 	 A795DCB4-0B27-43CB-B461-836E132101D2	 site1 
	 Searchable YES
	 Status  Up
	 Bucket Count=5 

Nous allons ouvrir un port de collecte sur les IDX, pour cela nous allons passer par le Cluster Master pour déployer l’app. Sur us2 :

$ cd /opt/splunk/etc/master-apps

$ mkdir -p myappclusteridxcommon/local/

$ vi myappclusteridxcommon/local/inputs.conf
[splunktcp://9997]

Déployement sur les IDX :

$ /opt/splunk/bin/splunk apply cluster-bundle
Created new bundle with checksum=51C3FCC91493AC2C60D916C09EF5C2B3 
Applying new bundle. The peers may restart depending on the configurations in applied bundle.
Please run 'splunk show cluster-bundle-status' for checking the status of the applied bundle.
OK

Vérification du déployement du bundle sur les IDX.
Depuis us2 :

$ splunk show cluster-bundle-status

master
	 cluster_status=Rolling restart of the peers is in progress. 
	 active_bundle
		checksum=51C3FCC91493AC2C60D916C09EF5C2B3 
		timestamp=1629578526 (in localtime=Sat Aug 21 22:42:06 2021) 
	 latest_bundle
		checksum=51C3FCC91493AC2C60D916C09EF5C2B3 
		timestamp=1629578526 (in localtime=Sat Aug 21 22:42:06 2021) 
	 last_validated_bundle
		checksum=51C3FCC91493AC2C60D916C09EF5C2B3 
		last_validation_succeeded=1 
		timestamp=1629578526 (in localtime=Sat Aug 21 22:42:06 2021) 
	 last_check_restart_bundle
		last_check_restart_result=restart not required
		checksum= 
		timestamp=0 (in localtime=Thu Jan  1 01:00:00 1970) 

 idx2	 15E8906A-A42A-4100-ACFF-36331EDAFBFB	 site1 
	 active_bundle=829411021C544672C80B235A4AE56C12 
	 latest_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_validated_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_bundle_validation_status=success
	 restart_required_apply_bundle=1 
	 status=Restarting 

 idx3	 5EC1F638-E8CC-48BC-9C4E-E1953BACDBC4	 site2 
	 active_bundle=829411021C544672C80B235A4AE56C12 
	 latest_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_validated_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_bundle_validation_status=success
	 restart_required_apply_bundle=1 
	 status=Up 

 idx4	 676DC36E-DABC-410D-9A53-173208E62249	 site2 
	 active_bundle=829411021C544672C80B235A4AE56C12 
	 latest_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_validated_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_bundle_validation_status=success
	 restart_required_apply_bundle=1 
	 status=Up 

 idx1	 A795DCB4-0B27-43CB-B461-836E132101D2	 site1 
	 active_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 latest_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_validated_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_bundle_validation_status=success
	 restart_required_apply_bundle=0 
	 status=Up 

Note : Si la variable d’environnement $SPLUNK_HOME est bien paramétrée, il n’est pas obligatoire de mettre le PATH complet à la commande splunk.

Vérification sur un IDX :

$ sudo lsof -Pnni :9997
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
splunkd 6043 vagrant   69u  IPv4  44241      0t0  TCP \*:9997 (LISTEN)

Seach Head Cluster

Nous ne ferons pas d’affinité pour utiliser les 2 sites.
Via le Deployer us1 :

$ cd /opt/splunk/etc/shcluster/apps/

$ mkdir -p myappclustersearchbase/local

$ vi myappclustersearchbase/local/server.conf
[general]
#Disable affinity SH
site = site0

[clustering]
#Forcer les param qui sont à 3 pour le replication_factor
replication_factor=2
search_factor=2

multisite = true
manager_uri = https://us2.udmiot.lab:8089
mode = searchhead
pass4SymmKey = mysecuritykey2

Déployement sur les SHC

$ /opt/splunk/bin/splunk apply shcluster-bundle -target https://shc1.udmiot.lab:8089

Redémarrage de toutes les instances CM/IDX/SH :

$ sudo systemctl restart Splunkd

Envoie des logs des SH sur les IDX :

Depuis le Deployer us1 :

$ vi /opt/splunk/etc/shcluster/apps/myappclustersearchbase/local/outputs.conf
[tcpout:primary_indexers]
server = idx1.udmiot.lab:9997, idx2.udmiot.lab:9997,idx3.udmiot.lab:9997,idx4.udmiot.lab:9997

[tcpout]
defaultGroup = primary_indexers
forceTimebasedAutoLB = true
autoLBFrequency = 10
autoLBVolume = 512000

Déployement sur les SH

$ splunk apply shcluster-bundle -target https://shc1.udmiot.lab:8089

Envoie des logs des US sur les IDX :

Sur les US (Utility Server) us1 & us2.

$ cd /opt/splunk/etc/apps

$ mkdir -p myappforwardidx/local

$ vi myappforwardidx/local/outputs.conf
[tcpout:primary_indexers]
server = idx1.udmiot.lab:9997, idx2.udmiot.lab:9997,idx3.udmiot.lab:9997,idx4.udmiot.lab:9997

[tcpout]
defaultGroup = primary_indexers
forceTimebasedAutoLB = true
autoLBFrequency = 10
autoLBVolume = 512000

Note : en optimisation, on pourrait installer un DS (Deployement Server) pour simplifier.

Redémarrage de Splunk pour prise en compte :

$ sudo systemctl restart Splunkd

Vérifications :

Vérification que toutes les instances envoient bien leurs logs sur les IDX.
Sur une des SH, lancer une recherche SPL :

index=\_internal | stats count by host

Il devrait y avoir les différents hosts IDX/SH/US.

Etat du cluster IDX, depuis le CM sur us2 :

$ splunk show cluster-status
Your session is invalid.  Please login.
Splunk username: admin
Password: 

 Replication factor met
 Search factor met
 All data is searchable
 Indexing Ready YES

 idx2 	 15E8906A-A42A-4100-ACFF-36331EDAFBFB	 site1 
	 Searchable YES
	 Status  Up
	 Bucket Count=23 

 idx3 	 5EC1F638-E8CC-48BC-9C4E-E1953BACDBC4	 site2 
	 Searchable YES
	 Status  Up
	 Bucket Count=35 

 idx4 	 676DC36E-DABC-410D-9A53-173208E62249	 site2 
	 Searchable YES
	 Status  Up
	 Bucket Count=39 

 idx1 	 A795DCB4-0B27-43CB-B461-836E132101D2	 site1 
	 Searchable YES
	 Status  Up
	 Bucket Count=33 

Etat des bundles des IDX depuis le CM us2 :

$ splunk show cluster-bundle-status

master
	 cluster_status=None 
	 active_bundle
		checksum=51C3FCC91493AC2C60D916C09EF5C2B3 
		timestamp=1629578526 (in localtime=Sat Aug 21 22:42:06 2021) 
	 latest_bundle
		checksum=51C3FCC91493AC2C60D916C09EF5C2B3 
		timestamp=1629578526 (in localtime=Sat Aug 21 22:42:06 2021) 
	 last_validated_bundle
		checksum=51C3FCC91493AC2C60D916C09EF5C2B3 
		last_validation_succeeded=1 
		timestamp=1629578526 (in localtime=Sat Aug 21 22:42:06 2021) 
	 last_check_restart_bundle
		last_check_restart_result=restart not required
		checksum= 
		timestamp=0 (in localtime=Thu Jan  1 01:00:00 1970) 

 idx2	 15E8906A-A42A-4100-ACFF-36331EDAFBFB	 site1 
	 active_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 latest_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_validated_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_bundle_validation_status=success
	 restart_required_apply_bundle=0 
	 status=Up 

 idx3	 5EC1F638-E8CC-48BC-9C4E-E1953BACDBC4	 site2 
	 active_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 latest_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_validated_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_bundle_validation_status=success
	 restart_required_apply_bundle=0 
	 status=Up 

 idx4	 676DC36E-DABC-410D-9A53-173208E62249	 site2 
	 active_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 latest_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_validated_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_bundle_validation_status=success
	 restart_required_apply_bundle=0 
	 status=Up 

 idx1	 A795DCB4-0B27-43CB-B461-836E132101D2	 site1 
	 active_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 latest_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_validated_bundle=51C3FCC91493AC2C60D916C09EF5C2B3 
	 last_bundle_validation_status=success
	 restart_required_apply_bundle=0 
	 status=Up 

Tests :

Faisons tomber le service Splunk sur l’IDX 1 et regardons l’état depuis le CM us2 :

$ splunk show cluster-status

 Replication factor not met
 Search factor not met
 All data is searchable
 Indexing Ready YES

 idx2 	 15E8906A-A42A-4100-ACFF-36331EDAFBFB	 site1 
	 Searchable YES
	 Status  Up
	 Bucket Count=33 

 idx3 	 5EC1F638-E8CC-48BC-9C4E-E1953BACDBC4	 site2 
	 Searchable YES
	 Status  Up
	 Bucket Count=35 

 idx4 	 676DC36E-DABC-410D-9A53-173208E62249	 site2 
	 Searchable YES
	 Status  Up
	 Bucket Count=39 

 idx1 	 A795DCB4-0B27-43CB-B461-836E132101D2	 site1 
	 Searchable NO
	 Status  ShuttingDown
	 Bucket Count=33 

Le CM voit bien la perte de l’IDX1 et que le Réplication factor et Search factor ne sont plus satisfait.

Nous pouvons aussi le voir dans la GUI du CM, via le menu “Settings”, “Indexer clustering” :
Splunk CM en GUI avec IDX KO

Si nous attendans quelques instants (suivant la volumétrie…) et que nous relançons la commande :

$ splunk show cluster-status

 Replication factor met
 Search factor met
 All data is searchable
 Indexing Ready YES

 idx2 	 15E8906A-A42A-4100-ACFF-36331EDAFBFB	 site1 
	 Searchable YES
	 Status  Up
	 Bucket Count=44 

 idx3 	 5EC1F638-E8CC-48BC-9C4E-E1953BACDBC4	 site2 
	 Searchable YES
	 Status  Up
	 Bucket Count=35 

 idx4 	 676DC36E-DABC-410D-9A53-173208E62249	 site2 
	 Searchable YES
	 Status  Up
	 Bucket Count=39 

 idx1 	 A795DCB4-0B27-43CB-B461-836E132101D2	 site1 
	 Searchable NO
	 Status  Stopped
	 Bucket Count=0 

Le CM a fait le necessaire pour redistribuer les buckets manquants pour satisfaire le RF et SF.
Nous pouvons redémarrer le service Splunk de l’IDX 1 pour que tout revienne à la normale.
Dans le cadre de MAJ OS il peut être interessant de mettre en mode maintenance le CM pour qu’il n’effectue pas cette redistribution de buckets pour éviter un transfert de données important.