1. Introducción
La copia de seguridad periódica de los datos es una parte importante de cualquier despliegue de bases de datos de producción, que ayuda a garantizar la recuperación de los datos en caso de desastre y también minimiza la inconsistencia de los datos cuando se requiere una restauración.
Couchbase proporciona cbbackupmgr que se ha mejorado a lo largo de los años hasta convertirse en una herramienta de copia de seguridad y restauración de nivel empresarial para realizar copias de seguridad de grandes conjuntos de datos con un rendimiento mucho mayor, por lo que recomendamos utilizar esta herramienta en la producción. Cabe mencionar que en Servidor Couchbase 6.5 hemos revisado por completo el motor de copia de seguridad y almacenamiento, y hemos introducido una mayor relación de compresión, lo que ha mejorado mucho el rendimiento de la copia de seguridad y la restauración y ha reducido los requisitos de almacenamiento de cada instantánea de copia de seguridad, con el consiguiente ahorro de costes.
2. 2. Buenas prácticas
Aunque cbbackupmgr existe en Couchbase_HOME, es no Se recomienda ejecutar esta utilidad desde cualquiera de los nodos activos del cluster. Ya que estaría compitiendo por los recursos de las peticiones activas y podría potencialmente obstaculizar el rendimiento de su sistema de base de datos.
Es, por tanto, una buena práctica proporcionar una instancia separada (para las necesidades de copia de seguridad y restauración) con sólo los binarios de Couchbase instalados pero sin los servicios de Couchbase ejecutándose, para que los recursos puedan ser mejor gestionados tanto para el cluster de base de datos como para el nodo de copia de seguridad.

