当前位置: 首页 > news >正文

如何提升和扩展 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 保留为磁盘存储。 

相关文章:

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

利用共享缓存和操作系统缓存利用 RAM Postgres 是一个基于磁盘的数据库,即使您的整个架构是围绕磁盘访问设计的,利用 RAM 也很重要。如果按照人类规模的延迟来判断,这可以将延迟从几天缩短到几分钟(图 1)。只需看一下…...

Elasticsearch:使用 huggingface 模型的 NLP 文本搜索

本博文使用由 Elastic 博客 title 组成的简单数据集在 Elasticsearch 中实现 NLP 文本搜索。你将为博客文档建立索引,并使用摄取管道生成文本嵌入。 通过使用 NLP 模型,你将使用自然语言在博客文档上查询文档。 安装 Elasticsearch 及 Kibana 如果你还没…...

论文解析——异构多芯粒神经网络加速器

作者 朱郭益, 马胜,张春元, 王波(国防科技大学计算机学院) 摘要 随着神经网络技术的快速发展, 出于安全性等方面考虑, 大量边缘计算设备被应用于智能计算领域。首先,设计了可应用于边缘计算的异构多芯粒神经网络加速器其基本结构…...

MyBatisPlus(十六)逻辑删除

说明 实际生产中的数据,一般不采用物理删除,而采用逻辑删除,也就是将一条记录的状态改为已删除。 逻辑删除,本质上是更新操作。 MyBatis Plus 框架,提供了逻辑删除功能。在配置了逻辑删除后,增删改查和统…...

基于黏菌优化的BP神经网络(分类应用) - 附代码

基于黏菌优化的BP神经网络(分类应用) - 附代码 文章目录 基于黏菌优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.黏菌优化BP神经网络3.1 BP神经网络参数设置3.2 黏菌算法应用 4.测试结果:5.M…...

C语言基础语法复习08-位域bit-fields

在c2011 iso文档中,位域与struct、union是一起定义的: Structure and union specifiers Syntaxstruct-or-union-specifier:struct-or-union identifier opt { struct-declaration-list }struct-or-union identifierstruct-or-union:structunionstruct-d…...

3.2.OpenCV技能树--二值图像处理--图像腐蚀与膨胀

文章目录 1.文章内容来源2.图像膨胀处理2.1.图像膨胀原理简介2.2.图像膨胀核心代码2.3.图像膨胀效果展示 3.图像腐蚀处理3.1.图像腐蚀原理简介3.2.图像腐蚀核心代码3.3.图像腐蚀效果展示 4.易错点总结与反思 1.文章内容来源 1.题目来源:https://edu.csdn.net/skill/practice/o…...

基于FPGA的数字时钟系统设计

在FPGA的学习中,数字时钟是一个比较基础的实验案例,通过该实验可以更好的锻炼初学者的框架设计能力以及逻辑思维能力,从而打好坚实的基本功,接下来就开始我们的学习吧! 1.数码管介绍 数码管通俗理解就是将8个LED(包含…...

linux centos Python + Selenium+Chrome自动化测试环境搭建?

在 CentOS 系统上搭建 Python Selenium Chrome 自动化测试环境,需要执行以下步骤: 1、安装 Python CentOS 7 自带的 Python 版本较老,建议使用 EPEL 库或源码安装 Python 3。例如,使用 EPEL 库安装 Python 3: sud…...

mysql面试题20:有哪些合适的分布式主键方案

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:有哪些合适的分布式主键方案? UUID:UUID通常是由一个二进制的128位整数表示,可以保证全局的唯一性。在Java中,可以通过UUID类生成一个UUID。例…...

git的基础操作

https://blog.csdn.net/a18307096730/article/details/124586216?spm1001.2014.3001.5502 1:使用场景 SVN,如果服务器里面的东西坏掉了,那么就全线崩盘了。 1:基本配置 git config --global user.name “luka” (自己的名字就行) git co…...

lua 中文字符的判断简介

一般在工作中会遇到中文字符的判断、截断、打码等需求,之前一直没有总结,虽然网上资料也多,今天在这里简单的总结一下。 1 .UTF-8简单描述 UTF-8 是 Unicode 的实现方式之一,其对应关系(编码规则)如下表所…...

SSM-XML整合

SSM-XML整合 核心配置文件 maven坐标 <dependencies><!--数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency><!--数据…...

线性代数小例子

这样做有什么问题呢&#xff1a; A 2 A > A ( A − E ) 0 > A E A 0 A^2 A > A(A - E) 0> A E \quad A 0 A2A>A(A−E)0>AEA0 上述做法是错误的&#xff0c;这是因为两个矩阵的乘积结果为0&#xff0c;并不能说明这两个矩阵就是0&#xff0c;即上述…...

ASP.NET Core 开发 Web API

2. Web Api 的创建与Http类型的介绍 2.1 ASP.Net Core Web API项目的创建 1.创建ASP.NET Core Web API项目 从“文件”菜单中选择“新建”“项目”。 在搜索框中输入“Web API”。 选择“ASP.NET Core Web API”模板&#xff0c;然后选择“下一步”。 在“配置新项目”对话框中…...

QImage函数setAlphaChannel

最近使用QImage的函数setAlphaChannel时遇到了一个坑&#xff0c;花了不少时间才弄清楚&#xff1a;在使用这个函数后&#xff0c;图像格式都会变成QImage::Format_ARGB32_Premultiplied。 先看下setAlphaChannel在帮助文档的说明&#xff1a; void QImage::setAlphaChannel(…...

区块链、隐私计算、联邦学习、人工智能的关联

目录 前言 1.区块链 2.隐私计算 3.联邦学习&#xff08;隐私计算技术&#xff09; 4.区块链和联邦学习 5.区块链和人工智能 展望 参考文献 前言 区块链公开透明&#xff0c;但也需要隐私&#xff0c;人工智能强大&#xff0c;但也需要限制。当前我们需要的是一个在保证…...

Unity可视化Shader工具ASE介绍——4、ASE的自定义模板使用

大家好&#xff0c;我是阿赵。   继续介绍Unity可视化Shader编辑工具ASE。之前的文章介绍了在ASE里面可以选择不同的Shader类型。这一篇来继续探讨一下&#xff0c;这些Shader类型究竟是什么。 一、所谓的Shader类型是什么 选择不同的Shader类型&#xff0c;会出现不同的选项…...

FastAPI学习-22.response 异常处理 HTTPException

前言 某些情况下&#xff0c;需要向客户端返回错误提示。 这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。 需要向客户端返回错误提示的场景主要如下&#xff1a; 客户端没有执行操作的权限客户端没有访问资源的权限客户端要访问的项目不存在等等 … 遇到这些…...

75.颜色分类

原地排序&#xff1a;空间复杂度为1 class Solution { public:void sortColors(vector<int>& nums) {if(0){//法一&#xff1a;单指针两个遍历int nnums.size();int ptr0;for(int i0;i<n;i){if(nums[i]0){swap(nums[i],nums[ptr]);ptr;}}for(int iptr;i<n;i){…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...