Статьи

Kubernetes 1.8: Использование Cronjobs для создания резервных копий Neo4j

С выпуском Kubernetes 1.8 Cronjobs перешли на бета-версию, что означает, что теперь мы можем более легко запускать задания резервного копирования Neo4j для кластеров Kubernetes.

Прежде чем мы научимся писать Cronjob, давайте сначала создадим локальный кластер Kubernetes и развернем Neo4j.

Spinup Kubernetes & Helm

1
2
minikube start --memory 8192
helm init && kubectl rollout status -w deployment/tiller-deploy --namespace=kube-system

Развернуть кластер Neo4j

1
2
helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
helm install incubator/neo4j --name neo-helm --wait --set authEnabled=false,core.extraVars.NEO4J_dbms_backup_address=0.0.0.0:6362

Заполните наш кластер данными

Мы можем выполнить следующую команду, чтобы проверить, готов ли наш кластер:

01
02
03
04
05
06
07
08
09
10
11
kubectl exec neo-helm-neo4j-core-0 \
  -- bin/cypher-shell --format verbose \
  "CALL dbms.cluster.overview() YIELD id, role RETURN id, role"
  
+-----------------------------------------------------+
| id                                     | role       |
+-----------------------------------------------------+
| "0b3bfe6c-6a68-4af5-9dd2-e96b564df6e5" | "LEADER"   |
| "09e9bee8-bdc5-4e95-926c-16ea8213e6e7" | "FOLLOWER" |
| "859b9b56-9bfc-42ae-90c3-02cedacfe720" | "FOLLOWER" |
+-----------------------------------------------------+

Теперь давайте создадим некоторые данные:

1
2
3
4
5
6
kubectl exec neo-helm-neo4j-core-0 \
  -- bin/cypher-shell --format verbose \
  "UNWIND range(0,1000) AS id CREATE (:Person {id: id})"
  
0 rows available after 653 ms, consumed after another 0 ms
Added 1001 nodes, Set 1001 properties, Added 1001 labels

Теперь, когда наш кластер Neo4j работает и содержит данные, мы хотим регулярно делать резервные копии.

Резервные копии Neo4j

Инструмент резервного копирования Neo4j поддерживает полное и инкрементное резервное копирование.

Полная резервная копия

Полная резервная копия передает потоковую копию файлов хранилища в место резервного копирования и все транзакции, которые произошли во время резервного копирования. Эти транзакции затем применяются к резервной копии базы данных.

Инкрементное резервное копирование

Инкрементное резервное копирование запускается, если в хранилище резервных копий уже есть база данных Neo4j. В этом случае не будет копирования файлов магазина. Вместо этого инструмент будет копировать любые новые транзакции из Neo4j и применять их к резервной копии.

Резервное копирование

Мы будем использовать Cronjob для выполнения резервного копирования. В приведенном ниже примере мы присоединяем PersistentVolumeClaim к нашему Cronjob, чтобы мы могли видеть оба сценария резервного копирования в действии.

01
02
03
04
05
06
07
08
09
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
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: backupdir-neo4j
  labels:
    app: neo4j-backup
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: neo4j-backup
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          volumes:
            - name: backupdir-neo4j
              persistentVolumeClaim:
                claimName: backupdir-neo4j
          containers:
            - name: neo4j-backup
              image: neo4j:3.3.0-enterprise
              env:
                - name: NEO4J_ACCEPT_LICENSE_AGREEMENT
                  value: "yes"
              volumeMounts:
              - name: backupdir-neo4j
                mountPath: /tmp
              command: ["bin/neo4j-admin""backup", "--backup-dir", "/tmp", "--name", "backup", "--from", "neo-helm-neo4j-core-2.neo-helm-neo4j.default.svc.cluster.local:6362"]
          restartPolicy: OnFailure
1
2
$ kubectl apply -f cronjob.yaml
cronjob "neo4j-backup" created
1
2
3
kubectl get jobs -w
NAME                      DESIRED   SUCCESSFUL   AGE
neo4j-backup-1510940940   1         1            34s

Теперь давайте посмотрим журналы с работы:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
kubectl logs $(kubectl get pods -a --selector=job-name=neo4j-backup-1510940940 --output=jsonpath={.items..metadata.name})
  
Doing full backup...
2017-11-17 17:49:05.920+0000 INFO [o.n.c.s.StoreCopyClient] Copying neostore.nodestore.db.labels
...
2017-11-17 17:49:06.038+0000 INFO [o.n.c.s.StoreCopyClient] Copied neostore.labelscanstore.db 48.00 kB
2017-11-17 17:49:06.038+0000 INFO [o.n.c.s.StoreCopyClient] Done, copied 18 files
2017-11-17 17:49:06.094+0000 INFO [o.n.b.BackupService] Start recovering store
2017-11-17 17:49:07.669+0000 INFO [o.n.b.BackupService] Finish recovering store
Doing consistency check...
2017-11-17 17:49:07.716+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] Selected RecordFormat:StandardV3_2[v0.A.8] record format from store /tmp/backup
2017-11-17 17:49:07.716+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] Format not configured. Selected format from the store: RecordFormat:StandardV3_2[v0.A.8]
2017-11-17 17:49:07.755+0000 INFO [o.n.m.MetricsExtension] Initiating metrics...
....................  10%
...
.................... 100%
Backup complete.

Пока все хорошо. Теперь давайте создадим больше данных:

1
2
3
4
5
6
7
kubectl exec neo-helm-neo4j-core-0 \
  -- bin/cypher-shell --format verbose \
  "UNWIND range(0,1000) AS id CREATE (:Person {id: id})"
  
  
0 rows available after 114 ms, consumed after another 0 ms
Added 1001 nodes, Set 1001 properties, Added 1001 labels

И дождитесь запуска другого задания резервного копирования:

1
2
3
4
5
kubectl get jobs -w
NAME                      DESIRED   SUCCESSFUL   AGE
neo4j-backup-1510941180   1         1            2m
neo4j-backup-1510941240   1         1            1m
neo4j-backup-1510941300   1         1            17s
01
02
03
04
05
06
07
08
09
10
11
kubectl logs $(kubectl get pods -a --selector=job-name=neo4j-backup-1510941300 --output=jsonpath={.items..metadata.name})
  
Destination is not empty, doing incremental backup...
Doing consistency check...
2017-11-17 17:55:07.958+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] Selected RecordFormat:StandardV3_2[v0.A.8] record format from store /tmp/backup
2017-11-17 17:55:07.959+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] Format not configured. Selected format from the store: RecordFormat:StandardV3_2[v0.A.8]
2017-11-17 17:55:07.995+0000 INFO [o.n.m.MetricsExtension] Initiating metrics...
....................  10%
...
.................... 100%
Backup complete.

Если бы мы продлили эту работу дальше, мы могли бы скопировать каждую резервную копию, которую требуется, в корзину S3, но я оставлю это на следующий день.

Опубликовано на Java Code Geeks с разрешения Марка Нидхэма, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Kubernetes 1.8: Использование Cronjobs для создания резервных копий Neo4j

Мнения, высказанные участниками Java Code Geeks, являются их собственными.