iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL实际场景的缺陷有哪些
  • 881
分享到

PostgreSQL实际场景的缺陷有哪些

2024-04-02 19:04:59 881人浏览 泡泡鱼
摘要

本篇内容介绍了“postgresql实际场景的缺陷有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!缺陷

本篇内容介绍了“postgresql实际场景的缺陷有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

缺陷1:灾难性的XID解决方案

关于这一点建议你查看更多资料,毫不避讳地说,这个缺点真的很让人头疼。该问题导致过很多长时间停机的故障,长达数天。如果你查看足够的材料,比如用Google搜索,就会发现许多人都在这个功能上踩雷。几乎所有不具备高级专家经验的Postgresql技术人员,都会遇到这个问题。
 
或许将来某个时候,XID可能会过渡为使用64位整数,但是在那之前,我们仍然要继续应对这个挑战。不过好一点的是,与飞机上的应用软件不同,这个故障我们是可以尽量去避免的,只要不使用这个功能的话。
 
缺陷2:failover故障可能会丢失数据
 
如果运行中的主服务器突然出现故障,那么运行中的流复制设置几乎肯定会丢失已提交的数据。有人可能会说:“异步复制的代价就是这样。” 但并不是所有的异步复制都会丢失数据。PostgreSQL虽然支持同步复制优选提交的机制,以实现容错的持久性,但是如果要保证较小的性能影响范围,就会对应用程序提出更复杂的设计要求。
 
这种情况下,虽然等待不会占用系统资源,但是事务会继续保留,直到确认转移为止。导致的结果是,为了避免响应时间增加和资源争用增加,需要谨慎使用同步复制,因为可能会将降低数据库应用程序的性能。
 
同步复制优选提交在某些情况下很有用,但我不推荐在通用用例中使用。这个机制有点类似于kafka的ISR复制,具有acks = all和一个已定义的min_isr,但是在运行任意查询的时候,根据目标端数据库类型及事务处理原理不同,会表现出细微的差别。我还没有了解到过,通过failover故障转移,有过成功应用仲裁提交,在数据规模较大的环境中实现高可用性,高耐久性的复制案例。如果各位读者有这样的案例,我愿意一听!
 
就关系数据库而言,Galera Cluster的组复制也不完美,但更接近理想状态。他们甚至鼓励按地理分布的复制,但是这对于使用仲裁提交的PostgreSQL复制设置很可能是灾难性的。
 
缺陷3:低效率的复制会传播失败
 
到目前为止,流复制是生产部署中最常用的复制机制。它是物理复制的一种形式,可以复制磁盘二进制数据本身中的更改。
 
每次需要通过写操作修改磁盘上的数据库页面(4KB)时,即使只是一个字节,也将使用请求的更改进行编辑的整个页面的副本写入预写日志(WAL) 。物理流复制利用此现有的WAL基础结构作为流到副本的更改日志。
 
例如,使用物理复制,大型索引构建会创建大量WAL条目,从而很容易成为流复制的瓶颈。页面粒度的读取-修改-复制过程会导致主机上由硬件引起的数据损坏,更容易将损坏传播到副本,这种故障我个人在生产中亲眼目睹过。
 
这与逻辑复制相反,后者仅复制逻辑数据更改。至少从理论上讲,大型索引构建只会导致在网络上复制单个命令。尽管PostgreSQL已经支持逻辑复制已有相当长的一段时间了,但是大多数部署都使用物理流复制,因为它更健壮,支持范围更广并且更易于使用。
 
缺陷4:MVCC垃圾回收频发
 
与大多数主流数据库一样,PostgreSQL使用多版本并发控制(mvcC)来实现并发事务。但是,其特定的实现通常会给垃圾行的数据版本及其清理(VACUUM)带来操作上的麻烦。一般来说,UPDATE操作会为任何已修改的行创建新副本(或“行版本”),将旧版本保留在磁盘上,直到可以清除它们为止。
 
