diff --git a/Puppetfile b/Puppetfile --- a/Puppetfile +++ b/Puppetfile @@ -75,6 +75,10 @@ :git => 'https://forge.softwareheritage.org/source/puppet-elastic-elasticsearch', :ref => '6.4.0' +mod 'elastic_stack', + :git => 'https://forge.softwareheritage.org/source/puppet-elastic-elastic_stack', + :ref => '7.0.0' + mod 'extlib', :git => 'https://forge.softwareheritage.org/source/puppet-puppet-extlib', :tag => 'v4.1.0' diff --git a/data/common/common.yaml b/data/common/common.yaml --- a/data/common/common.yaml +++ b/data/common/common.yaml @@ -2865,32 +2865,61 @@ elasticsearch::config::jvm_options: - "-Xms%{lookup('elasticsearch::config::jvm_options::heap_size')}" - "-Xmx%{lookup('elasticsearch::config::jvm_options::heap_size')}" + - "14-:-XX:+UseG1GC" + - "14-:-XX:G1ReservePercent=25" + - "14-:-XX:InitiatingHeapOccupancyPercent=30" + +elasticsearch::config::jvm_options_extras: + - "#-XX:CMSInitiatingOccupancyFraction=75" + - "#-XX:+UseCMSInitiatingOccupancyOnly" + - "#-XX:+UseConcMarkSweepGC" + - "#-XX:+UseGCLogFileRotation" + - "#-XX:GCLogFileSize=64m" + - "#-XX:NumberOfGCLogFiles=32" + - "#-XX:+PrintGCDateStamps" + - "#--XX:+PrintTenuringDistribution" elasticsearch::config::cluster::name: swh-logging-prod elasticsearch::config::path::data: /srv/elasticsearch elasticsearch::config::path::logs: /var/log/elasticsearch elasticsearch::config::index::store::type: hybridfs elasticsearch::config::indices::memory::index_buffer_size: 50% -elasticsearch::config::discovery::seed_hosts: - - esnode1.internal.softwareheritage.org - - esnode2.internal.softwareheritage.org - - esnode3.internal.softwareheritage.org -elasticsearch::config::cluster::initial_master_nodes: - - esnode1 - - esnode2 - - esnode3 - -elasticsearch::config: - cluster.name: "%{alias('elasticsearch::config::cluster::name')}" + +elasticsearch::clusters: + es-nodes: + seed_hosts: + - esnode1.internal.softwareheritage.org + - esnode2.internal.softwareheritage.org + - esnode3.internal.softwareheritage.org + master_nodes: + - esnode1 + - esnode2 + - esnode3 + instances: + - swh_logging_prod + staging-swh: + seed_hosts: + - search-esnode0.internal.staging.swh.network + master_nodes: + - search-esnode0 + instances: + - swh_search + +swh::elasticsearch::instance::default_config: node.name: "%{::hostname}" - network.host: "%{alias('elasticsearch::config::network::host')}" - discovery.seed_hosts: "%{alias('elasticsearch::config::discovery::seed_hosts')}" - cluster.initial_master_nodes: "%{alias('elasticsearch::config::cluster::initial_master_nodes')}" - path.data: "%{alias('elasticsearch::config::path::data')}" - path.logs: "%{alias('elasticsearch::config::path::logs')}" - index.store.type: "%{alias('elasticsearch::config::index::store::type')}" indices.memory.index_buffer_size: "%{alias('elasticsearch::config::indices::memory::index_buffer_size')}" +swh::elasticsearch::instance::swh_logging_prod::config: + index.store.type: "%{alias('elasticsearch::config::index::store::type')}" + http_port: 9200 + transport.port: 9300 + path.data: /srv/elasticsearch + logdir: /var/log/elasticsearch + +swh::elasticsearch::instance::swh_search::config: + http_port: 9400 + transport.port: 9500 + logstash::listen_network: "%{lookup('internal_network')}" logstash::elasticsearch::hosts: "%{alias('elasticsearch::hosts')}" diff --git a/data/deployments/production/common.yaml b/data/deployments/production/common.yaml --- a/data/deployments/production/common.yaml +++ b/data/deployments/production/common.yaml @@ -1,2 +1,7 @@ swh::deploy::deposit::reverse_proxy::backend_http_host: "::1" swh::deploy::webapp::reverse_proxy::backend_http_host: "::1" + +elasticsearch::config::jvm_options_extras: + - -XX:+UseConcMarkSweepGC + - -XX:CMSInitiatingOccupancyFraction=75 + - -XX:+UseCMSInitiatingOccupancyOnly diff --git a/data/deployments/staging/common.yaml b/data/deployments/staging/common.yaml --- a/data/deployments/staging/common.yaml +++ b/data/deployments/staging/common.yaml @@ -249,14 +249,6 @@ elastic::elk_version: '7.9.3' -swh::elasticsearch::nodes: - - host: esnode1.internal.staging.swh.network - port: 9200 - elasticsearch::config::cluster::name: swh-logging-staging elasticsearch::config::network::host: 0.0.0.0 - -elasticsearch::config::discovery::seed_hosts: - - search-esnode0.internal.softwareheritage.org -elasticsearch::config::cluster::initial_master_nodes: - - search-esnode0 +elasticsearch::config::jvm_options::heap_size: 512m diff --git a/site-modules/profile/manifests/elasticsearch.pp b/site-modules/profile/manifests/elasticsearch.pp --- a/site-modules/profile/manifests/elasticsearch.pp +++ b/site-modules/profile/manifests/elasticsearch.pp @@ -6,6 +6,27 @@ $uid = 114; $gid = 119; + $version = lookup('elastic::elk_version') + $elasticsearch_config = lookup('elasticsearch::config') + $elasticsearch_extra_config = lookup('elasticsearch::config::extras', {default_value => {}}) + $jvm_options = lookup('elasticsearch::config::jvm_options') + $jvm_options_extras = lookup('elasticsearch::config::jvm_options_extras', {default_value => {}}) + + $path_data = lookup('elasticsearch::config::path::data') + + + $elasticsearch_clusters = lookup('elasticsearch::clusters', Hash) + + $elasticsearch_cluster = $elasticsearch_clusters.filter |$cluster, $data| { + member($data['seed_hosts'], $::swh_hostname['internal_fqdn']) + }.keys()[0] + + $cluster_config = $elasticsearch_clusters[$elasticsearch_cluster] + + $default_instance_config = lookup('swh::elasticsearch::instance::default_config') + $default_data_path = lookup('elasticsearch::config::path::data') + $default_log_path = lookup('elasticsearch::config::path::logs') + group { 'elasticsearch': ensure => 'present', gid => $gid, @@ -18,15 +39,6 @@ shell => '/bin/false', } - include ::profile::elastic::apt_config - - $elasticsearch_config = lookup('elasticsearch::config') - $elasticsearch_extra_config = lookup('elasticsearch::config::extras', {default_value => {}}) - $version = lookup('elastic::elk_version') - - $path_data = lookup('elasticsearch::config::path::data') - $jvm_options = lookup('elasticsearch::config::jvm_options') - file { $path_data: ensure => 'directory', owner => $uid, @@ -34,59 +46,35 @@ mode => '2755', } - apt::pin { 'elasticsearch': - packages => 'elasticsearch elasticsearch-oss', - version => $version, - priority => 1001, - } -> package { 'elasticsearch': - ensure => $version, - require => [ - User['elasticsearch'], - Class['::profile::elastic::apt_config'] - ] - } - - file { '/etc/elasticsearch/elasticsearch.yml': - ensure => file, - owner => $uid, - group => $gid, - mode => '0644', - content => inline_yaml($elasticsearch_config + $elasticsearch_extra_config), - require => Package['elasticsearch'], - notify => Service['elasticsearch'], + class { 'elasticsearch': + version => $version, + restart_on_change => true, + datadir => $path_data, + jvm_options => $jvm_options + $jvm_options_extras, } - concat {'es_jvm_options': - ensure => present, - path => '/etc/elasticsearch/jvm.options.d/jvm.options', - owner => $uid, - group => $gid, - mode => '0644', - ensure_newline => true, - require => Package['elasticsearch'], - notify => Service['elasticsearch'], - } + $cluster_config['instances'].each |$instance_name| { + $data_path = "${default_data_path}/${instance_name}" + $log_path = "${default_log_path}/${instance_name}" - $jvm_options.each |$index, $option| { - concat::fragment {"${index}_es_jvm_option": - target => 'es_jvm_options', - content => $option, - order => '00', + $additional_config = { + 'cluster.name' => $instance_name, + 'path.data' => $data_path, + 'path.logs' => $log_path, + 'network.host' => ip_for_network(lookup('internal_network')), + 'discovery.seed_hosts' => $cluster_config['seed_hosts'], + 'cluster.initial_master_nodes' => $cluster_config['master_nodes'], } - } - systemd::dropin_file { 'elasticsearch.conf': - unit => 'elasticsearch.service', - content => template('profile/swh/elasticsearch.conf.erb'), - notify => Service['elasticsearch'], - } + $instance_config = lookup("swh::elasticsearch::instance::${instance_name}::config") - service { 'elasticsearch': - ensure => running, - enable => true, - require => [ - Package['elasticsearch'], - File[$path_data], - ], + $config = $default_instance_config + $additional_config + $instance_config + # $instance_jvm_options = ??? + + elasticsearch::instance { $instance_name : + config => $config, + require => File[$path_data], + } } + }