【赵渝强老师】基于PostgreSQL的分布式数据库:Citus

在这里插入图片描述

由于PostgreSQL具有强大的功能和良好的可扩展性,因此基于PostgreSQL很容易就可以实现分布式架构。Citus便是具体的一种实现方式。它以扩展的插件形式与PostgreSQL进行集成,且独立于PostgreSQL内核,部署也比较简单。Citus是现在非常流行的基于PostgreSQL的分布式解决方案。

一、 Citus基础

下面是百度百科中对分布式数据库的定义:

分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都可能有DBMS的一份完整拷贝副本,或者部分拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库。
——摘自《百度百科》

1.1 为什么需要分布式数据库?

随着行业应用所产生的数据量呈爆炸式增长,传统的集中式数据库面对大规模数据处理逐渐表现出其局限性。这主要体现在以下三个方面:

  • 应用请求访问的数据量巨大;
  • 由于数据量巨大,造成服务器CPU、内存、网络、I\O都遇到瓶颈,从而造成性能下降;
  • 传统的集中式数据库在设计之初并不包含任务的并行执行,从而导致并行执行有天然的缺陷,对于分区也是如此。

因此,能快速处理数据和及时响应用户访问的新方法,以及对数据进行集中分析、管理和维护,这已经成为迫切需求。基于这样的背景,分布式数据库便在集中式数据库的基础上迅速发展起来的。分布式数据库是指数据在物理上分布而在逻辑上集中管理的数据库系统。

物理上分布是指数据分布在物理位置不同并由网络连接的节点或站点上;逻辑上集中是指各数据库节点之间的逻辑上是一个整体,并由统一的数据库管理系统管理。

分布式数据库具有数据透明性、数据冗余性、易于扩展性、自治性等特点,还具有经济、性能优越、响应速度更快、灵活的体系结构、易于集成现有系统等特点。但分布式数据库强烈依赖网络,且对事务的处理远没有传统的集中式数据库成熟。因此在很长一段时间内分布式数据存储将与传统数据存储共存。

1.2 什么是Citus?

Citus采用shared nothing架构,节点之间无共享数据,它是一款基于PostgreSQL的开源分布式数据库。Citus不仅仅兼容PostgreSQL的客户端协议,同时也兼容PostgreSQL的服务端扩展和管理工具。相比单实例的PostgreSQL数据库来说,Citus可以使用更多的CPU内核,更多的内存数量,保存更多的数据。通过向集群添加节点,Citus可以轻松的扩展数据库。Citus的最大特点是它是一个PostgreSQL扩展而不是一个独立的代码分支。因此Citus可以用很小的代价和更快的速度与PostgreSQL进行集成,同时又能最大程度的保证数据库的稳定性和兼容性。下图展示了Citus的体系架构。

在这里插入图片描述

视频讲解如下

【赵渝强老师】基于PostgreSQL的分布式数据库:Citus

Citus的体系架构中包含协调者节点和工作者节点,即:Coordinator节点和Worker节点。SQL语句经过语法解析后,在协调者节点的分析阶段被Citus扩展所替换,将其转换为并行执行的SQL分发到后端的工作者节点上执行。

这里的协调者和工作者都是PostgreSQL数据库实例。

二、 安装与配置Citus

在了解到了Citus的基本知识以后,下面便通过具体的步骤来演示如何安装和配置Citus。

Citus既可以安装在单机环境中,也可以安装在多机环境中。下面将以单机环境来进行演示说明。

(1)将用户postgres添加到系统的/etc/sudoers文件中。

postgres ALL=(ALL)       ALL

(2)切换到postgres用户

su - postgres

(3)安装Citus的域名源

curl https://install.citusdata.com/community/rpm.sh | sudo bash# 输出的信息如下:
Detected operating system as centos/7.
Checking for curl...
Detected curl...
Checking for postgresql15-server...
Installing pgdg repo... Error: Nothing to do
done.
Checking for EPEL repositories...
Detected EPEL repoitories
Downloading repository file
Installing pygpgme to verify GPG signatures... done.
Installing yum-utils... done.
Generating yum cache for citusdata_community... done.The repository is set up! You can now install packages.# 这一步需要输入用户postgres的密码。

