如何提升和扩展 PostgreSQL — 从共享缓冲区到内存数据网格

news/2024/7/9 22:39:41 标签: postgresql, 数据库

利用共享缓存和操作系统缓存利用 RAM

Postgres 是一个基于磁盘的数据库,即使您的整个架构是围绕磁盘访问设计的,利用 RAM 也很重要。如果按照人类规模的延迟来判断,这可以将延迟从几天缩短到几分钟(图 1)。只需看一下下表即可看出,与磁盘 I/O 相比,访问 RAM 或英特尔傲腾 DC PM 的速度要快得多。

图片标题

标准 Postgres 部署有两种常见的解决方案 - 共享缓冲区缓存和通用 操作系统页面缓存。前者缓存数据和关系索引,Postgres 完全管理该组件,而后者由操作系统提供给所有应用程序,只是将文件页面/块保留在内存中。哪一种更好取决于用例。 

然而,如果 Postgres 在具有足够 RAM 的单台机器上运行并且不需要横向扩展,那么这些缓存技术就足够了。但是,一旦数据量和负载超过了即使是最强大的机器的容量,我们就会开始寻找另一种解决方案。好吧,如果共享缓冲区或操作系统页面缓存适用于所有场景,我们就不会拥有分布式内存数据库

使用 Pgpool-II 进行负载平衡

让我们暂时忘记高级缓存解决方案,假设单机 Postgres 无法承受不断增长的负载,这是一个经典的负载平衡问题。

Pgpool II需要作为第一个可能的选项进行审查,特别是如果您的用例读取量很大。如图所示,您需要部署多个 Postgres 实例,将它们放在 Pgpool 协调器实例后面,并让它负载平衡查询。

但是,有几点需要考虑并制定架构清单:

  • 拥有的副本越多,更新速度就越慢。主数据库实例必须保持从数据库同步。对于许多场景,如果无论哪个副本将服务于请求,都必须为应用程序保留 ACID 保证,则复制需要同步。
  • 拥有副本意味着解决方案的有用容量受到主实例上可用存储空间的限制。例如,在具有三个副本的集群中,即使每台 Postgres 计算机运行 2 TB 磁盘(总共 6 TB),您也无法存储超过 2 TB 的应用程序生成的唯一数据。如果需要存储更多,则需要分配容量更大的机器。

那么,我们如何才能以弹性和无限的可扩展性来支持写入密集型或混合工作负载呢?让我们在下一节中回顾一下。

使用 Postgres-XL 和云解决方案进行扩展

分片和分区让Postgres从单机数据库转变为纯粹的分布式存储。Postgres-XL可以将数据均匀地分配到集群的整个存储空间,从而支持写入密集型和混合工作负载,并且有可能能够存储无限的数据集。

此类解决方案的架构没有显着差异。请参阅 Postgres-XL 架构(图 3),该架构由存储分布式数据集的数据节点、了解数据分布并处理应用程序请求的协调器以及在集群中强制执行事务一致性的全局事务管理器组成。 

但即使这些解决方案也不足以满足所有使用场景。那么还缺少或需要什么呢?答案是——记忆。这些解决方案仍然基于磁盘,尽管可以为每个数据节点启用共享缓冲区和操作系统页面缓存,但这种配置将很笨拙且难以管理以确保大规模一致且可预测的延迟。 

最后,我们来谈谈专为 RAM 和英特尔傲腾 DC PM 设计的分布式内存存储,以确保我们能够充分发挥分布式内存存储的潜力。

使用内存数据网格进行缓存和扩展

内存数据网格是一种分布式内存存储,可以部署在 Postgres 之上,并通过直接从 RAM 处理应用程序请求来卸载后者。网格有助于将可扩展性和缓存结合在一个系统中,以大规模地利用它们。

Apache Ignite和GridGain是此类解决方案的示例之一,如下图所示,它们与 Postgres 互连并使其与内存中数据集保持同步:

Ignite 和 GridGain 分区数据的方式与 Postgres-XL 的方式类似,只有一个例外:内存成为主存储,而 Postgres 则保留为辅助磁盘存储。Ignite 和 Gridgain 都支持无限的水平可扩展性、SQL、分布式事务等。您实际上可以在 RAM 中存储 TB 级和 PB 级的数据。

总之,我们总结一下讨论的用于增强和扩展 Postgres 的所有选项:

  • 共享缓冲区和操作系统页面缓存非常适合单机部署,作为利用内存的一种方式。
  • Pgpool-II 完美解决了读取繁重的工作负载的负载平衡问题。
  • Postgres-XL 和类似的解决方案将 Postgres 转变为基于磁盘的分布式数据库,用于处理大量写入和混合工作负载。
  • Apache Ignite 和 GridGain 作为内存中的数据网格,让我们能够大规模地分布式并利用内存,同时将 Postgres 保留为磁盘存储。 

http://www.niftyadmin.cn/n/5076335.html

相关文章

【bug日记】spring项目使用配置类和测试类操作数据库

最近学校课程要求使用spring操作数据库&#xff0c;时间有点久了&#xff0c;操作都不太熟悉了&#xff0c;遇到了很多坑&#xff0c;特此记录一下。 导入依赖 <!-- Spring Framework --> <dependency><groupId>org.springframework</groupId><ar…

手写Java序列化工具

一、思考 假设给一个java bean&#xff0c;让你按照 json 的格式打印出来&#xff0c;你会怎么做&#xff1f; 比如这个java bean 长这样&#xff0c;并且创建了一个叫宝儿姐的朋友 package com.test;public class User {private String name;private Integer age;private Bi…

什么是Java动态代理?(动态代理篇 一)

简介 Java动态代理是一种在运行时创建代理对象的技术&#xff0c;它可以在不修改原始类的情况下&#xff0c;对类的方法进行控制和扩展。常见应用场景&#xff1a;AOP&#xff08;面向切面编程&#xff09;、事务管理、权限控制、日志记录等等。 特点 灵活性&#xff1a;动态…

centos7.6升级openssh9.3p1,openssl1.1.1t

一、安装前查看系统及版本 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # ssh -V OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013 二、安装步骤 1.下载tar包 ​wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz --no-check-certifica…

CocosCreator 面试题(三)JavaScript闭包原理和作用

1、JavaScript闭包是什么&#xff1f; JavaScript闭包是指在函数内部创建的函数&#xff0c;它可以访问并持有创建它的父函数作用域中的变量&#xff0c;即使父函数已经执行完毕。闭包是JavaScript中强大而有用的概念&#xff0c;它可以用于创建私有变量、实现模块化和封装性&a…

用 HTTP 提交数据,基本就这 5 种方式

网页开发中&#xff0c;向服务端提交数据是一个基本功能&#xff0c;工作中会大量用 xhr/fetch 的 api 或者 axios 这种封装了一层的库来做。 可能大家都写过很多 http/https 相关的代码&#xff0c;但是又没有梳理下它们有哪几种呢&#xff1f; 其实通过 http/https 向服务端…

【C语言】字符函数和内存操作函数

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解字符函数和内存操作函数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一.字符函数1.1 字符分类函数1.2 字符转换函数 二.内存操作函数2.1 memcpy2.2…

设x为整数,[x]补=1,x1x2x3x4x5,若要x<-16,x1~x5应满足的条件是()

设x为整数&#xff0c;[x]补1&#xff0c;x1x2x3x4x5&#xff0c;若要x<-16&#xff0c;x1~x5应满足的条件是&#xff08;&#xff09; 原题描述: 设 x 为整数&#xff0c; [ x ] 补 1 &#xff0c; x 1 x 2 x 3 x 4 x 5 , 若要 x < − 16 &#xff0c; x 1 … … x 5 …