我遇到的情况是,我在同一个 Ec2 实例上运行我的应用程序和 Postgresql 数据库。Postgresql 的数据保存在与实例的根卷不同的另一个 EBS 卷上。
如果我想通过创建另一个实例来平衡此设置的负载,那么:
有哪些技术可以帮助我保持两个实例上的数据库同步?
这些技术的优点和缺点是什么?
使用单独的数据库服务器是否比经历上述麻烦更好?(现在我避免使用单独的数据库实例的主要原因是为了保持在免费层内)
答案1
要使 PostgreSQL 数据库保持同步,您需要一个可写入的主数据库,以及一个或多个使用 PostgreSQL 内置复制功能的只读从属数据库。请参阅用户手册。PostgreSQL 本身不支持多主复制(所有副本均可写入)。
不过,在这种情况下,我无法想象你会因为负载原因而需要第二个数据库。如果你使用的是 EC2 免费套餐,那么你正在使用一个严重受限的微型实例,EBS 上的磁盘 I/O 性能很差。你会得到一个千使用 EBS 优化的大型实例,其条带化 raid10 阵列(由四个 EBS 配置的 IOPS 卷组成)的性能可提高 (或更多) 倍。即使是普通的中型实例,其性能也可能大幅提高。我最近写了一些关于这个的文章。
此时尝试扩展对于性能而言完全没有必要。但是,这对于数据保护和冗余来说是个好主意。考虑使用barman
钩子脚本将基本备份和 WAL 存档存储在 S3 中,或者在不同的可用区域中添加第二个 PostgreSQL 服务器,该服务器运行主服务器的流式副本。请记住也要保留 AWS 之外的良好备份,例如夜间数据库转储。
答案2
如果要进行负载平衡,则需要假设在某个时候,您将运行超过 2 个实例。这意味着,如果每个实例上都有一个 Postgresql 服务器,则必须执行多对多复制,这可能很难设置(如果它甚至支持这样的事情)。
最好的解决方案是将数据库从应用程序服务器移出,以便每个实例都访问一个公共数据库服务器。