(4)安装Citus。

sudo yum install -y citus113_15# 这一步会自动将PostgreSQL 15安装到/usr/pgsql-15/目录下。

《PostgreSQL数据库实战派》

(5)查看目录/usr/pgsql-15/的结构。

[postgres@mydb ~]$ tree -d -L 2 /usr/pgsql-15/
/usr/pgsql-15/
├── bin
├── doc
│   └── extension
├── include
│   └── server
├── lib
│   ├── bitcode
│   └── citus_decoders
└── share├── extension├── locale├── man├── timezonesets└── tsearch_data

(6)创建协调者和工作者的目录。

mkdir -p /home/postgres/citus_cluster/coordinator
mkdir -p /home/postgres/citus_cluster/worker1
mkdir -p /home/postgres/citus_cluster/worker2# 这里将以一个协调者和两个工作者来进行演示。

(7)实例化PostgreSQL数据库数据目录

/usr/pgsql-15/bin/initdb -D /home/postgres/citus_cluster/coordinator
/usr/pgsql-15/bin/initdb -D /home/postgres/citus_cluster/worker1
/usr/pgsql-15/bin/initdb -D /home/postgres/citus_cluster/worker2

(8)修改coordinator的postgres.conf配置文件中的以下参数。

port = 5432
shared_preload_libraries = 'citus'

(9)修改worker1的postgres.conf配置文件中的以下参数。

port = 5433
shared_preload_libraries = 'citus'

(10)修改worker2的postgres.conf配置文件中的以下参数。

port = 5434
shared_preload_libraries = 'citus'

(11)启动coordinator、worker1和worker。

/usr/pgsql-15/bin/pg_ctl \-D /home/postgres/citus_cluster/coordinator \-l logfile start/usr/pgsql-15/bin/pg_ctl \-D /home/postgres/citus_cluster/worker1 \-l logfile start/usr/pgsql-15/bin/pg_ctl \-D /home/postgres/citus_cluster/worker2 \-l logfile start

(12)登录coordinator、worker1和woker2创建数据库和Citus扩展。

-- coordinator节点
[postgres@mydb citus_cluster]$ /usr/pgsql-15/bin/psql 
psql (15.3)
Type "help" for help.postgres=# create database mydemodb;
CREATE DATABASE
postgres=# \c mydemodb 
You are now connected to database "mydemodb" as user "postgres".
mydemodb=# create extension citus;
CREATE EXTENSION
mydemodb=# -- woker1节点
[postgres@mydb citus_cluster]$ /usr/pgsql-15/bin/psql -p 5433
psql (15.3)
Type "help" for help.postgres=# create database mydemodb;
CREATE DATABASE
postgres=# \c mydemodb 
You are now connected to database "mydemodb" as user "postgres".
mydemodb=# create extension citus;
CREATE EXTENSION
mydemodb=# -- woker2节点
[postgres@mydb citus_cluster]$ /usr/pgsql-15/bin/psql -p 5434
psql (15.3)
Type "help" for help.postgres=# create database mydemodb;
CREATE DATABASE
postgres=# \c mydemodb 
You are now connected to database "mydemodb" as user "postgres".
mydemodb=# create extension citus;
CREATE EXTENSION
mydemodb=# 

(13)在coordinator节点上向集群添加worker节点。

[postgres@mydb citus_cluster]$ /usr/pgsql-15/bin/psql 
psql (15.3)
Type "help" for help.postgres=# \c mydemodb 
You are now connected to database "mydemodb" as user "postgres".
mydemodb=# select * from mastmydemodb=# select * from master_add_node('127.0.0.1',5433);master_add_node 
-----------------1
(1 row)mydemodb=# select * from master_add_node('127.0.0.1',5434);master_add_node 
-----------------2
(1 row)

(14)在coordinator节点上验证集群中的worker节点信息。

mydemodb=# select * from master_get_active_worker_nodes();# 输出的信息如下:node_name | node_port 
-----------+-----------127.0.0.1 |      5433127.0.0.1 |      5434
(2 rows)

《PostgreSQL数据库实战派》

(15)通过查询pg_dist_node表可以获取worker节点的详细信息。

mydemodb=# \x
mydemodb=# select * from pg_dist_node ;# 输出的信息如下:
-[ RECORD 1 ]----+----------
nodeid           | 1
groupid          | 1
nodename         | 127.0.0.1
nodeport         | 5433
noderack         | default
hasmetadata      | t
isactive         | t
noderole         | primary
nodecluster      | default
metadatasynced   | t
shouldhaveshards | t
-[ RECORD 2 ]----+----------
nodeid           | 2
groupid          | 2
nodename         | 127.0.0.1
nodeport         | 5434
noderack         | default
hasmetadata      | t
isactive         | t
noderole         | primary
nodecluster      | default
metadatasynced   | t
shouldhaveshards | t

至此Citus分布式数据库集群环境配置完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86805.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【赵渝强老师】OceanBase OBServer节点的接入层

OceanBase数据库代理ODP(OceanBase Database Proxy,又称OBProxy)是OceanBase数据库的接入层,负责将用户的请求转发到合适的OceanBase数据库实例上进行处理。ODP是独立的进程实例,独立于OceanBase数据库实例部署。ODP监…

ISP Pipeline(8): Color Space Conversion 颜色空间转换

Color Space Conversion(颜色空间转换) 是图像处理中的一个重要步骤,它将图像从一个颜色空间(Color Space)转换到另一个,以满足 显示、分析、压缩或算法需求。 为什么转换颜色空间? 应用场景…

Spring Web MVC ①

🚀 一、Spring MVC MVC三层 Controller:乐团指挥,接收请求→调用模型→选择视图(Controller) Model:乐手,处理业务逻辑与数据(POJO对象) View:舞台展示&…

【数据挖掘】贝叶斯分类学习—NaiveBayes

NaiveBayes 朴素贝叶斯的核心是贝叶斯定理,它描述了如何根据新证据更新事件的概率。 要求: 1、实现朴素贝叶斯分类算法,验证算法的正确性,并将算法应用于给定的数据集Data_User_Modeling数据集,选择一部分数据集作为已…

Java面试宝典:基础二

🔒 25. final vs abstract 关键字 关键字修饰对象作用规则final类禁止被继承final class MyClass { ... }方法禁止被子类重写public final void func()变量变为常量(基本类型值不可变,引用类型地址不可变)final int MAX 100;abs…

小米手机安装charles证书

使用红米手机下载Charles证书一直下载中,无法正常下载。 不使用原装浏览器,使用第三方浏览器下载就可以了。 使用第三方浏览器安装,如我使用的是UC浏览器 使用第三方浏览器安装的证书格式是".pem"格式问卷 将这个文件放入小米的dow…

DeepSeek R2 推迟发布:因 H20 算力短缺

