用于高负载的 PostgreSQL 流式复制
Posted
技术标签:
【中文标题】用于高负载的 PostgreSQL 流式复制【英文标题】:PostgreSQL streaming replication for high load 【发布时间】:2018-03-27 10:23:28 【问题描述】:我计划将我的生产 oracle 集群迁移到 postgresql 集群。当前系统支持 2000TPS,为了支持该 TPS,如果有人能在下面澄清一下,我将非常感激。
1) 最好的复制策略是什么(基于 Streaming 或 DRBD 的复制)
2) 在流式复制中,master 可以在没有 slave 的情况下处理流量,当 slave 启动时,它是否会在停机时丢失什么?
【问题讨论】:
您在 Oracle 中使用了什么样的“集群”?空调?使用 DataGuard 进行物理备用?如果是后者,您在哪种模式下运行 DataGuard? 【参考方案1】:关于 TPS - 它主要取决于您的硬件和 PostgreSQL 配置。我已经在*** in this answer 上写过它。您不能指望某些类似笔记本的配置有魔力。这是我的文字“PostgreSQL and high data load application”。
1) 流式复制是最简单且几乎“无痛”的解决方案。所以如果你想快速开始,我强烈推荐它。
2) 是的,但您必须归档 WAL 日志。见下文。
这里所说的所有这些都是我建议您阅读的链接:
how to set streaming replication example of WAL log archiving script当然,流式复制有一些您应该知道的注意事项:
problem with increasing some parameters like max_connections how to add new disk and new tablespace to master and replicas【讨论】:
Wal 归档不再需要。您可以使用 wal 流式传输和专用复制槽,以便自动保留 wal 日志(旧 pg_xlog),直到从数据库使用它。唯一的“缺点”是,如果 slave 长时间不可用,master 上的 pg_xlog/pg_wal 内容将无限增长,并可能填满整个磁盘,最终阻塞写入事务,甚至使 postgres 崩溃。但是,就个人而言,我更喜欢在不注意的情况下丢失从服务器(如果我注意到我可以及时修复或简单地手动删除复制槽以释放 wals)。 Hmmm :-) 我不会谈论硬崩溃的 PG 数据库,因为没有足够的磁盘空间那么轻...我们遇到了这些事件,通常在粉碎后很有可能损坏表或者当木屐损坏时 PG 根本没有启动。我们必须实现 PG 紧急停止脚本以防止它 - postgresql.freeideas.cz/bash-script-emergency-stop-postgresql 您在哪个 postgres 版本中遇到过这种情况?我遇到了一些没有数据丢失的问题,甚至试图故意损坏数据库(当然是在测试环境中)并且只是添加额外的空间 Postgres 继续工作(如果还没有崩溃)或重新启动(如果它确实崩溃了)没有任何问题。也许你也有物理服务器崩溃?在那种情况下,可能是与一些有问题的硬盘缓存相关的日志问题...... 以防万一它对任何人都有用,这里是我自己的尚未完全但几乎完成的脚本,我目前正在处理:pgstandby。 @bitifet 好的,我明白 :-) 不幸的是,我们的数据库显然不知道它,并且在硬崩溃后我收到有关损坏的提交日志的错误消息。我必须重置事务并从上次 pg-barman 备份中提取提交日志,以便至少能够启动数据库以转储一些最关键的更改。之后,我必须恢复上次 pg-barman 备份以恢复一致的状态...【参考方案2】:-
在这种情况下没有“最佳解决方案”。您选择哪种解决方案取决于您的要求。
您需要保证不会丢失数据吗?
您能容忍多大的性能损失?
您需要故障转移还是只需要备份?
您需要 PITR(时间点恢复)吗?
默认情况下,我认为失败的从站将被忽略。根据您的配置,从站可能需要很长时间才能恢复,例如一个靴子。
我建议你阅读https://www.postgresql.org/docs/10/static/different-replication-solutions.html
【讨论】:
1) 这缺少关键数据。因此是的 2) 我们可以在几分钟内以大约 500 TPS 的速度生活 3) 需要故障转移。我们希望将主要作为事务处理节点和从属节点以只读模式运行。如果主节点失败,从节点应该成为事务处理节点。我们期望使用 Virtual IP/pacemaker/Corosync 来实现故障转移。任何其他建议都非常受欢迎。 4) 是的,但是可以使用流复制来完成吗? 根据您的回答,我会说尝试使用流复制和 WAL 运输的设置。如果您计划进行同步流复制,请确保有一个物理上靠近您的主服务器的备份服务器。您的服务器的吞吐量将取决于一系列因素,包括服务器的规格、数据库的复杂性和网络的延迟,因此我们无法确定这是否符合您的吞吐量要求。以上是关于用于高负载的 PostgreSQL 流式复制的主要内容,如果未能解决你的问题,请参考以下文章