Backup von Indices

Werden in eigenen Bundles OpenSearch Indices angelegt, dann möchte man von diesen evtl. auch Sicherheitskopien erstellen. Dies kann über die Implementierung des Interfaces de.virtimo.bpc.api.BackupSupport realisiert werden.

Dies bietet folgende Vorteile

  • es wird einiges an Boilerplate Code vermieden

  • kann so konfiguriert werden, dass periodisch diese Backups angelegt werden

  • die Konfiguration erfolgt über die BPC Oberfläche (Backup Jobs)

  • über die BPC Oberfläche können die Indices wiederhergestellt bzw. gelöscht werden

Modulspezifische Backupeinstellung

Die Backupfunktionalität benötigt ein paar Informationen zur Ausführung der Sicherheitskopien. Dies wird über ein de.virtimo.bpc.api.BackupSetting zur Verfügung gestellt.

Folgend die Erläuterung der Parameter:

  • enabled - true|false je nachdem ob die Backups ausgeführt werden sollen oder nicht

  • intervalInSeconds - das Intervall in Sekunden in denen die Backups durchgeführt werden sollen. Bei einem Intervall von 86400 Sekunden wird alle 24 Stunden ein Backup der Indices angelegt.

  • keepBackupsDurationInSeconds - legt fest wie lange die Backups vorgehalten werden sollen. Bei einer festgelegten Dauer von 7776000 Sekunden werden Backups die älter als 90 Tage sind gelöscht.

  • indicesToBackup - die Namen (Alias) der zu sichernden OpenSearch Indices. Diese werden in einem sogenannten Snapshot zusammen gesichert.

Die Werte enabled, intervalInSeconds und keepBackupsDurationInSeconds dienen als Default Werte für den Backup Job der daraus erstellt wird und anschliessend über die BPC Oberfläche angepasst werden kann.

Umsetzung

In dem folgenden ExampleBaseModule.java Beispiel werden die drei Indices dein-index-name-1, dein-index-name-2 und dein-index-name-3 dem BPC Core als zu sichernde Indices mitgeteilt. Diese sollen in der Voreinstellung alle 24 Stunden (= 86400 Sekunden) gesichert und für maximal 90 Tage (= 7776000 Sekunden) aufbewahrt werden.

ExampleBaseModule.java
package com.company.example;

import de.virtimo.bpc.api.BackupSetting;
import de.virtimo.bpc.api.BackupSupport;
import de.virtimo.bpc.api.ModuleManager;
import de.virtimo.bpc.api.ModuleConfiguration;
import de.virtimo.bpc.api.ModuleInstance;
import de.virtimo.bpc.module.AbstractInstantiableModule;
import de.virtimo.bpc.module.ModuleConfigurationBuilder;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;

public abstract class ExampleBaseModule extends AbstractInstantiableModule implements BackupSupport {
    private static final Logger LOG = Logger.getLogger(ExampleBaseModule.class.getName());

    public ExampleBaseModule(ModuleManager moduleManager) {
        super(moduleManager);
    }

    // ................

    @Override
    public BackupSetting getBackupSetting() {
        return BackupSetting
                .withEnabled(true)
                .withIntervalInSeconds(86400)
                .withKeepBackupsDurationInSeconds(7776000)
                .withIndicesToBackup("dein-index-name-1", "dein-index-name-2", "dein-index-name-3")
                .build();
    }
}

Was muss bei Wiederherstellung beachtet werden?

Wird ein Backup wiederhergestellt, dann sollten in dieser Zeit keine Daten in die Indices geschrieben werden. Das dient dazu um Datenverlust und evtl. falsch angelegte OpenSearch Indices (kein Alias, falsche Index Einstellungen, falsches Index Mapping) zu vermeiden.

Wird das Schreiben durch REST-Endpunkte initiiert, dann kann man gleich dort einen Fehler zurückliefern oder man erstellt sich eine Queue und arbeitet diese ab, nachdem die Indices vom Backup wiederhergestellt wurden.

Wird vom BPC ein Backup wieder eingespielt, dann werden zuvor und danach Events gesendet auf die man im eigenen Modul reagieren kann. Folgend wird die Registrierung an einem Beispiel gezeigt.

package com.company.example;

import de.virtimo.bpc.api.BackupSetting;
import de.virtimo.bpc.api.BackupSupport;
import de.virtimo.bpc.api.EventRegistration;
import de.virtimo.bpc.api.ModuleManager;
import de.virtimo.bpc.api.ModuleConfiguration;
import de.virtimo.bpc.api.ModuleInstance;
import de.virtimo.bpc.module.AbstractInstantiableModule;
import de.virtimo.bpc.module.ModuleConfigurationBuilder;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;

public abstract class ExampleBaseModule extends AbstractInstantiableModule implements BackupSupport {
    private static final Logger LOG = Logger.getLogger(ExampleBaseModule.class.getName());

    private static final String INDEX_NAME = "dein-index-name";

    private final EventRegistration eventRegistration;

    public ExampleBaseModule(ModuleManager moduleManager) {
        super(moduleManager);

        this.eventRegistration = new EventRegistration(null);
    }

    @Override
    public void setModuleBundle(Bundle moduleBundle) {
        super.setModuleBundle(moduleBundle);

        BundleContext bundleContext = moduleBundle.getBundleContext();

        // register the event handlers
        eventRegistration.setBundleContext(bundleContext);
        eventRegistration.forRestoreBackupStartEvents(new RestoreBackupStartEventHandler());
        eventRegistration.forRestoreBackupDoneEvents(new RestoreBackupDoneEventHandler());
    }

    @Override
    public void destroy() {
        super.destroy();

        // unregister the event handlers
        eventRegistration.unregisterAllEventHandler();
    }

    private class RestoreBackupStartEventHandler extends AbstractRestoreBackupStartEventHandler {
        @Override
        public void processRestoreBackupStartEvent(RestoreBackupStartEvent restoreBackupStartEvent) {
            if (restoreBackupStartEvent.containsAlias(INDEX_NAME)) {
                // e.g. set a flag that a restore of your indices started
            }
        }
    }

    private class RestoreBackupDoneEventHandler extends AbstractRestoreBackupDoneEventHandler {
        @Override
        public void processRestoreBackupDoneEvent(RestoreBackupDoneEvent restoreBackupDoneEvent) {
            if (restoreBackupDoneEvent.containsAlias(INDEX_NAME)) {
                // e.g. set a flag that the restore of your indices is no longer processing
            }
        }
    }
}

Keywords: