Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 备份托管在AWS EC2上的PostgreSQL数据库,而无需关闭或重新启动主机_Database_Postgresql_Archive_Database Backups - Fatal编程技术网

Database 备份托管在AWS EC2上的PostgreSQL数据库,而无需关闭或重新启动主机

Database 备份托管在AWS EC2上的PostgreSQL数据库,而无需关闭或重新启动主机,database,postgresql,archive,database-backups,Database,Postgresql,Archive,Database Backups,我正在为我的组织使用PostgreSQL v9.1。数据库托管在AmazonWebServices(EC2实例)中,位于DjangoWeb框架下,该框架在数据库上执行任务(读/写数据)。问题是,要以指定的格式定期备份此数据库(请参见需求) 要求: 备用服务器可用于备份目的 主数据库将每小时备份一次。一旦勾选了时间,数据库将快速全部备份,然后在文件系统归档中复制到从属数据库 除了每小时备份外,我还需要在午夜执行数据库的每日备份,并在每个周日的午夜执行每周备份 每周备份将是数据库的最终备份。将保存

我正在为我的组织使用PostgreSQL v9.1。数据库托管在AmazonWebServices(EC2实例)中,位于DjangoWeb框架下,该框架在数据库上执行任务(读/写数据)。问题是,要以指定的格式定期备份此数据库(请参见需求)

要求:

  • 备用服务器可用于备份目的
  • 主数据库将每小时备份一次。一旦勾选了时间,数据库将快速全部备份,然后在文件系统归档中复制到从属数据库
  • 除了每小时备份外,我还需要在午夜执行数据库的每日备份,并在每个周日的午夜执行每周备份
  • 每周备份将是数据库的最终备份。将保存所有每周备份。仅保存上周的每日备份,仅保存最后一天的每小时备份
但我也有以下限制

  • 实时数据每天进入服务器(插入速率为每2秒)
  • 数据库现在承载关键客户数据,这意味着它无法关闭
  • 通常情况下,数据在夜间停止进入数据库,但在我无法控制停止插入的某些夜间,数据很有可能进入主数据库(客户数据将丢失)
  • 如果我使用传统的备份机制/软件(例如,barman),我必须在
    postgresql.conf
    中配置归档模式,并在
    pg_hba.conf
    中验证用户,这意味着我需要重新启动服务器以打开它,然后再次将传入数据停止几分钟。这是不允许的(参见上述约束)
有没有一种聪明的方法来备份主数据库以满足我的需要?有没有一个工具可以为我自动化这项工作

这是一个非常关键的要求,因为几天后数据就开始出现在主数据库中,我需要确保在某些备用服务器上始终有主数据库的复制。

使用EBS快照 如果且仅当您的整个数据库(包括
pg_xlog
data
pg_clog
等)位于单个EBS卷上,您可以使用EBS快照执行您描述的操作,因为它们是(或声称是)原子的。如果在多个EBS卷上进行条带化,则无法执行此操作

总的想法是:

  • 使用命令行AWS工具或脚本接口(如奇妙的Python库),使用EBS API拍摄EBS快照

  • 快照完成后,使用AWS API命令从中创建卷,并将卷附加到您的实例,或者最好附加到单独的实例,然后装载它

  • 在EBS快照上,您将找到从拍摄快照的时间点开始的数据库的只读副本,就好像您的服务器在那一刻崩溃一样。PostgreSQL是crashsafe,所以这很好(除非您在
    PostgreSQL.conf
    中做了一些非常愚蠢的事情,比如set
    fsync=off
    )。将整个数据库结构复制到最终备份中,例如将其归档到S3或其他任何地方

  • 卸载、取消链接并销毁包含快照的卷

这是一种非常低效的方法来做你想做的事情,但它会起作用

通过将备份恢复到临时服务器并确保其可访问且包含预期信息,定期测试备份非常重要。自动执行此操作,然后手动检查

无法使用EBS快照? 如果您的卷是通过LVM映射的,那么您可以在Linux系统中的LVM级别执行相同的操作。这适用于条带化ebs配置上的md上的lvm。您使用lvm快照而不是EBS,并且只能在主机上执行,但在其他方面是相同的

只有当整个数据库位于一个文件系统上时,才能执行此操作

没有LVM,不能使用EBS? 您必须重新启动数据库。您无需重新启动它即可更改
pg_hba.conf
,只需重新加载(
pg_ctl reload
,或
SIGHUP
邮局主管)即可,但您确实需要重新启动以更改存档模式

这是为什么备份不是可选的额外备份的众多原因之一,它们是您在上线之前应该进行的设置的一部分

如果不更改存档模式,则不能使用PITR、pg_basebackup、WAL存档、pgbarman等。您可以使用数据库转储,并且只能使用数据库转储

所以你得找个时间重新开始。很抱歉如果您的客户端应用程序并不完全愚蠢(即,它们可以处理等待被阻止的tcp/ip连接),那么在对生产设置的副本进行大量测试后,我会尝试这样做:

  • 设置PgBouncer实例
  • 开始将新连接定向到PgBouncer而不是主服务器
  • 一旦所有连接都通过pgbouncer完成,更改
    postgresql.conf
    以设置所需的存档模式。同时进行任何其他所需的仅重新启动更改,有关仅重新启动参数,请参阅配置文档
  • 等待,直到没有活动连接
  • SIGSTOP pgbouncer,因此它不会响应新的连接尝试
  • 再次检查,确保在此期间没有人建立连接。如果他们这样做了,
    SIGCONT
    pgbouncer,等待它完成,然后重复
  • 重新启动PostgreSQL
  • 确保我可以使用
    psql
  • SIGCONT pgbouncer
我宁愿显式地将pgbouncer设置为“保持所有连接”模式,但我不确定它是否有连接,现在也没有时间研究它。我也不确定
SIGSTOP
ing
pgbouncer
是否能达到预期效果;您必须在生产设置的副本上进行试验,以确保