wal-g/wal-g

GitHub: wal-g/wal-g

WAL-G 是一款云数据库备份归档与恢复工具,帮助运维团队高效完成数据库的持续备份、压缩、加密和时间点恢复。

Stars: 4174 | Forks: 560

# WAL-G ![Docker-tests-status](https://static.pigsec.cn/wp-content/uploads/repos/cas/3c/3cee14c4df063f4aae4c4cc9559f174f082d1b9c974f86ed58d38af5d8b2b6da.svg) ![Unit-tests-status](https://static.pigsec.cn/wp-content/uploads/repos/cas/53/539b67f03efa5698f098650ffa904c29d472b033ae31dd1352369219f6fb4a56.svg) [![Go Report Card](https://goreportcard.com/badge/github.com/wal-g/wal-g)](https://goreportcard.com/report/github.com/wal-g/wal-g) [![Documentation Status](https://readthedocs.org/projects/wal-g/badge/?version=latest)](https://wal-g.readthedocs.io/?badge=latest) [本文档也可在 wal-g.readthedocs.io 查看](https://wal-g.readthedocs.io) WAL-G 是一款用于 PostgreSQL、MySQL/MariaDB 和 MS SQL Server 的归档恢复工具(也支持 MongoDB 和 Redis 的 beta 版本)。 WAL-G 是 WAL-E 的继任者,两者存在一些关键差异。WAL-G 使用 LZ4、LZMA、ZSTD 或 Brotli 压缩算法,支持多处理器以及 Postgres 的非独占基础备份。有关 WAL-G 最初设计和实现的更多信息,请参阅 Citus Data 博客中的文章 ["Citus 推出 WAL-G:更快的 Postgres 灾难恢复"](https://www.citusdata.com/blog/2017/08/18/introducing-wal-g-faster-restores-for-postgres/)。 **目录** - [安装](#installation) - [配置](#configuration) - [用法](#usage) - [数据库](#databases) - [开发](#development) - [安装说明](#installing) - [测试](#testing) - [Windows 开发](#development-on-windows) - [故障排除](#troubleshooting) - [作者](#authors) - [许可证](#license) - [致谢](#acknowledgments) - [交流群](#chat) ## 安装 最新版本 WAL-G 的 Linux AMD 64 预编译二进制文件可以在 [Releases 选项卡](https://github.com/wal-g/wal-g/releases)下获取。 二进制文件的名称采用以下格式:`wal-g-DBNAME-OSNAME`,其中 `DBNAME` 代表数据库名称(例如 pg、mysql),`OSNAME` 代表用于构建二进制文件的操作系统名称。 要解压该二进制文件,请使用: ``` tar -zxvf wal-g-DBNAME-OSNAME-amd64.tar.gz mv wal-g-DBNAME-OSNAME-amd64 /usr/local/bin/wal-g ``` 例如,针对 Postgres 和 Ubuntu 24.04: ``` tar -zxvf wal-g-pg-24.04-amd64.tar.gz mv wal-g-pg-24.04-amd64 /usr/local/bin/wal-g ``` 对于其他系统,请查阅 [开发](#development)章节以获取更多信息。 WAL-G 支持 bash 和 zsh 的自动补全。运行 `wal-g help completion` 以获取更多信息。 ## 配置 你可以通过以下两种方式配置 WAL-G: 1. 使用环境变量 2. 使用配置文件 可以使用 `--config /path` 标志来指定配置文件所在的路径。或者,你也可以设置 `WALG_CONFIG_PATH` 环境变量来指定配置文件的路径,这样就不需要每次都传递该标志。 我们支持 [viper 包](https://github.com/spf13/viper)支持的所有格式:JSON、YAML、envfile 以及[其他格式](https://github.com/spf13/viper#reading-config-files)。 以下文档中提到的每个配置变量,既可以指定为环境变量,也可以指定为配置文件中的字段。 ### 存储 要配置 WAL-G 存储备份的位置,请查阅 [Storages](STORAGES.md)章节。 ### 压缩 * `WALG_COMPRESSION_METHOD` 用于配置备份所使用的压缩方法。可用的选项有:`lz4`、`lzma`、`zstd`、`brotli`、`none`。默认方法是 `lz4`。LZ4 是最快的方法,但压缩率较差。 LZMA 的速度要慢得多。但是,它对备份的压缩效果大约比 LZ4 好 6 倍。Brotli 和 zstd 在速度和压缩率之间取得了良好的平衡,其压缩率大约比 LZ4 好 3 倍。None 压缩方法会禁用压缩。 ### 加密 * `YC_CSE_KMS_KEY_ID` 用于配置用于客户端加密和解密的 Yandex Cloud KMS 密钥。默认情况下,不使用加密。 * `YC_SERVICE_ACCOUNT_KEY_FILE` 用于配置包含 Yandex Cloud 服务账户私钥的文件名。如果未设置,将使用来自元数据服务 的 token 向 Yandex Cloud KMS 发起 API 调用。 * `WALG_LIBSODIUM_KEY` 用于配置使用 libsodium 进行加密和解密。WAL-G 使用一种只需密钥的[算法](https://download.libsodium.org/doc/secret-key_cryptography/secretstream#algorithm)。libsodium 密钥是固定大小为 32 字节的密钥。为了获得最佳的加密安全性,建议使用随机的 32 字节密钥。要生成随机密钥,你可以使用类似 `openssl rand -hex 32`(将 `WALG_LIBSODIUM_KEY_TRANSFORM` 设置为 `hex`)或 `openssl rand -base64 32`(将 `WALG_LIBSODIUM_KEY_TRANSFORM` 设置为 `base64`)的命令。 * `WALG_LIBSODIUM_KEY_PATH` 类似于 `WALG_LIBSODIUM_KEY`,但其值为文件系统上密钥的路径。文件内容将会去除首尾空白字符。 * `WALG_LIBSODIUM_KEY_TRANSFORM` 应用于 `WALG_LIBSODIUM_KEY` 以获取所需的 32 字节密钥的转换方式。支持的转换有 `base64`、`hex` 或 `none`(默认)。 `none` 选项的存在是为了向后兼容,用户输入将通过截断或零填充转换为 32 字节。 * `WALG_GPG_KEY_ID` (替代形式 `WALE_GPG_KEY_ID`) ⚠️ **已弃用** 用于配置用于加密和解密的 GPG 密钥。默认情况下,不使用加密。公钥环会缓存在文件 "/.walg_key_cache" 中。 * `WALG_PGP_KEY` 用于配置使用 OpenPGP 标准进行加密和解密。你可以使用 `\n` 符号将多行密钥合并为一行(通常用于 daemontools 和 envdir 的情况)。 当你需要执行 ```wal-fetch``` 或 ```backup-fetch``` 命令时,请设置*私钥*值。 当你需要执行 ```wal-push``` 或 ```backup-push``` 命令时,请设置*公钥*值。 请记住,*私钥*同时也包含*公钥*。 * `WALG_PGP_KEY_PATH` 类似于 `WALG_PGP_KEY`,但其值为文件系统上密钥的路径。 * `WALG_PGP_KEY_PASSPHRASE` 如果你的*私钥*使用*密码*进行了加密,你应该设置用于解密的*密码*。 * `WALG_ENVELOPE_PGP_KEY` 用于配置使用存储在密钥管理系统中的信封 PGP 密钥进行加密和解密。 此选项允许你通过将 PGP 密钥存储在 KMS 中来安全管理它们。 至关重要的是要确保传递的密钥是使用 kms 加密并使用 *base64* 编码的。 此外,密钥中必须同时包含*私钥*和*公钥*部分,因为信封密钥将被注入到元数据中,并在稍后的 `wal/backup-fetch` 中使用。 请注意,目前仅支持配置 Yandex Cloud Key Management Service (KMS)。 在尝试使用此功能之前,请确保你已经设置并配置好了下面提到的 Yandex Cloud KMS。 * `WALG_ENVELOPE_CACHE_EXPIRATION` 此设置控制 kms 响应的过期时间。默认值为 `0`,表示将密钥永久存储在内存中。 请注意,如果在过期后系统无法在 kms 中重新解密密钥,将使用之前的响应。 * `WALG_ENVELOPE_PGP_YC_ENDPOINT` Endpoint 是指使用 SDK 访问的 Yandex.Cloud 的 API endpoint。大多数用户不需要显式设置它。 * `WALG_ENVELOPE_PGP_YC_CSE_KMS_KEY_ID` 类似于 `YC_CSE_KMS_KEY_ID`,但仅用于信封 pgp 密钥。 * `WALG_ENVELOPE_PGP_YC_SERVICE_ACCOUNT_KEY_FILE` 类似于 `YC_SERVICE_ACCOUNT_KEY_FILE`,但仅用于信封 pgp 密钥。 * `WALG_ENVELOPE_PGP_KEY_PATH` 类似于 `WALG_ENVELOPE_PGP_KEY`,但其值为文件系统上密钥的路径。 ### 监控 * `WALG_STATSD_ADDRESS` 用于启用向 [statsd](https://github.com/statsd/statsd) 或 [statsd_exporter](https://github.com/prometheus/statsd_exporter) 发布指标。指标将通过 UDP 尽力发送。statsd 的默认端口为 `8125`。 * `WALG_STATSD_EXTRA_TAGS` 使用此设置可以向 WAL-G 发布到 statsd 的指标添加静态标签(`host`、`operation`、`database` 等)。 如果你想出于测试目的进行演示,可以使用 docker-compose 文件中的 graphite 服务。 ### 性能分析 性能分析对于识别 WAL-G 内部的瓶颈非常有用。 * `PROFILE_SAMPLING_RATIO` 一个介于 0 和 1 之间的浮点数,定义了启用 profiler 的可能性。设置为 1 时,它将始终运行。这允许对调用进行概率采样。由于 WAL-G 进程可能每秒被创建多次(例如 wal-g wal-push),我们不希望对所有进程都进行性能分析。 * `PROFILE_MODE` 要使用的 pprof profiler 类型。可以是 `cpu`、`mem`、`mutex`、`block`、`threadcreation`、`trace`、`goroutine` 中的一种。有关更多信息,请参阅 [runtime/pprof 文档](https://pkg.go.dev/runtime/pprof)。默认为 `cpu`。 * `PROFILE_PATH` 用于存储 profile 的目录。默认为 `$TMPDIR`。 ### 速率限制 * `WALG_NETWORK_RATE_LIMIT` 在 ```backup-push```/```backup-fetch``` 操作期间的网络流量速率限制,单位为字节每秒。 ### 数据库特定选项 **所选数据库还有更多可用选项。请在[数据库](#databases)中查看** ## 用法 WAL-G 目前支持针对所有类型数据库的以下命令: ### ``backup-list`` 列出可用备份的名称和创建时间。 ``--pretty`` 标志以表格形式打印列表 ``--json`` 标志以 JSON 格式打印列表,如果与 ``--pretty`` 结合使用则会美化输出 ``--detail`` 标志打印额外的备份详细信息,如果与 ``--pretty`` 结合使用则美化输出,如果与 ``--json`` 结合使用则进行 JSON 编码 ### ``delete`` 用于删除备份及它们之前的 WAL。默认情况下,``delete`` 将执行模拟运行。如果你想执行删除,必须在命令末尾添加 ``--confirm`` 标志。标记为永久的备份不会被删除。 对于 **PostgreSQL**,``delete retain`` 和 ``delete before`` 默认使用嵌入在每个备份名称中的时间线和 WAL 段对备份进行排序。在**大版本升级**(例如 ``pg_upgrade``)之后,时间线通常会重置,而较旧的备份仍保留在同一个存储中,因此该顺序**可能不**是按时间顺序排列的,并且 ``retain`` 可能会错误地删除**新**备份。在 ``delete`` 时传递全局标志 ``--use-sentinel-time``,以便在可用时根据来自 sentinel/metadata 的备份开始时间进行排序;请参阅 [PostgreSQL.md](PostgreSQL.md#delete-retention-ordering-and-use-sentinel-time)。 ``delete`` 可以在四种模式下运行:``retain``、``before``、``everything`` 和 ``target``。 ``retain`` [FULL|FIND_FULL] %number% [--after %name|time%] 如果指定了 ``FULL``,则保留 ``%number%`` 个完整备份以及它们之间的所有内容。如果使用了 ``--after`` 标志,则保留 $number$ 个最近的备份以及在此 ``%name|time%`` 之后(包括在内)创建的备份。 ``before`` [FIND_FULL] %name% 如果指定了 `FIND_FULL`,WAL-G 将计算保留所有增量备份所需的最小备份。如果未指定 ``FIND_FULL``,并且调用可能会产生孤立的增量备份,则调用将失败并返回列表。 ``everything`` [FORCE] ``target`` [FIND_FULL] %name% | --target-user-data %data% 将删除由名称或用户数据指定的备份。与其他删除命令不同,此命令不删除任何已归档的 WAL。 (仅适用于 Postgres 和 MySQL)默认情况下,如果提供增量备份作为目标,WAL-G 还将删除所有依赖的增量备份。如果指定了 `FIND_FULL`,WAL-G 将删除与目标具有相同基础备份的所有备份。 ### 示例 ``everything`` 所有备份都将被删除(如果没有永久备份的话) ``everything FORCE`` 所有备份,包括永久备份,都将被删除 ``retain 5`` 如果第 5 个是增量备份,将会失败 ``retain FULL 5`` 将保留 5 个完整备份及其所有增量备份 ``retain FIND_FULL 5`` 将为第 5 个备份找到必要的完整备份,并保留其后的所有内容 ``retain 5 --after 2019-12-12T12:12:12`` 保留 5 个最近的备份以及 2019-1212 12:12:12 之后创建的备份 ``retain FULL 5 --use-sentinel-time`` (PostgreSQL) 与 ``retain FULL 5`` 相同,但是按照 sentinel 的开始时间对备份进行排序——在跨时间线重置(例如大版本升级后)混合备份时使用;运行删除时仍需添加 ``--confirm`` ``before base_000010000123123123`` 如果 `base_000010000123123123` 是增量备份,将会失败 ``before FIND_FULL base_000010000123123123`` 将保留 base_000010000123123123 的基础备份之后的所有内容 ``target base_0000000100000000000000C9`` 删除基础备份和所有依赖它的增量备份 `` target --target-user-data "{ \"x\": [3], \"y\": 4 }"`` 删除由用户数据指定的备份 ``target base_0000000100000000000000C9_D_0000000100000000000000C4`` 删除增量备份和所有依赖它的增量备份 ``target FIND_FULL base_0000000100000000000000C9_D_0000000100000000000000C4`` 删除增量备份以及具有相同基础备份的所有增量备份 **所选数据库引擎还有更多可用命令。请在[数据库](#databases)中查看** ## 存储工具 `wal-g st` 命令系列允许与配置的存储进行直接交互。 [存储工具文档](StorageTools.md) ## 数据库 ### PostgreSQL [有关安装、配置和用法的信息](PostgreSQL.md) ### MySQL/MariaDB [有关安装、配置和用法的信息](MySQL.md) ### SQLServer [有关安装、配置和用法的信息](SQLServer.md) ### Mongo [Beta] [有关安装、配置和用法的信息](MongoDB.md) ### FoundationDB [开发中] [有关安装、配置和用法的信息](FoundationDB.md) ### Redis [Beta] [有关安装、配置和用法的信息](Redis.md) ### Greenplum / Cloudberry [可用于生产环境] [有关安装、配置和用法的信息](Greenplum.md) ### ETCD [开发中] [有关安装、配置和用法的信息](ETCD.md) ## 开发 以下步骤描述了如何为 PostgreSQL 构建 WAL-G,但该过程对于其他数据库也是相同的。例如,要为 MySQL 构建 WAL-G,请使用 `make mysql_build` 而不是 `make pg_build`。 可选: - 要使用 brotli 压缩器和解压器进行构建,请设置 `USE_BROTLI` 环境变量。 - 要使用 libsodium 进行构建,请设置 `USE_LIBSODIUM` 环境变量。 - 要使用 lzo 解压器进行构建,请设置 `USE_LZO` 环境变量。 ### 安装说明 #### Ubuntu ``` # 安装最新版 Go 编译器 sudo add-apt-repository ppa:longsleep/golang-backports sudo apt update sudo apt install golang-go # 安装 lib 依赖 sudo apt install libbrotli-dev liblzo2-dev libsodium-dev curl cmake # 获取项目并构建 # Go 1.15 及以下版本 go get github.com/wal-g/wal-g # Go 1.16+ - 只需将 repository 克隆到 $GOPATH # 如果你想节省空间,请添加 --depth=1 或 --single-branch git clone https://github.com/wal-g/wal-g $(go env GOPATH)/src/github.com/wal-g/wal-g cd $(go env GOPATH)/src/github.com/wal-g/wal-g # 可选的 exports(见上文) export USE_BROTLI=1 export USE_LIBSODIUM=1 export USE_LZO=1 make deps make pg_build main/pg/wal-g --version ``` 用户也可以使用 `make pg_install` 安装 WAL-G。在安装之前指定 `GOBIN` 环境变量,允许用户指定安装位置。默认情况下,`make pg_install` 会将编译后的二进制文件放在根目录 (`/`) 中。 ``` export USE_BROTLI=1 export USE_LIBSODIUM=1 export USE_LZO=1 make pg_clean make deps GOBIN=/usr/local/bin make pg_install ``` #### macOS ``` # brew 命令是 Mac OS 的 Homebrew brew install cmake # 获取项目并构建 # Go 1.15 及以下版本 go get github.com/wal-g/wal-g # Go 1.16+ - 只需将 repository 克隆到 $GOPATH # 如果你想节省空间,请添加 --depth=1 或 --single-branch git clone https://github.com/wal-g/wal-g $(go env GOPATH)/src/github.com/wal-g/wal-g cd $(go env GOPATH)/src/github.com/wal-g/wal-g export USE_BROTLI=1 export USE_LIBSODIUM="true" # since we're linking libsodium later ./link_brotli.sh ./link_libsodium.sh make install_and_build_pg # 如果你需要安装 GOBIN=/usr/local/bin make pg_install ``` 要在 ARM64 上构建,请设置相应的 `GOOS`/`GOARCH` 环境变量: ``` env GOOS=darwin GOARCH=arm64 make install_and_build_pg ``` 要在 ARM 架构的 MacOS 上构建 linux 版本: ``` GOOS=linux GOARCH=amd64 make mysql_build ``` 编译后要运行的二进制文件是 `main/pg/wal-g` ### 测试 WAL-G 非常依赖单元测试。这些测试不需要 S3 配置,因为上传/下载部分是使用 mock 对象进行测试的。单元测试可以使用以下命令运行 ``` ./link_brotli.sh export USE_BROTLI=1 make unittest ``` 有关测试的更多信息,请查阅 [test](test)、[testtools](testtools) 以及 [Makefile](Makefile) 中的 `unittest` 部分。 WAL-G 将执行一次往返压缩/解压测试,该测试会生成一个数据目录(例如 data...)、压缩文件目录(例如 compressed)和解压文件目录(例如 extracted)。只有当原始数据目录中的文件与解压目录中的文件匹配时,这些目录才会被清理。 可以使用以下命令获取测试覆盖率: ``` export USE_BROTLI=1 make coverage ``` 此命令会生成 `coverage.out` 文件,并打开覆盖率的 HTML 表示形式。 ### Windows 开发 [有关安装和用法的信息](Windows.md) ## 故障排除 开始排查故障的一个好方法是设置以下一个或两个环境变量: * `WALG_LOG_LEVEL=DEVEL` 打印出 WAL-G 使用的配置以及所执行命令的详细日志。 * `S3_LOG_LEVEL=DEVEL` 如果你的命令似乎卡住了,可能是 S3 无法连接、证书问题或其他与 S3 相关的问题。 设置此环境变量后,你可以看到来自 S3 的请求和响应。 ## 作者 * [Katie Li](https://github.com/katie31) * [Daniel Farina](https://github.com/fdr) 另请参阅参与此项目的[贡献者](CONTRIBUTORS.md)列表。 ## 许可证 本项目基于 Apache License, Version 2.0 授权,但 lzo 支持基于 GPL 3.0+ 授权。有关更多详细信息,请参阅 [LICENSE.md](../LICENSE.md) 文件。 ## 致谢 没有 [Citus Data](https://www.citusdata.com/) 的支持,就不会有 WAL-G 的诞生。 WAL-G 的诞生得益于 Citus 的暑期工程实习生 Katie Li 与 WAL-E 的原作者 Daniel Farina 的合作,Daniel Farina 目前担任 Citus Cloud 团队的首席工程师。Citus Data 还有一个[Postgres 的开源扩展](https://github.com/citusdata),它可以横向分发数据库查询,从而提供极高的扩展性和性能。 WAL-G 的开发由 [Yandex Cloud](https://cloud.yandex.com) 提供支持 ## 交流群 我们有一个 [Slack 群组](https://postgresteam.slack.com/messages/CA25P48P2)和一个 [Telegram 聊天室](https://t.me/joinchat/C03q9FOwa7GgIIW5CwfjrQ)来讨论 WAL-G 的用法和开发。要加入 PostgreSQL slack,请使用[邀请应用](https://postgres-slack.herokuapp.com)。
标签:EVTX分析, Go, PostgreSQL, Ruby工具, 搜索引擎查询, 数据库备份, 数据归档, 日志审计, 测试用例, 灾难恢复, 请求拦截