App-ElasticSearch-Utilities
view release on metacpan or search on metacpan
scripts/es-daily-index-maintenance.pl view on Meta::CPAN
'optimize-days=i',
'index-basename=s',
'timezone=s',
'skip-alias=s@',
# Basic options
'help|h',
'manual|m',
);
#------------------------------------------------------------------------#
# Documentations!
pod2usage(-exitval => 0) if $opt{help};
pod2usage(-exitval => 0, -verbose => 2) if $opt{manual};
my %CFG = (
'optimize-days' => 1,
'delete-days' => 90,
'close-days' => 60,
'replicas-min' => 0,
'replicas-max' => 1,
'replicas-age' => 60,
timezone => 'UTC',
delete => 0,
close => 0,
bloom => 0,
optimize => 0,
replicas => 0,
'skip-alias' => [],
);
# Extract from our options if we've overridden defaults
foreach my $setting (keys %CFG) {
$CFG{$setting} = $opt{$setting} if exists $opt{$setting} and defined $opt{$setting};
}
# Figure out what to run
my @MODES = qw(close delete optimize replicas);
if ( exists $opt{all} && $opt{all} ) {
map {
$CFG{$_} = 1 unless $_ eq 'replicas';
} @MODES;
}
else {
my $operate = 0;
foreach my $mode (@MODES) {
$operate++ if $CFG{$mode};
last if $operate;
}
pod2usage(-message => "No operation selected, use --close, --delete, --optimize, or --replicas.", -exitval => 1) unless $operate;
}
# Set skip alias hash
push @{ $CFG{'skip-alias'} }, qw( .hold .do_not_erase );
my %SKIP = map { $_ => 1 } @{ $CFG{'skip-alias'} };
# Can't have replicas-min below 0
$CFG{'replicas-min'} = 0 if $CFG{'replicas-min'} < 0;
# Create the target uri for the ES Cluster
my $es = es_connect();
# This setting is no longer supported
output({color=>'red',sticky=>1,stderr=>1}, "WARNING: The index.codec.bloom.load is now disabled as of v1.4")
if $CFG{bloom};
# Ages for replica management
my $AGE = $CFG{'replicas-age'};
# Retrieve a list of indexes
my @indices = es_indices(
check_state => 0,
check_dates => 0,
);
# Loop through the indices and take appropriate actions;
my @alias_changes=();
foreach my $index (sort @indices) {
my $days_old = es_index_days_old( $index );
verbose({color=>"cyan"}, sprintf "%s: index is %s days old",
$index, defined $days_old ? $days_old : '(unknown)'
);
# If we can't calculate how old it is, skip it
if( !$days_old || $days_old < 1 ) {
verbose({color=>'magenta'},"$index for today, skipping.");
next;
}
# Get aliases from index root
my %aliases = ();
my $idx_meta = es_request($index);
if( exists $idx_meta->{$index}{aliases} ) {
my $skipped;
foreach my $alias ( keys %{ $idx_meta->{$index}{aliases} } ) {
$skipped = $alias if exists $SKIP{$alias};
last if $skipped;
}
if( $skipped ) {
output("$index contains a skipped alias: $skipped");
next;
}
}
# Delete the Index if it's too old
if( $CFG{delete} && $CFG{'delete-days'} <= $days_old ) {
output({color=>"red"}, "$index will be deleted.");
my $rc = es_delete_index($index);
next;
}
# Manage replicas
if( $CFG{replicas} ) {
my $replicas;
if( $days_old > $AGE ) {
$replicas = $CFG{'replicas-min'};
}
else {
my $daily = $CFG{'replicas-max'} / $AGE;
$replicas = ceil( $CFG{'replicas-max'} - ($daily * $days_old) );
$replicas = $replicas < $CFG{'replicas-min'} ? $CFG{'replicas-min'} : $replicas;
$replicas = $replicas > $CFG{'replicas-max'} ? $CFG{'replicas-max'} : $replicas;
}
my %shards = es_index_shards($index);
( run in 1.790 second using v1.01-cache-2.11-cpan-99c4e6809bf )