网站首页 > 精选文章 正文
0.简介
本文主要介绍PG的分布式插件Citus,主要介绍其实现方式(如何将单机转换为分布式的):主要包含数据存储(分片方式,表类型)处理,分布式计划,分布式事务以及集群管理内容。
1.Citus整体架构
Citus是share nothing分布式架构,其中每个角色都是PG,没有其他中间件。节点分为以下两种类型:
1)Coordinator节点(也叫CN):负责接受客户端请求,集群元数据管理和分布式计划。
2)Worker节点(也叫DN):负责实际存储分片数据。
2.数据存储
2.1 数据分片
从数据存储角度来看,如何将数据分布到多个worker节点上,Citus提供了两种常用的方式:
1)hash分片:使用一致性hash原理,按照常用的hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。选择一个合理的分布列可以很好的解决数据分布不均匀和访问热点的问题。
2)range分片:设置节点不同值的范围,分片范围人工指定。
2.2 表类型
其分片是需要存储的,citus中存储了三种表记录相关信息:
1)Distributed tables:分片表,就是使用上述hash分片和range分片的表。
2)Reference tables:参考表,每个DN上有表的全部数据,相当于复制表。
3)Local tables:本地表,只存在于CN上,可以直接使用,不需要使用worker。
3.分布式计划
其分布式计划的改写主要利用PG本身提供的扩展接口,使用扩展插件的方式来处理,不改动内核代码,关键点在于查询计划器和执行器的hook,将其替换为Citus的实现,在PG语法解析后,如果有涉及的Citus表,将会生成一个包含CustomScan节点的计划树,其会调用分布式查询执行器,发送查询给其他worker节点,然后收集结果。
其中执行器可以执行各种复杂的操作,如需要重分布的操作。这部分充分考虑了三种表类型需要的计划逻辑和尽可能做到逻辑下推,本文不详细讨论这些细节,而是重点关注其扩展方式。
4.分布式事务
Citus分布式事务的实现是采用的2PC的方式,2PC是分布式事务的一种常见做法,主要流程是Prepare和Commit,也就是分了准备阶段和提交阶段,下面对Citus的实现来进行分析。
4.1 角色
1)CN:是二阶段事务的发起者,其中有daemon进程负责事务恢复和回滚。
2)DN:负责执行和返回状态
4.2 流程
流程中包含多种可能的异常场景,和常规2PC提交类似,本节主要描述正常提交流程和遇到异常时的对于需要频繁访问的表的一些优化操作。
对于这三个步骤做的事情每一步都有失败的可能,其对应的操作就是去清理相关信息(也就是回滚),在此过程中有一些事务相关的表会成为读写热点,为了去除锁造成的性能影响,其采用的是二次检测方式,同时为了避免死锁,采用有向图的方式来进行死锁检测。
5.集群管理
集群管理主要介绍高可用和备份。
5.1 高可用
PG本身就是支持多副本的复制,在HA的设置中,集群中的每个节点都存在热备份节点,当一个节点失败后,会主备交换,更新Citus元数据和其节点地址,这就是高可用的处理。
5.2 备份
备份时通过定时的创建磁盘快照或者数据库目录副本,并在每个服务器中将WAL持续存档到远程存储来实现,Citus还支持定期创建还原点,也就是每个节点的WAL记录,保证多节点的一致性。
猜你喜欢
- 2025-07-03 云贝数据 | PG快速构建海量数据方法
- 2025-07-03 Postgresql 查看死锁以及解除死锁
- 2025-07-03 PostgreSQL技术内幕17:PG分区表(pgsql 分区表)
- 2025-07-03 postgresql一些常用命令「一」(postgresql重启)
- 2025-07-03 PG server 磁盘空间占满问题的处理方法 | 运维进阶
- 2025-07-03 巴雷特(Barrett)食管(巴雷特食管是什么意思 百度百科)
- 2025-07-03 PostgreSQL pg_hba.conf 文件简析
- 2025-07-03 PostgreSQL 数据库管理软件对比之pgAdmin & CLup
- 2025-07-03 国产数据库的AWR差在哪了?(数据库awr报告怎么看)
- 2025-07-03 前端学不动了: Postgres——世界上最先进的开源关系型数据库
- 07-03CentOS7系统如何修改主机名(更改centos主机名)
- 07-03Ubuntu1804 及以上版本的 Coredump 相关设置
- 07-03Linux中如何修改ip地址?(linux系统怎么更改ip地址)
- 07-03Linux系统日常运维九大核心技能(linux运维都干什么)
- 07-03Linux 日志管理攻略:用 journalctl 揪出服务器安全隐患
- 07-03Linux下快速安装ollama和deepseek并使用web界面
- 07-03RockyLinux9.5下使用ollama搭建本地AI大模型DeepSeek
- 07-03Linux 下的 PM2 完整指南(linux /media)
- 最近发表
-
- CentOS7系统如何修改主机名(更改centos主机名)
- Ubuntu1804 及以上版本的 Coredump 相关设置
- Linux中如何修改ip地址?(linux系统怎么更改ip地址)
- Linux系统日常运维九大核心技能(linux运维都干什么)
- Linux 日志管理攻略:用 journalctl 揪出服务器安全隐患
- Linux下快速安装ollama和deepseek并使用web界面
- RockyLinux9.5下使用ollama搭建本地AI大模型DeepSeek
- Linux 下的 PM2 完整指南(linux /media)
- Rocky Linux 9常用命令备忘录(不定时更新)
- Rocky Linux 9 系统初始化与安全加固脚本
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)