多年来,这种情况一直在稳步改善,但它是一个复杂的系统,对于任何初次接触该问题的人来说都是一个黑匣子。比如说,你是否了解堆内元组(HOT)及其何时启动对于繁重的就地更新工作负载(如连续保持一致的计数器列),这种操作很可能会失败。默认的自动真空设置在大多数情况下都有效,但是,如果真的失效了,那后果就不堪设想。
 
相较而言,Mysqloracle使用Redo和undo日志。他们不需要类似的后台垃圾收集过程。为了实现整个功能所作出的权衡牺牲主要是事务提交和回滚操作的额外延迟。
 
虽然这样会有延迟产生,但是也许是在遥远的将来的某个时候,这个功能就会变得很有价值了。
 
缺陷5:每次连接处理=规模化痛苦
 
PostgreSQL为每个连接生成一个进程,而其他大多数数据库都使用更有效的连接并发模型。由于存在一个相对较低的阈值,在该阈值上添加更多的连接会降低性能(约2个内核),最终会导致性能下降,而性能下降的比例可能会很高(难以估计,高度依赖于工作负载),就会使得性能调优的难度增加。
 
使用连接池的标准方法当然可以解决问题,但是会带来额外的架构复杂性。在一次特别大规模的部署中,我最终不得不在第二个pgbouncer层中分层。一层在应用程序服务器上运行,另一层在数据库服务器上运行。它总共聚合了大约一百万个客户端进程的连接。这时候对于调优工作来说,大概只有40%的技术含量,剩下大概要花40%的蛮力,还需要10%的碰运气了。
 
进程可扩展性在每个主要版本中都在逐步提高,但与mysql中使用的“每连接线程数”相比,最终该体系结构的性能还是受到了一定的限制。
 
有关更多技术详情,请参见https://brandur.org/postgres-connections。
 
缺陷6:主键索引简直是浪费空间
 
PostgreSQL中的表有一个主键索引和称为堆的独立行存储。其他数据库将它们集成在一起或支持“索引组织表”。在PostgreSQL的这种机制下,主键查找过程直接指向具体的行数据,而不需要辅助获取完整行以及必需的额外CPU和I / O利用率。
 
PostgreSQL中的CLUSTER命令会根据索引重新组织表以提高性能,但实际上不适用于大多数OLTP的情况。它是以互斥锁重写整个表,从而阻止任何读取或写入。PostgreSQL不维护新数据的群集布局,因此该操作必须定期运行。因此,如果你不能接受数据库长时间脱机,这种机制就无法使用。
 
但更关键的是,索引组织的表可以节省空间,因为索引不需要单独的行数据副本。对于对于主要由主键覆盖的小行的表(例如联接表),这可以轻松地将表的存储空间减少一半。
 
比如针对下表,该表存储任意对象的社交获得的“赞”:
 

PostgreSQL将维护与基表存储区分开的主键索引。 该索引将为每行包含object_type,object_id和user_id列的完整副本。 每行28个字节中的20个(大约70%)将被复制。 我们想一下,如果PostgreSQL支持按索引组织的表,则不需要消耗所有这些额外的空间。

缺陷7:大版本升级可能需要停机
 
针对大型的数据库, 一些主要版本升级需要数小时的停机时间,才能实现数据的完全转移。如果使用典型的流复制机制,无法通过升级副本并执行故障转移来优雅地做到这一点。而磁盘二进制格式在大版本之间不兼容,因此,主副本之间的有线协议实际上也是不兼容的。
 
希望逻辑复制最终将完全取代流复制,以便使得用户能够启用在线滚动升级策略。我之前进行大规模水平部署时,我们在自定义基础架构上进行了重大工程投入,并且使用额外的基于触发器的复制系统(也用于分片迁移),最终才保证了在不停机的情况下进行这些升级的。
 
缺陷8:有点繁琐的复制设置
 
