С выпуском Kubernetes 1.8 Cronjobs перешли на бета-версию, что означает, что теперь мы можем более легко запускать задания резервного копирования Neo4j для кластеров Kubernetes.
Прежде чем мы научимся писать Cronjob, давайте сначала создадим локальный кластер Kubernetes и развернем Neo4j.
Spinup Kubernetes & Helm
|
1
2
|
minikube start --memory 8192helm 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 msAdded 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: PersistentVolumeClaimapiVersion: v1metadata: name: backupdir-neo4j labels: app: neo4j-backupspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi---apiVersion: batch/v1beta1kind: CronJobmetadata: name: neo4j-backupspec: 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 -wNAME DESIRED SUCCESSFUL AGEneo4j-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 kB2017-11-17 17:49:06.038+0000 INFO [o.n.c.s.StoreCopyClient] Done, copied 18 files2017-11-17 17:49:06.094+0000 INFO [o.n.b.BackupService] Start recovering store2017-11-17 17:49:07.669+0000 INFO [o.n.b.BackupService] Finish recovering storeDoing 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/backup2017-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 msAdded 1001 nodes, Set 1001 properties, Added 1001 labels |
И дождитесь запуска другого задания резервного копирования:
|
1
2
3
4
5
|
kubectl get jobs -wNAME DESIRED SUCCESSFUL AGEneo4j-backup-1510941180 1 1 2mneo4j-backup-1510941240 1 1 1mneo4j-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/backup2017-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, являются их собственными. |