DeepSeek 今年早些时候凭借其 R1 AI 模型备受广泛关注。据《The Information》报道,R2 模型的工作似乎因 H20 处理器而停滞不前。 DeepSeek尚未透露其R2 模型的具体上市时间。 DeepSeek 使用 5 万块 Hopper GPU(包括 3 万块 H20、1 万块 H800 和 1 万块…

智能之火,重塑创造:大模型如何点燃新一代开发引擎?

导言:普罗米修斯之火再现 在科技演进的长河中,每一次生产力的跃迁都伴随着工具的质变。从蒸汽机轰鸣到电力普及,再到信息高速公路的铺就,人类驾驭能量的能力不断突破。今天,我们站在一个崭新的临界点上:大语…

一文入门JS

转自个人博客 因为本人经常使用QML,而由于QML与JS之间的关系,本人经常使用到JS相关语法,所以在此系统性对JS基础知识进行总结、记录。 1. 入门 JavaScript(简称 JS)是一种广泛应用于Web开发的脚本语言,它…

libtool: error: ‘/usr/.local/lib/libgmp.la‘ is not a valid libtool archive

背景: 安装gcc时提示需要vc11,然后安装gcc依赖gmp、mpfr、mpc。 到mpc make时出错: libtool: error: ‘/usr/.local/lib/libgmp.la’ is not a valid libtool archive 详细: /usr/bin/grep: /usr/.local/lib/libgmp.la: No such f…

HDC2025聚焦鸿蒙生态,FairGuard加固方案保驾护航

近日,在2025年华为开发者大会(HDC)上,华为正式启动HarmonyOS 6开发者Beta,并全面展示一年多以来与合作伙伴共建鸿蒙生态的创新成果:“累计有9000多个应用参与了70多个系统级创新体验的联合打造,目前有3万多鸿蒙应用和元…

GAN的思考及应用

一、对文献的思考 CycleGAN的思考,前两周看到了关于CycleGAN的原始论文,是用于处理图像数据,有了如下思考: 1、基础理论与方法 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》是Cycle…

Xcode26新特性与iOS26适配指南

Xcode 26 新特性 在 WWDC25 上 Apple 推出了 Xcode 26,相比较 Xcode 16,它有如下的变化。 项目 安装包更小,其他组件与工具链只有在需要时才会下载。设置界面重新设计,菜单从顶部挪到了左侧,其中 Accounts 改名为 Apple Accounts,Text Editing 改名为 Editing,Key Bind…

闲庭信步使用SV搭建图像测试平台:第二十课——RGB图像转HSV图像

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注…

Django的CSRF保护机制

一、Django的CSRF保护机制 1. 核心原理 作用&#xff1a;防止跨站请求伪造&#xff08;CSRF&#xff09;攻击&#xff0c;确保表单提交来源可信。实现方式&#xff1a; 在模板中使用{% csrf_token %}生成一个隐藏的<input>字段&#xff08;如csrfmiddlewaretoken&#…

JavaScript中的回调函数详解

JavaScript中的回调函数详解 1.1 概念 1.1.1 什么是回调函数 **回调函数&#xff08;Callback Function&#xff09;**是你将一个函数的引用&#xff08;指针&#xff09;作为参数传递给另一个函数&#xff0c;在那个函数完成任务后调用回来执行你传递的函数。简单的来说就是…

Utils系列之内存池(Fixed size)

内存池核心介绍 废话不多说&#xff0c;show you code. 我实现了两套内存池&#xff0c;一个是固定大小的内存池&#xff0c;一个是多重不同大小的内存池。 Fixed size memory pool 设计思路&#xff1a; 我们一个个看&#xff0c;首先我们定义了一个chunk, chunk 里面包含…

ubuntu安装docker遇到权限问题

问题现象&#xff1a; 使用snap安装的docker&#xff0c;执行docker build命令构建景象时报错&#xff1a; [] Building 0.1s (1/1) FINISHED docker:default > [internal] load build definition from Dockerfile 0.0s > > transferring dockerfile: 2B 0.0s ERROR:…

在Linux系统中部署Java项目

1.在Linux中启动mysql的服务: systemctl start mysql可以采用以下代码查看状态: systemctl status mysql如下图展示绿色代表启动成功 2.之后进入mysql mysql -uroot -p输入自己的密码&#xff0c;这里的密码不会显示,直接输入即可 3.在DG中连接Linux的数据库 4.修改配置文件…

C++洛谷P1002 过河卒

题目 链接&#xff1a;https://www.luogu.com.cn/problem/P1002 解析 这道题适用于了解动态规划的同学。 变量初始化 初始化B点坐标&#xff08;n, m&#xff09;和马的坐标&#xff08;a, b&#xff09; 初始化方向数组和动态规划数组 long long dp[30][30]; int dx[8] …