公平地说,MySQL的即用型复制要麻烦得多,但是与某些NoSQL存储(如mongoDBRedis)或某些面向集群的复制系统(如MySQL Group Replication和Galera Cluster)相比,其易用性 以及避免边缘化的观点,在PostgreSQL中设置复制仍有很多不足之处。从理论上讲,逻辑复制为第三方解决方案提供了更大的灵活性,以弥补这些空白,但到目前为止,使用它代替流复制存在很大的问题。
 
缺陷9:缺乏Planner hints机制
 
一般数据库中, 通过Planner hints提示,可以引导用户使用自己不会使用的策略。但PostgreSQL开发团队多年来一直拒绝支持Planner hints程序提示,认为这好像是一种更聪明的编译器参数的形式。
 
我确实理解他们的理由,这主要是为了防止不法用户使用应通过编写适当查询而解决的查询提示来攻击的问题。但是,当你看到生产数据库在突然而意外的查询计划变动下急剧陷入崩溃时,没有任何提示也不知道怎么操作的时候就比较恼火了。
 
在许多情况下,给用户的hint提示可以在几分钟内缓解问题,并为工程团队节省他们为查询进行适当修复所需的时间,比如几小时甚至几天。尽管有一些间接的解决方法涉及禁用某些查询计划器策略,但它们存在风险,因此绝对不应无任何限制地使用。
 
当然如果能同时满足这两种需求那就很完美了。
 
缺陷10:无块压缩
 
InnoDB在MySQL中的页面压缩通常可将存储空间减少一半,并且从性能角度来看几乎是“免费的”(不受影响)。PostgreSQL只支持自动压缩较大的数值,但这对于将数据存储在关系数据库中的最常用的方式没有用(很少有特别大的值)。对于大多数RDBMS用例,一行通常为几百个字节或更少,这意味着压缩仅在跨多行或成块应用时才真正有效。
 
对于PostgreSQL核心的数据结构来说,块压缩确实很难实现,但是尽管有一些缺点, MySQL InnoDB存储引擎采用的“打孔”策略在实践中似乎效果还不错。
 
PostgreSQL世界中唯一被广泛使用的通用块压缩设置利用了ZFS,很多人觉得比较好用。ZFS如今已成为linux上的生产级实现,但无疑也带来了一些管理上的开销,而对于XFS或ext4等更“现成的”文件系统而言,ZFS却不存在。

“PostgreSQL实际场景的缺陷有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL实际场景的缺陷有哪些

