
The list of elasticsearch hosts was being randomized too much which results in the a performance issue. This change reduces the entropy and ensures that the list of hosts is correctly ordered such that localhost is always used first and other nodes in the cluster will be used as a fall back. Change-Id: Ifb551a6e01b5c0e1f62c1466a3d5b344a3c5da97 Signed-off-by: Kevin Carter <kevin.carter@rackspace.com>
121 lines
5.3 KiB
YAML
121 lines
5.3 KiB
YAML
---
|
|
# Copyright 2018, Rackspace US, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
# storage node count is equal to the cluster size
|
|
storage_node_count: "{{ groups['elastic-logstash'] | length }}"
|
|
|
|
# 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
|
|
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 }}
|
|
|
|
# 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
|
|
data_nodes: "{{ (groups['elastic-logstash'][:master_node_count | int] + groups['elastic-logstash'][master_node_count | int::2]) }}"
|
|
master_nodes: "{{ groups['elastic-logstash'][:master_node_count | int] }}"
|
|
coordination_nodes: >-
|
|
{{
|
|
(groups['kibana'] | map('extract', hostvars, 'ansible_host') | list)
|
|
| map('regex_replace', '(.*)' ,'\1:' ~ elastic_port)
|
|
| list
|
|
}}
|
|
zen_nodes: >-
|
|
{{
|
|
(groups['elastic-logstash'] | union(groups['kibana'])) | map('extract', hostvars, 'ansible_host') | list | shuffle(seed=inventory_hostname)
|
|
}}
|
|
elasticserch_interface_speed: |-
|
|
{% set default_interface_fact = hostvars[inventory_hostname]['ansible_' + (elastic_data_interface | replace('-', '_'))] %}
|
|
{% set speeds = [] %}
|
|
{% if default_interface_fact['type'] == 'bridge' %}
|
|
{% for interface in default_interface_fact['interfaces'] %}
|
|
{% set interface_fact = hostvars[inventory_hostname]['ansible_' + (interface | replace('-', '_'))] %}
|
|
{% if 'speed' in interface_fact %}
|
|
{% set speed = (interface_fact['speed'] | default(1000)) | string %}
|
|
{% if speed == "-1" %}
|
|
{% set _ = speeds.append(1000) %}
|
|
{% else %}
|
|
{% set _ = speeds.append(speed | int) %}
|
|
{% endif %}
|
|
{% if 'module' in interface_fact %}
|
|
{% set _ = speeds.append((interface_fact['speed'] | default(1000)) | int) %}
|
|
{% else %}
|
|
{% set _ = speeds.append(1000) %}
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% else %}
|
|
{% if ('module' in default_interface_fact) or (default_interface_fact['type'] == 'bond') %}
|
|
{% set speed = (default_interface_fact['speed'] | default(1000)) | string %}
|
|
{% if speed == "-1" %}
|
|
{% set _ = speeds.append(1000) %}
|
|
{% else %}
|
|
{% set _ = speeds.append(speed | int) %}
|
|
{% endif %}
|
|
{% else %}
|
|
{% set _ = speeds.append(1000) %}
|
|
{% endif %}
|
|
{% endif %}
|
|
{% set interface_speed = ((speeds | min) * 0.20) | int %}
|
|
{{ ((interface_speed | int) > 750) | ternary(750, interface_speed) }}
|
|
elasticsearch_data_node_details: >-
|
|
{{
|
|
(data_nodes | map('extract', hostvars, 'ansible_host') | list) | map('regex_replace', '(.*)' ,'\1:' ~ elastic_port) | list
|
|
}}
|
|
logstash_data_node_details: >-
|
|
{{
|
|
(data_nodes | map('extract', hostvars, 'ansible_host') | list) | map('regex_replace', '(.*)' ,'\1:' ~ logstash_beat_input_port) | list
|
|
}}
|
|
|
|
# based on the assignment of roles to hosts, set per host booleans
|
|
master_node: "{{ (inventory_hostname in master_nodes) | ternary(true, false) }}"
|
|
data_node: "{{ (inventory_hostname in data_nodes) | ternary(true, false) }}"
|
|
|
|
elastic_processors_floor: "{{ ((ansible_processor_count | int) - 1) }}"
|
|
elastic_processors_floor_set: "{{ ((elastic_processors_floor | int) > 0) | ternary(elastic_processors_floor, 1) }}"
|
|
elastic_thread_pool_size: "{{ ((ansible_processor_count | int) >= 24) | ternary(23, elastic_processors_floor_set) }}"
|
|
|
|
# Set a data node facts. The data nodes, in the case of elasticsearch are also
|
|
# ingest nodes.
|
|
elasticsearch_number_of_replicas: "{{ ((data_nodes | length) > 2) | ternary('2', ((data_nodes | length) > 1) | ternary('1', '0')) }}"
|
|
elasticsearch_data_hosts: |-
|
|
{% set nodes = elasticsearch_data_node_details %}
|
|
{% set data_hosts = nodes | shuffle(seed=inventory_hostname) %}
|
|
{% if inventory_hostname in data_nodes %}
|
|
{% set _ = nodes.insert(0, '127.0.0.1:' ~ elastic_port) %}
|
|
{% endif %}
|
|
{{ data_hosts }}
|
|
logstash_data_hosts: |-
|
|
{% set nodes = logstash_data_node_details %}
|
|
{% set data_hosts = nodes | shuffle(seed=inventory_hostname) %}
|
|
{% if inventory_hostname in data_nodes %}
|
|
{% set _ = nodes.insert(0, '127.0.0.1:' ~ logstash_beat_input_port) %}
|
|
{% endif %}
|
|
{{ data_hosts }}
|