Database 备份托管在AWS EC2上的PostgreSQL数据库,而无需关闭或重新启动主机
我正在为我的组织使用PostgreSQL v9.1。数据库托管在AmazonWebServices(EC2实例)中,位于DjangoWeb框架下,该框架在数据库上执行任务(读/写数据)。问题是,要以指定的格式定期备份此数据库(请参见需求) 要求:Database 备份托管在AWS EC2上的PostgreSQL数据库,而无需关闭或重新启动主机,database,postgresql,archive,database-backups,Database,Postgresql,Archive,Database Backups,我正在为我的组织使用PostgreSQL v9.1。数据库托管在AmazonWebServices(EC2实例)中,位于DjangoWeb框架下,该框架在数据库上执行任务(读/写数据)。问题是,要以指定的格式定期备份此数据库(请参见需求) 要求: 备用服务器可用于备份目的 主数据库将每小时备份一次。一旦勾选了时间,数据库将快速全部备份,然后在文件系统归档中复制到从属数据库 除了每小时备份外,我还需要在午夜执行数据库的每日备份,并在每个周日的午夜执行每周备份 每周备份将是数据库的最终备份。将保存
- 备用服务器可用于备份目的
- 主数据库将每小时备份一次。一旦勾选了时间,数据库将快速全部备份,然后在文件系统归档中复制到从属数据库
- 除了每小时备份外,我还需要在午夜执行数据库的每日备份,并在每个周日的午夜执行每周备份
- 每周备份将是数据库的最终备份。将保存所有每周备份。仅保存上周的每日备份,仅保存最后一天的每小时备份
- 实时数据每天进入服务器(插入速率为每2秒)李>
- 数据库现在承载关键客户数据,这意味着它无法关闭
- 通常情况下,数据在夜间停止进入数据库,但在我无法控制停止插入的某些夜间,数据很有可能进入主数据库(客户数据将丢失)
- 如果我使用传统的备份机制/软件(例如,barman),我必须在
中配置归档模式,并在postgresql.conf
中验证用户,这意味着我需要重新启动服务器以打开它,然后再次将传入数据停止几分钟。这是不允许的(参见上述约束)pg_hba.conf
pg_xlog
、data
、pg_clog
等)位于单个EBS卷上,您可以使用EBS快照执行您描述的操作,因为它们是(或声称是)原子的。如果在多个EBS卷上进行条带化,则无法执行此操作
总的想法是:
- 使用命令行AWS工具或脚本接口(如奇妙的Python库),使用EBS API拍摄EBS快照
- 快照完成后,使用AWS API命令从中创建卷,并将卷附加到您的实例,或者最好附加到单独的实例,然后装载它
- 在EBS快照上,您将找到从拍摄快照的时间点开始的数据库的只读副本,就好像您的服务器在那一刻崩溃一样。PostgreSQL是crashsafe,所以这很好(除非您在
中做了一些非常愚蠢的事情,比如setPostgreSQL.conf
)。将整个数据库结构复制到最终备份中,例如将其归档到S3或其他任何地方fsync=off
- 卸载、取消链接并销毁包含快照的卷
pg_hba.conf
,只需重新加载(pg_ctl reload
,或SIGHUP
邮局主管)即可,但您确实需要重新启动以更改存档模式
这是为什么备份不是可选的额外备份的众多原因之一,它们是您在上线之前应该进行的设置的一部分
如果不更改存档模式,则不能使用PITR、pg_basebackup、WAL存档、pgbarman等。您可以使用数据库转储,并且只能使用数据库转储
所以你得找个时间重新开始。很抱歉如果您的客户端应用程序并不完全愚蠢(即,它们可以处理等待被阻止的tcp/ip连接),那么在对生产设置的副本进行大量测试后,我会尝试这样做:
- 设置PgBouncer实例
- 开始将新连接定向到PgBouncer而不是主服务器
- 一旦所有连接都通过pgbouncer完成,更改
以设置所需的存档模式。同时进行任何其他所需的仅重新启动更改,有关仅重新启动参数,请参阅配置文档postgresql.conf
- 等待,直到没有活动连接
- SIGSTOP pgbouncer,因此它不会响应新的连接尝试
- 再次检查,确保在此期间没有人建立连接。如果他们这样做了,
pgbouncer,等待它完成,然后重复SIGCONT
- 重新启动PostgreSQL
- 确保我可以使用
psql
- SIGCONT pgbouncer
SIGSTOP
ingpgbouncer
是否能达到预期效果;您必须在生产设置的副本上进行试验,以确保