当您在容器化环境中运行 TimescaleDB 时,您可以使用持续归档和 WAL-E 容器。 这些容器有时被称为 sidecar,因为它们与主容器并行运行。 WAL-E sidecar 镜像 可以与 TimescaleDB 以及常规 PostgreSQL 一起使用。 在本节中,您可以设置使用名为 timescaledb
的主 TimescaleDB 容器和名为 wale
的 WAL-E sidecar 将归档设置为本地文件系统。 当您准备好在生产部署中实施此操作时,您可以调整此处的说明,以针对 AWS S3 等云提供商执行归档,并在 Kubernetes 等编排框架中运行它。
在 Timescale 上免费试用
Timescale 是一项完全托管的服务,具有自动备份和恢复、具有复制功能的高可用性、无缝扩展和调整大小等等。 您可以免费试用 Timescale 三十天。
为了使 TimescaleDB 使用 WAL-E sidecar 进行归档,这两个容器需要共享一个网络。 为此,您需要创建一个 Docker 网络,然后使用新创建的网络启动启用归档功能的 TimescaleDB。 启动 TimescaleDB 时,您需要显式设置预写日志 (POSTGRES_INITDB_WALDIR
) 和数据目录 (PGDATA
) 的位置,以便您可以与 WAL-E sidecar 共享它们。 两者都必须驻留在 Docker 卷中,默认情况下,为 /var/lib/postgresql/data
创建一个卷。 启动 TimescaleDB 后,您可以登录并创建表和数据。
弃用
本节介绍 Timescale 上已弃用的功能。 我们强烈建议您不要在生产环境中使用此功能。 如果您需要更多信息,请联系我们。
创建 docker 容器
docker network create timescaledb-net启动 TimescaleDB,启用归档
docker run \--name timescaledb \--network timescaledb-net \-e POSTGRES_PASSWORD=insecure \-e POSTGRES_INITDB_WALDIR=/var/lib/postgresql/data/pg_wal \-e PGDATA=/var/lib/postgresql/data/pg_data \timescale/timescaledb:latest-pg10 postgres \-cwal_level=archive \-carchive_mode=on \-carchive_command="/usr/bin/wget wale/wal-push/%f -O -" \-carchive_timeout=600 \-ccheckpoint_timeout=700 \-cmax_wal_senders=1在 Docker 中运行 TimescaleDB
docker exec -it timescaledb psql -U postgres
WAL-E Docker 镜像 运行一个 Web 端点,该端点通过 HTTP API 接受 WAL-E 命令。 这允许 PostgreSQL 通过内部网络与 WAL-E sidecar 通信以触发归档。 您还可以使用容器直接调用 WAL-E。 Docker 镜像接受标准的 WAL-E 环境变量来配置归档后端,因此您可以从 AWS S3 等服务发出命令。 有关配置的信息,请参阅官方 WAL-E 文档。
为了使 WAL-E docker 镜像能够执行归档,它需要使用与 TimescaleDB 容器相同的网络和数据卷。 它还需要知道预写日志和数据目录的位置。 您可以在启动 WAL-E 时将所有这些信息传递给它。 在此示例中,WAL-E 镜像在 timescaledb-net
内部网络的端口 80 上侦听命令,并将备份写入 Docker 主机上的 ~/backups
。
使用有关容器的所需信息启动 WAL-E 容器。 在此示例中,容器名为
timescaledb-wale
docker run \--name wale \--network timescaledb-net \--volumes-from timescaledb \-v ~/backups:/backups \-e WALE_LOG_DESTINATION=stderr \-e PGWAL=/var/lib/postgresql/data/pg_wal \-e PGDATA=/var/lib/postgresql/data/pg_data \-e PGHOST=timescaledb \-e PGPASSWORD=insecure \-e PGUSER=postgres \-e WALE_FILE_PREFIX=file://#/backups \timescale/timescaledb-wale:latest启动备份
docker exec wale wal-e backup-push /var/lib/postgresql/data/pg_data或者,您可以使用 sidecar 的 HTTP 端点启动备份。 这需要通过将其映射到开放端口来公开 Docker 主机上的 sidecar 的端口 80。 在此示例中,它映射到端口 8080
curl https://#:8080/backup-push
您应该每天定期执行基本备份,以最大限度地减少 WAL-E 重放量,并加快恢复速度。 要创建新的基本备份,请重新触发此处显示的基本备份,手动或按计划进行。 如果您在 Kubernetes 上运行 TimescaleDB,则内置支持计划 cron 作业,这些作业可以使用 WAL-E 容器的 HTTP API 调用基本备份。
要从备份存档恢复数据库实例,请创建一个新的 TimescaleDB 容器,并从基本备份中恢复数据库和配置文件。 然后,您可以重新启动 sidecar 和数据库。
创建 docker 容器
docker create \--name timescaledb-recovered \--network timescaledb-net \-e POSTGRES_PASSWORD=insecure \-e POSTGRES_INITDB_WALDIR=/var/lib/postgresql/data/pg_wal \-e PGDATA=/var/lib/postgresql/data/pg_data \timescale/timescaledb:latest-pg10 postgres从基本备份恢复数据库文件
docker run -it --rm \-v ~/backups:/backups \--volumes-from timescaledb-recovered \-e WALE_LOG_DESTINATION=stderr \-e WALE_FILE_PREFIX=file://#/backups \timescale/timescaledb-wale:latest \wal-e \backup-fetch /var/lib/postgresql/data/pg_data LATEST重新创建配置文件。 这些文件从原始数据库实例备份。
docker run -it --rm \--volumes-from timescaledb-recovered \timescale/timescaledb:latest-pg10 \cp /usr/local/share/postgresql/pg_ident.conf.sample /var/lib/postgresql/data/pg_data/pg_ident.confdocker run -it --rm \--volumes-from timescaledb-recovered \timescale/timescaledb:latest-pg10 \cp /usr/local/share/postgresql/postgresql.conf.sample /var/lib/postgresql/data/pg_data/postgresql.confdocker run -it --rm \--volumes-from timescaledb-recovered \timescale/timescaledb:latest-pg10 \sh -c 'echo "local all postgres trust" > /var/lib/postgresql/data/pg_data/pg_hba.conf'创建一个
recovery.conf
文件,告诉 PostgreSQL 如何恢复docker run -it --rm \--volumes-from timescaledb-recovered \timescale/timescaledb:latest-pg10 \sh -c 'echo "restore_command='\''/usr/bin/wget wale/wal-fetch/%f -O -'\''" > /var/lib/postgresql/data/pg_data/recovery.conf'
当您恢复数据和配置文件,并创建恢复配置文件后,您可以重新启动 sidecar。 您可能需要先删除旧的 sidecar。 当您重新启动 sidecar 时,它会重放基本备份中可能缺少的最后一个 WAL 段。 然后您可以重新启动数据库,并检查恢复是否成功。
重新启动 WAL-E sidecar
docker run \--name wale \--network timescaledb-net \-v ~/backups:/backups \--volumes-from timescaledb-recovered \-e WALE_LOG_DESTINATION=stderr \-e PGWAL=/var/lib/postgresql/data/pg_wal \-e PGDATA=/var/lib/postgresql/data/pg_data \-e PGHOST=timescaledb \-e PGPASSWORD=insecure \-e PGUSER=postgres \-e WALE_FILE_PREFIX=file://#/backups \timescale/timescaledb-wale:latest重新启动 TimescaleDB docker 容器
docker start timescaledb-recovered验证数据库已启动并成功恢复
docker logs timescaledb-recovered如果您在此阶段的日志中看到一些归档恢复错误,请不要担心。 发生这种情况是因为在存档中找不到更多文件之前,恢复不会完全完成。 有关更多信息,请参阅 PostgreSQL 文档中的持续归档。
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面。