Correct elasticsearch host roles for small clusters

Previously, the number of masters was equal to the node count divided
by two and rounded up if an even number. This worked for cluster sizes
greater than 3 nodes but did not properly assign enough masters for a
3 node cluster, and did not handle special cases of single node clusters
that may exist in a test environment.

New code handles these edge cases and improves the comments around node
role assignment.

Correcting the number of masters has the side effect of also correcting
the layout of data nodes. A 3 node cluster will no longer exhibit an
unused node.

Change-Id: I2243a6c0163ab32e3c0def383a10244a34450530
This commit is contained in:
Jonathan Rosser 2018-06-19 09:42:44 +00:00 committed by Jonathan Rosser
parent cb479c10ff
commit 3c698f2426

View File

@ -1,25 +1,38 @@
---
# the master node count takes half the available nodes or sets it's self as 1
# storage node count is equal to the cluster size
- name: Node count fact
set_fact:
storage_node_count: "{{ groups['elastic-logstash'] | length }}"
tags:
- always
- name: Master node pre-count fact
set_fact:
_master_node_count: "{{ ((storage_node_count | int) > 1) | ternary((((storage_node_count | int) // 2) | int), 1) }}"
tags:
- always
# if the master node count is even, add one to it otherwise use the provided value
# the elasticserch cluster elects one master from all those which are marked as master-eligible
# 1 node cluster can only have one master
# 2 node clusters have 1 master-eligable nodes to avoid split-brain
# 3 node clusters have 3 master-eligable nodes
# >3 node clusters have (nodes // 2) eligable masters rounded up to the next odd number
- name: Master node count fact
set_fact:
master_node_count: "{{ ((_master_node_count | int) % 2 != 0) | ternary((_master_node_count | int), ((_master_node_count | int) + 1)) }}"
master_node_count: |-
{% set masters = 0 %}
{% if (storage_node_count | int) < 3 %}
{% set masters = 1 %}
{% elif (storage_node_count | int) == 3 %}
{% set masters = 3 %}
{% else %}
{% set masters = (storage_node_count | int ) // 2 %}
{% if ((masters | int) % 2 == 0) %}
{% set masters = (masters | int) + 1 %}
{% endif %}
{% endif %}
{{ masters }}
tags:
- always
# assign node roles
# the first 'master_node_count' hosts in groups['elastic-logstash'] become master-eligible nodes
# the first 'master_node_count' and subsequent alternate hosts in groups['elastic-logstash'] becomes data nodes
- name: Data nodes fact
set_fact:
data_nodes: "{{ (groups['elastic-logstash'][:master_node_count | int] + groups['elastic-logstash'][master_node_count | int::2]) }}"
@ -39,14 +52,7 @@
tags:
- always
- name: Data node count fact
set_fact:
data_node_count: "{{ data_nodes | length }}"
tags:
- always
# if the master node count is even, add one to it otherwise use the provided value
# set the data nodes to be all master and alternate through the remaining nodes
# based on the assignment of roles to hosts, set per host booleans
- name: Node enablement
set_fact:
master_node: "{{ (inventory_hostname in master_nodes) | ternary(true, false) }}"