Google Cloud Container Engine で実行されているPostgresデータベースをバックアップするためのベストプラクティスは何ですか?
私の考えは、バックアップを Google Cloud Storage に保存することに取り組んでいますが、ディスク/ポッドをストレージバケットに接続する方法がわかりません。
次の構成を使用して、KubernetesクラスターでPostgresを実行しています。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: postgres-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: postgres
spec:
containers:
- image: postgres:9.6.2-Alpine
imagePullPolicy: IfNotPresent
env:
- name: PGDATA
value: /var/lib/postgresql/data
- name: POSTGRES_DB
value: my-database-name
- name: POSTGRES_PASSWORD
value: my-password
- name: POSTGRES_USER
value: my-database-user
name: postgres-container
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql
name: my-postgres-volume
volumes:
- gcePersistentDisk:
fsType: ext4
pdName: my-postgres-disk
name: my-postgres-volume
バックアップを実行するために ジョブ を作成しようとしました:
apiVersion: batch/v1
kind: Job
metadata:
name: postgres-dump-job
spec:
template:
metadata:
labels:
app: postgres-dump
spec:
containers:
- command:
- pg_dump
- my-database-name
# `env` value matches `env` from previous configuration.
image: postgres:9.6.2-Alpine
imagePullPolicy: IfNotPresent
name: my-postgres-dump-container
volumeMounts:
- mountPath: /var/lib/postgresql
name: my-postgres-volume
readOnly: true
restartPolicy: Never
volumes:
- gcePersistentDisk:
fsType: ext4
pdName: my-postgres-disk
name: my-postgres-volume
(私が理解している限り)これは pg_dump
コマンドを実行し、バックアップデータをstdout(kubectl logs
に表示されるはずです)に出力する必要があります。
余談ですが、(kubectl get pods
を使用して)ポッドを検査すると、ポッドが「保留」状態から脱出しないことが示されます。これは、ジョブを開始するための十分なリソースがないために発生します。
このプロセスをジョブとして実行することは正しいですか?ジョブをGoogle Cloud Storageに接続するにはどうすればよいですか?それとも私は完全に違うことをするべきですか?
データベースコンテナーでpg_dump
を(kubectl exec
を使用して)パフォーマンスヒットのために実行するのは賢明ではないと思いますが、開発/ステージングサーバーではこれで問題ありませんか?
Pg_dumpをジョブとして実行することは良い考えだと思いますが、DBの永続ディスクに直接接続することはできません。 pg_dumpをネットワーク経由でDBに接続してみてください。次に、pg_dumpコマンドがバックアップをダンプする2番目のディスクを作成できます。安全のために、この2番目のディスクの定期的なスナップショットを作成できます。
@Marco Laminaが言ったように、あなたはpostgresポッドでpg_dumpを実行することができます
DUMP
// pod-name name of the postgres pod
// postgres-user database user that is able to access the database
// database-name name of the database
kubectl exec [pod-name] -- bash -c "pg_dump -U [postgres-user] [database-name]" > database.sql
RESTORE
// pod-name name of the postgres pod
// postgres-user database user that is able to access the database
// database-name name of the database
cat database.sql | kubectl exec -i [pod-name] -- psql -U [postgres-user] -d [database-name]
このコマンドを実行し、これをAWSs3などのファイルストレージシステムにエクスポートするジョブポッドを作成できます。
Jobs PODがPending
状態を維持する理由は、GCE永続ディスクの接続/マウントを永遠に試み、すでに別のPODに接続/マウントされているために失敗しているためです。
永続ディスクを複数のPODに接続することは、それらすべてがボリュームを読み取り専用モードで接続/マウントする場合にのみサポートされます。もちろん、これは実行可能な解決策ではありません。
GCEを使用したことはありませんが、GCE内からPDからスナップショットを簡単に作成できるはずです。これでは、「クラッシュした」状態のような、非常にクリーンなバックアップは得られません。途中で、しかし回復可能です」しかし、これはおそらくあなたのために許容可能です。
データベースPOD内でpg_dump
を実行することは実行可能なソリューションですが、すでに気付いたようにいくつかの欠点、特にパフォーマンスがあります。また、結果のバックアップを後でPODから移動する必要があります。 kubectl cp
と別のexec
を使用して、PODのバックアップをクリーンアップします。