Como se puede ver en la figura anterior, se aprovisiona un nodo de copia de seguridad/restauración separado además de un clúster Couchbase de cinco nodos. Otra buena práctica es asignar suficiente espacio de almacenamiento para almacenar al menos 5 veces el tamaño del conjunto de datos de Couchbase. Objetivo del Punto de Recuperación (OPR) de la empresa.
3. Estrategia de copia de seguridad
cbbackupmgr ofrece un conjunto de comandos que permite a los administradores de bases de datos aplicar la estrategia de copia de seguridad que mejor se adapte a sus necesidades. Estos son algunos de los comandos:
- cbbackupmgr copia de seguridad – Copia de seguridad de los datos de un clúster Couchbase.
- cbbackupmgr compacto – Compacta una copia de seguridad
- cbbackupmgr fusionar – Fusiona las copias de seguridad
- cbbackupmgr config – Crea un nuevo repositorio de copias de seguridad
- cbbackupmgr list – Lista las copias de seguridad del archivo
Con estos comandos se puede aplicar cualquiera de las tres estrategias de copia de seguridad mencionadas en el documentación. En el siguiente ejemplo, describiremos Fusión periódica en el contexto de Couchbase Cluster ejecutándose en un entorno Kubernetes.
4. Fusión periódica
Esta estrategia de copia de seguridad pretende tener la menor sobrecarga de la base de datos, ya que requiere la menor cantidad de tiempo para realizar la copia de seguridad de los cambios y prácticamente ningún consumo de recursos del clúster de la base de datos para consolidar los datos durante el proceso de compactación y fusión (como ocurre en el nodo de copia de seguridad).
A grandes rasgos, así es como Fusión periódica estrategia funciona:
- Configurar el repositorio de copias de seguridad mediante cbbackupmgr config
- Realice una copia de seguridad incremental de la base de datos (en el repositorio) utilizando cbbackupmgr copia de seguridad
- Realizar la compactación de la copia de seguridad utilizando cbbackupmgr compacto para que el espacio en disco pueda utilizarse de forma eficiente.
- Fusionar las copias de seguridad más antiguas con cbbackupmgr fusionar para que el número de copias de seguridad en el repositorio no crezca infinitamente y las necesidades de espacio se mantengan bajo control.
Nota: Los pasos anteriores se recogen en el backup-with-periodic-merge.sh que luego utilizaremos en nuestra configuración de Kubernetes para realizar copias de seguridad periódicas.
5. Copia de seguridad de los datos de Couchbase
En mi último blog sobre Couchbase Autonomous Operator, he descrito paso a paso en cómo desplegar un clúster Couchbase autorreparable y de alta disponibilidad mediante Persistent Volumes. Suponiendo que haya seguido estos pasos y ya haya desplegado el clúster, los pasos siguientes describirán cómo puede configurar la capacidad de copia de seguridad automática utilizando cronjob
. Se considera una buena práctica hacer copias de seguridad de los datos con regularidad, así como probar la restauración de las copias de seguridad para confirmar el proceso de restauración antes de que sea realmente necesaria la recuperación en caso de desastre.
Esta funcionalidad no la proporciona el Operador y se deja en manos del administrador del clúster para que defina las políticas de copia de seguridad y pruebe la restauración de los datos. Esta sección describe algunos patrones comunes que pueden emplearse para realizar las funciones requeridas.
5.1. Crear clase de almacenamiento
Las definiciones de recursos de Kubernetes que se muestran a continuación ilustran una disposición típica para la copia de seguridad que guarda el estado de todo el clúster. Primero tendríamos que definir el recurso StorageClass
que formatearemos utilizando xfs
para un rendimiento óptimo.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Crear clase de almacenamiento para operaciones de copia de seguridad/restauración apiVersion: almacenamiento.k8s.io/v1 amable: StorageClass metadatos: etiquetas: k8s-complemento: almacenamiento-aws.complementos.k8s.io nombre: gp2-copia de seguridad-almacenamiento parámetros: tipo: gp2 fsType: xfs proveedor: kubernetes.io/aws-ebs reclaimPolicy: Conserve volumeBindingMode: WaitForFirstConsumer |
Utilizando la definición anterior en backup-sc.yaml podemos crear una clase de almacenamiento como ésta:
1 |
$ kubectl crear -f copia de seguridad-sc.yaml -n emart |
5.2. Crear Volumen Persistente
Un volumen persistente se reclama para mantener los datos a salvo en caso de interrupción. Deberá planificar el tamaño de la reclamación en función del tamaño previsto del conjunto de datos, el número de días de conservación de los datos y si se utilizan copias de seguridad incrementales.
1 2 3 4 5 6 7 8 9 10 11 12 |
# Definir volumen de almacenamiento de copia de seguridad amable: PersistentVolumeClaim apiVersion: v1 metadatos: nombre: copia de seguridad-pvc spec: storageClassName: gp2-copia de seguridad-almacenamiento recursos: solicita: almacenamiento: 50Gi accessModes: - LecturaEscrituraUnaVez |
Guardar la definición anterior en backup-pvc.yaml y crear la reclamación:
1 |
$ kubectl crear -f copia de seguridad-pvc.yaml -n emart |
5.3. Configurar el repositorio de copias de seguridad
Antes de que podamos empezar a tomar instantáneas de nuestros datos periódicamente, necesitamos configurar la ubicación del archivo de copia de seguridad. Se crea un trabajo para montar el volumen persistente e inicializar un repositorio de copias de seguridad. El repositorio se llama couchbase
que se asignará al nombre del clúster en especificaciones posteriores.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Crear un repositorio de copias de seguridad amable: Empleo apiVersion: lote/v1 metadatos: nombre: couchbase-grupo-copia de seguridad-config spec: plantilla: spec: contenedores: - nombre: copia de seguridad-config imagen: couchbase/servidor:empresa-6.5.0 comando: ["cbbackupmgr", "config", "--archivo", "/backups", "--repo", "couchbase"] volumeMounts: - nombre: "couchbase-cluster-backup-volume" mountPath: "/backups" volúmenes: - nombre: couchbase-grupo-copia de seguridad-volumen persistentVolumeClaim: claimName: copia de seguridad-pvc restartPolicy: Nunca |
Guardar la definición anterior en config.yaml y crear un repositorio de copias de seguridad:
1 |
$ kubectl crear -f config.yaml -n emart |
5.3. Ejecutar copia de seguridad como CronJob
Cree un cronjob como se describe en la sección periodic-backup.yaml que realiza una copia de seguridad del clúster Couchbase a) descargando el script de copia de seguridad en el pod b) ejecutando el script y realizando una copia de seguridad de los datos del clúster utilizando el volumen de almacenamiento persistente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
amable: CronJob apiVersion: lote/v1beta1 metadatos: nombre: couchbase-grupo-copia de seguridad-crear spec: horario: "*/5 * * * *" jobTemplate: spec: plantilla: spec: contenedores: #Borrar el script backup-with-periodic-merge para poder extraer uno nuevo con cada ejecución. - nombre: borrar-script imagen: couchbase/servidor:empresa-6.5.0 comando: ["rm", "/backups/backup-with-periodic-merge.sh"] volumeMounts: - nombre: "couchbase-cluster-backup-volume" mountPath: "/backups" initContainers: 1TP5Descarga el script de copia de seguridad del repositorio git - nombre: wget-copia de seguridad-script imagen: couchbase/servidor:empresa-6.5.0 comando: ["wget", "https://raw.githubusercontent.com/couchbaselabs/cboperator-hol/master/eks/cb-operator-guide/files/sh/backup-with-periodic-merge.sh", "-P", "/backups/."] volumeMounts: - nombre: "couchbase-cluster-backup-volume" mountPath: "/backups" #Cambiar el mod del script de backup a ejecución - nombre: chmod-script imagen: couchbase/servidor:empresa-6.5.0 comando: ["chmod", "700", "/backups/backup-with-periodic-merge.sh"] volumeMounts: - nombre: "couchbase-cluster-backup-volume" mountPath: "/backups" 1TP5Ejecutar el script para que haga a) Copia de seguridad b) Compactación c) Fusión con cada instantánea - nombre: periódico-fusionar imagen: couchbase/servidor:empresa-6.5.0 comando: ["sh", "-c" ,"/backups/backup-with-periodic-merge.sh --cluster cbdemo-srv.emart.svc"] volumeMounts: - nombre: "couchbase-cluster-backup-volume" mountPath: "/backups" volúmenes: - nombre: couchbase-grupo-copia de seguridad-volumen persistentVolumeClaim: claimName: copia de seguridad-pvc restartPolicy: Nunca |
En el YAML anterior estamos ejecutando la copia de seguridad cada 5 minutos, pero puede cambiar la frecuencia para que pueda cumplir con su RPO de negocio. Como nuestro cluster Couchbase está desplegado dentro del espacio de nombres emart
así que desplegaremos el cronjob de copia de seguridad bajo el mismo espacio de nombres:
1 2 3 |
$ kubectl aplicar -f periódico-copia de seguridad.yaml -n emart cronjob.lote/couchbase-grupo-copia de seguridad-crear creado |
5.4 Validar trabajo de copia de seguridad periódica
En este punto, puedes empezar a ver como el cronjob se activa cada 5 minutos. Y una vez que se activa se ejecutará tres initContainers
(wget-backup-script, chmod-script, periodic-merge) en orden secuencial seguidos de los comandos cointainers
(borrar-guión):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ kubectl consiga vainas -n emart -w NOMBRE LISTO ESTADO RESTARTS EDAD copia de seguridad-nodo 1/1 Ejecutar 0 1d cbdemo-0000 1/1 Ejecutar 0 5d cbdemo-0001 1/1 Ejecutar 0 5d cbdemo-0002 1/1 Ejecutar 0 5d cbdemo-0003 1/1 Ejecutar 0 5d cbdemo-0004 1/1 Ejecutar 0 5d couchbase-operador-7654d844cb-gn4bw 1/1 Ejecutar 0 5d couchbase-operador-admisión-7ff868f54c-5pklx 1/1 Ejecutar 0 5d couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg 0/1 Pendiente 0 2s couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg 0/1 Pendiente 0 2s couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg 0/1 Init:0/3 0 2s couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg 0/1 Init:1/3 0 3s couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg 0/1 Init:2/3 0 4s couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg 0/1 Init:2/3 0 6s couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg 0/1 PodInitializing 0 27s couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg 0/1 Completado 0 30s |
Puede ver los registros de cada initContainers
después de que el pod muestre el estado Completado. En initContainers
que nos interesa se llama fusión periódica
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
$ kubectl Registros couchbase-grupo-copia de seguridad-crear-1580357820-tz2hg -n emart -c periódico-fusionar --------------------------------------------------------- COMENZAR PASO 1: RESPALDO : Jue Jan 30 04:17:12 UTC 2020 Ejecutar copia de seguridad... Comando: cbbackupmgr copia de seguridad --archivo /copias de seguridad --repo couchbase --grupo couchbase://cbdemo-srv.emart.svc --username Administrator --password password --threads 2 Advertencia: Progreso bar desactivado porque terminal anchura es menos que 80 caracteres Copia de seguridad con éxito completado Respaldado arriba cubo "gamesim-sample" sucedió a Mutaciones copia de seguridad; 586, Mutaciones fallido a copia de seguridad: 0 Supresiones copia de seguridad: 0, Supresiones fallido a copia de seguridad: 0 Respaldado arriba cubo "viaje-muestra" sucedió a Mutaciones copia de seguridad; 0, Mutaciones fallido a copia de seguridad: 0 Supresiones copia de seguridad: 0, Supresiones fallido a copia de seguridad: 0 --------------------------------------------------------- COMENZAR PASO 2: COMPACCIÓN : Jue Jan 30 04:17:20 UTC 2020 Lista de copia de seguridad instantáneas ... 2020-01-28T23_01_37.592188562Z 2020-01-28T23_03_34.160387835Z 2020-01-28T23_05_08.103740281Z 2020-01-30T04_17_12.702824188Z Última copia de seguridad nombre es: 2020-01-30T04_17_12.702824188Z Compactación el copia de seguridad... Comando: cbbackupmgr compacto --archivo /copias de seguridad --repo couchbase --copia de seguridad 2020-01-30T04_17_12.702824188Z Compactación sucedió a, 0 bytes liberado --------------------------------------------------------- COMENZAR PASO 3: Fusión antiguo copia de seguridad : Jue Jan 30 04:17:24 UTC 2020 Talla Artículos Nombre 604,93MB - + couchbase 192,00 MB - + 2020-01-28T23_01_37.592188562Z 192,00 MB - + cerveza-muestra 37B 0 análisis.json 414B 0 cubo-config.json 192,00 MB 7303 + datos 192,00 MB 7303 1024 Fragmentos 2B 0 completo-texto.json 1.94KB 1 gsi.json 784B 1 vistas.json 192,02 MB - + 2020-01-28T23_03_34.160387835Z 192,02 MB - + viaje-muestra 0B 0 análisis.json 416B 0 cubo-config.json 192,00 MB 31591 + datos 192,00 MB 31591 1024 Fragmentos 2B 0 completo-texto.json 15.57KB 10 gsi.json 2B 0 vistas.json 64,02 MB - + 2020-01-28T23_05_08.103740281Z 64,02 MB - + viaje-muestra 0B 0 análisis.json 416B 0 cubo-config.json 64,00 MB 0 + datos 64,00 MB 0 1024 Fragmentos 2B 0 completo-texto.json 15.57KB 10 gsi.json 2B 0 vistas.json 156,89MB - + 2020-01-30T04_17_12.702824188Z 92,88 MB - + gamesim-muestra 0B 0 análisis.json 417B 0 cubo-config.json 92,88 MB 586 + datos 92,88 MB 586 1024 Fragmentos 2B 0 completo-texto.json 1,95 KB 1 gsi.json 501B 1 vistas.json 64,02 MB - + viaje-muestra 0B 0 análisis.json 416B 0 cubo-config.json 64,00 MB 0 + datos 64,00 MB 0 1024 Fragmentos 2B 0 completo-texto.json 15.57KB 10 gsi.json 2B 0 vistas.json Inicio 2020-01-28T23_01_37.592188562Z, FIN 2020-01-28T23_03_34.160387835Z Fusión antiguo copias de seguridad... Comando: cbbackupmgr fusionar --archivo /copias de seguridad --repo couchbase --iniciar 2020-01-28T23_01_37.592188562Z --fin 2020-01-28T23_03_34.160387835Z Fusión completado con éxito Talla Artículos Nombre 412,92MB - + couchbase 192,02 MB - + 2020-01-28T23_03_34.160387835Z 192,02 MB - + viaje-muestra 37B 0 análisis.json 416B 0 cubo-config.json 192,00 MB 31591 + datos 192,00 MB 31591 1024 Fragmentos 2B 0 completo-texto.json 15.57KB 10 gsi.json 2B 0 vistas.json 64,02 MB - + 2020-01-28T23_05_08.103740281Z 64,02 MB - + viaje-muestra 0B 0 análisis.json 416B 0 cubo-config.json 64,00 MB 0 + datos 64,00 MB 0 1024 Fragmentos 2B 0 completo-texto.json 15.57KB 10 gsi.json 2B 0 vistas.json 156,89MB - + 2020-01-30T04_17_12.702824188Z 92,88 MB - + gamesim-muestra 0B 0 análisis.json 417B 0 cubo-config.json 92,88 MB 586 + datos 92,88 MB 586 1024 Fragmentos 2B 0 completo-texto.json 1,95 KB 1 gsi.json 501B 1 vistas.json 64,02 MB - + viaje-muestra 0B 0 análisis.json 416B 0 cubo-config.json 64,00 MB 0 + datos 64,00 MB 0 1024 Fragmentos 2B 0 completo-texto.json 15.57KB 10 gsi.json 2B 0 vistas.json |
Nota: Como puede verse en los registros anteriores, antes del paso de fusión había cuatro copias de seguridad disponibles y después de la fusión hay tres instantáneas de copia de seguridad que se denominan RESTOREPOINTS
en backup-with-periodic-merge.sh guión.
Con esto concluye la sección de copias de seguridad.
6. Restauración de
Al igual que una copia de seguridad, podemos restaurar los datos a un nuevo clúster Couchbase con un trabajo de Kubernetes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
amable: Empleo apiVersion: lote/v1 metadatos: nombre: couchbase-grupo-restaurar spec: plantilla: spec: contenedores: - nombre: couchbase-grupo-restaurar imagen: couchbase/servidor:empresa-6.0.2 comando: ["cbbackupmgr", "restaurar", "--archivo", "/backups", "--repo", "couchbase", "--cluster", "couchbase://cbdemo-srv.emart.svc", "--username", "Administrador", "--contraseña", "contraseña"] volumeMounts: - nombre: "couchbase-cluster-backup-volume" mountPath: "/backups" volúmenes: - nombre: couchbase-grupo-copia de seguridad-volumen persistentVolumeClaim: claimName: copia de seguridad-pvc restartPolicy: Nunca |
Si prefiere crear un pod temporal de copia de seguridad-restauración para ver qué copias de seguridad están disponibles o para solucionar un problema, puede montar el mismo persistentVolumeClaim
a un nuevo pod. Esta es la definición del pod que se puede almacenar en backup-pod.yaml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
apiVersion: v1 amable: Pod metadatos: nombre: copia de seguridad-nodo spec: # especificación del contenido de la vaina contenedores: - nombre: copia de seguridad-vaina imagen: couchbase/servidor:empresa-6.5.0 # Sólo gira y espera para siempre comando: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 30; done;" ] volumeMounts: - nombre: "couchbase-cluster-backup-volume" mountPath: "/backups" volúmenes: - nombre: couchbase-grupo-copia de seguridad-volumen persistentVolumeClaim: claimName: copia de seguridad-pvc restartPolicy: Nunca |
Ejecute kubectl para abrir el pod temporalmente:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ kubectl aplicar -f br/copia de seguridad-vaina.yaml -n emart $ kubectl consiga vainas -n emart NOMBRE LISTO ESTADO RESTARTS EDAD copia de seguridad-nodo 1/1 Ejecutar 0 3d1h cbdemo-0000 1/1 Ejecutar 0 7d1h cbdemo-0001 1/1 Ejecutar 0 7d1h cbdemo-0002 1/1 Ejecutar 0 7d1h cbdemo-0003 1/1 Ejecutar 0 7d1h cbdemo-0004 1/1 Ejecutar 0 7d1h couchbase-operador-7654d844cb-gn4bw 1/1 Ejecutar 0 7d2h couchbase-operador-admisión-7ff868f54c-5pklx 1/1 Ejecutar 0 7d2h |
Una vez que el nodo de respaldo está en ejecución, podemos iniciar sesión en ese pod:
1 2 3 |
$ kubectl exec -it copia de seguridad-nodo -n emart -- /papelera/bash raíz@copia de seguridad-nodo:/ |
Y ejecutar cbbackupmgr list
para ver las copias de seguridad existentes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# cbbackupmgr list --repo couchbase --archive /backups Talla Artículos Nombre 256,04 MB - + couchbase 0B - + 2020-01-30T04_17_12.702824188Z 0B - + gamesim-muestra 0B 0 análisis.json 0B 0 + datos 0B 0 Error: no datos fragmentos eran encontrado 0B 0 completo-texto.json 0B 0 gsi.json 0B 0 vistas.json 128,02 MB - + 2020-01-30T04_18_13.021340423Z .... |
Y también puede ejecutar cbbackupmgr restaurar
manualmente:
1 |
# cbbackupmgr restore --archive /backups --repo couchbase --cluster couchbase://cbdemo-srv.emart.svc --username Administrator --password password |
Una vez que haya terminado de restaurar sólo tiene que eliminar el pod:
1 |
$ kubectl borrar -f copia de seguridad-vaina.yaml -n emart |
7. Conclusión
Examinamos paso a paso cómo se puede configurar un cronjob de copia de seguridad, que automatiza el proceso de tomar la copia de seguridad periódica en un intervalo predefinido. Utilizamos un backup-with-periodic-merge.sh que ejecuta a) la copia de seguridad, b) la compactación y c) la fusión en un único script. Este script se utilizó en el periodic-backup.yaml que automatizó el proceso de creación de copias de seguridad en el entorno Kubernetes. Esperamos que utilice las mejores prácticas descritas en este blog y planifique la realización de copias de seguridad periódicas, así como la validación de dichas copias mediante el comando de restauración con regularidad.