本文链接: https://www.lsjlt.com/news/62959.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSQL实际场景的缺陷有哪些
    本篇内容介绍了“PostgreSQL实际场景的缺陷有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!缺陷...
    99+
    2024-04-02
  • PostgreSQL的触发器使用场景有哪些
    数据完整性约束:当需要在数据库中设置一些数据完整性约束时,可以使用触发器来确保数据的一致性和完整性。 日志记录:触发器可以用...
    99+
    2024-04-02
  • PHP 容器函数:有哪些实际应用场景?
    PHP 容器函数是 PHP 语言中非常重要的一类函数,它们用于创建、操作和管理数据结构。在 PHP 中,容器函数通常包括数组、堆栈、队列、堆等。这些函数可以用于多种应用场景,例如数据处理、数据存储、算法实现等。下面将介绍一些常见的 PHP...
    99+
    2023-09-13
    容器 函数 学习笔记
  • postgresql中nullif函数的应用场景有哪些
    在PostgreSQL中,NULLIF函数用于比较两个表达式,并在它们相等时返回NULL。它的应用场景包括: 处理除零错误:用于在...
    99+
    2024-05-08
    postgresql
  • TokuDB的优缺点和适用场景有哪些
    这篇文章主要介绍TokuDB的优缺点和适用场景有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! TokuDB优点:高压缩比,默认使用zlib进行压缩...
    99+
    2024-04-02
  • Percona XtraDB Cluster的缺陷有哪些
    小编给大家分享一下Percona XtraDB Cluster的缺陷有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • 云服务器实际作用有哪些方面的应用场景
    云服务器(Cloud Storage)是一种高性能、高可用、高扩展性、高可靠性的存储服务,常用于企业用户的大规模数据中心,可以帮助客户实现弹性扩展、负载均衡、高可靠性等功能,同时提供高性能的存储服务,为数据的存储、访问、分析等提供支持。 ...
    99+
    2023-10-27
    场景 作用 服务器
  • Python陷阱与缺陷列表有哪些
    本篇内容主要讲解“Python陷阱与缺陷列表有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python陷阱与缺陷列表有哪些”吧!比如,Python程序员应该都遇到过的“UnboundLoc...
    99+
    2023-06-02
  • Javascript中for in的缺陷有哪些
    这篇文章主要介绍Javascript中for in的缺陷有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Javascript for in的缺陷总结for in 语句用来列举对象...
    99+
    2024-04-02
  • jquery的load方法有哪些缺陷
    本篇内容介绍了“jquery的load方法有哪些缺陷”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!jquery load方法的缺陷:1、lo...
    99+
    2023-07-05
  • 云服务器实际作用有哪些方面的应用场景包括
    存储:云服务器可以作为一个存储服务器,将大量的数据存储在云服务器上,以提高数据存储和处理的效率。 数据库:云服务器可以作为一个数据库服务器,将用户的数据存储在云服务器上,以便用户可以随时随地访问这些数据。 网站:云服务器可以作为一个网站服...
    99+
    2023-10-27
    场景 作用 服务器
  • Java中的文件重定向技术在实际应用中有哪些场景?
    文件重定向技术是一种非常实用的技术,它可以帮助我们将程序的输出、错误信息、日志等内容重定向到文件中,从而更好地管理和查看这些信息。在Java中,文件重定向技术也被广泛应用,下面我们来看看它在实际应用中有哪些场景。 日志记录 在Java...
    99+
    2023-09-05
    文件 重定向 load
  • 云服务器实际作用有哪些方面的应用场景是什么
    存储服务:云服务器提供了高可靠性和可扩展的存储服务,可以将数据备份到云端,用户可以随时随地访问这些数据,并且可以轻松地将其恢复到本地。 计算服务:云服务器可以为用户提供高性能的计算服务,支持弹性扩容、按需计费等灵活的计算模式,为用户提供更...
    99+
    2023-10-27
    场景 作用 服务器
  • Hadoop常用的场景有哪些
    这篇文章主要讲解了“Hadoop常用的场景有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hadoop常用的场景有哪些”吧!Hadoop是什么随着数据量的急剧增加,遇到的两个最直接的问题...
    99+
    2023-06-02
  • ajax的应用场景有哪些
    1. 实时更新数据:Ajax可以使网页实时更新数据,而无需重新加载整个页面。例如,在社交媒体网站上,当有新的消息或评论时,页面可以自...
    99+
    2023-08-25
    ajax
  • redis有哪些合适的场景
    Redis适用于以下场景:1. 缓存:Redis的高性能和低延迟使其成为一个优秀的缓存解决方案,可以将频繁读取的数据缓存在Redis...
    99+
    2023-09-04
    redis
  • redis的场景应用有哪些
    这篇文章主要介绍“redis的场景应用有哪些”,在日常操作中,相信很多人在redis的场景应用有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis的场景应用有哪些”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-04
  • clickhouse的应用场景有哪些
    ClickHouse 是一个用于实时数据分析的列式数据库管理系统,主要应用于以下场景: 实时数据分析:ClickHouse 可以...
    99+
    2024-03-01
    clickhouse
  • julia的应用场景有哪些
    Julia的应用场景非常广泛,以下是一些常见的应用场景:1. 科学计算:Julia是一种高性能的科学计算语言,可用于解决数值模拟、数...
    99+
    2023-09-21
    julia
  • Android软件缺陷管理有哪些
    这篇文章主要介绍“Android软件缺陷管理有哪些”,在日常操作中,相信很多人在Android软件缺陷管理有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android软件缺陷管理有哪些”的疑惑有所帮助!...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作