当您在容器化环境中运行 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 上已弃用的功能。 我们强烈建议您不要在生产环境中使用此功能。 如果您需要更多信息,请联系我们

  1. 创建 docker 容器

    docker network create timescaledb-net
  2. 启动 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
  3. 在 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

  1. 使用有关容器的所需信息启动 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
  2. 启动备份

    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 和数据库。

  1. 创建 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
  2. 从基本备份恢复数据库文件

    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
  3. 重新创建配置文件。 这些文件从原始数据库实例备份。

    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.conf
    docker 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.conf
    docker 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'
  4. 创建一个 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 段。 然后您可以重新启动数据库,并检查恢复是否成功。

  1. 重新启动 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
  2. 重新启动 TimescaleDB docker 容器

    docker start timescaledb-recovered
  3. 验证数据库已启动并成功恢复

    docker logs timescaledb-recovered

    如果您在此阶段的日志中看到一些归档恢复错误,请不要担心。 发生这种情况是因为在存档中找不到更多文件之前,恢复不会完全完成。 有关更多信息,请参阅 PostgreSQL 文档中的持续归档

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面