O2OA中如何使用PostgreSQL + Citus 实现分布式数据库实现方案?

2023-05-16

虽然 O2OA 数据表高效的表结构以及索引的设计已经极大程度地保障了数据存取操作的性能,但是随着使用时间从增长,数据表存放的数据量也会急剧增长。此时,仍然需要有合适的方案来解决数据量产生的系统性能瓶颈。本文介绍通过 PostgreSQL + Citus 来实现分布式数据方案来进一步提升 QRY_ITEM 表在大数据量数据存储中系统性能。基于 PostgreSQL 数据库,比如 KingBase,OpenGauss 等都可以通过相同的方式实现分布式数据存储。

一、O2OA 数据库支持类型

O2OA 底层依靠 Druid + JPA (OPENJPA) + 自定访问配置 (OPENJPA Dictionary) 实现对各种数据库的支持,目前支持 MySQL, PostgreSQL, Oracle, DB2, SQLServer, Sybase, Firebird 等数据库,也支持 KingBase, 南大通用, opengauss, 达梦, 神舟通用数据库, 对于其他数据库可以通过自定义 dictionary 来实现支持。

二、O2OA 数据库表介绍

O2OA 默认会创建 200 多张数据表来存储数据,其中大部分数据都集中存储在以下表中:

  • PP_C_TASK:流程平台待办

  • PP_C_TASKCOMPLETED:流程平台已办

  • PP_C_READ:流程平台待阅

  • PP_C_READCOMPLETED:流程平台已阅

  • PP_C_REVIEW:流程平台权限

  • PP_C_WORK:流程平台工作实例

  • PP_C_WORKCOMPLETED:流程平台已完成实例

  • CMS_DOCUMENT:内容平台文档实例

  • CMS_REVIEW:内容平台权限

  • QRY_ITEM:流程平台和内容平台字段

尤其是 QRY_ITEM 表,流程平台以及内容平台中所有的字段值都分行单独存储在这个表中,这张表的数据量将会非常大。

虽然 QRY_ITEM 以及索引的设计已经极大程度地保障了数据存取操作的性能,但是随着使用时间从增长,QRY_ITEM 表存放了数以亿计的数据,仍然需要有合适的方案来解决数据量产生的系统性能瓶颈。

本文介绍通过 PostgreSQL + Citus 来实现分布式数据方案来进一步提升 QRY_ITEM 表在大数据量数据存储中系统性能。基于 PostgreSQL 数据库,比如 KingBase,OpenGauss 等都可以通过相同的方式实现分布式数据存储。

三、Citus 介绍

Citus 是 PostgreSQL 数据库的分布式中间件,用以解决 PostgreSQL 横向扩展问题,旨在帮助应对大规模数据集和高并发负载,以支持更大的数据量、更大的写入和查询性能。

Citus 允许将数据水平分片,并将其分布在多个节点上,从而使查询可以并行执行,以提高查询性能。

Citus 还提供了用于数据分区、复制和故障转移的工具,以确保高可用性和数据安全性。

此外,Citus 支持在 PostgreSQL 上使用常见的 SQL 功能,例如外键约束、触发器和索引等。

Citus 还提供了一些高级功能,例如跨分片的查询和分布式事务等,这些功能可以让开发人员更容易地处理大规模数据集。

四、方案目标介绍

实现分布式数据存储。在安装配置步骤我们将实现以下目标:

在分布式存储配置步骤我们将实现以下目标:

五、安装配置介绍

1、服务器准备

下面我们进行安装演示说明,我们一共准备了 4 台服务器用于安装整个环境,服务器说明如下:

服务器

地址

用途

操作系统

O2OA

172.16.91.59

O2OA 应用服务器

Ubuntu 22.04

Citus

172.16.91.60

PostgreSQL Citus 服务器

Ubuntu 22.04

node1

172.16.91.61

PostgreSQL Citus 工作节点 1

Ubuntu 22.04

node2

172.16.91.62

PostgreSQL Citus 工作节点 2

Ubuntu 22.04

2、安装 Postgresql

这个步骤我们将在 Citus, node1, node2 服务器上安装全新的 PostgreSQL 数据库。

在后面的步骤里,我们还要在这 3 台服务器上安装 Citus,所以需要安装和 Citus 版本所匹配的 PostgreSQL 版本。

由于 Ubuntu 仓库中默认的 PostgreSQL 版本比较老,所以我们通过 Postgresql 仓库安装 PostgreSQL 15。

需要在 3 台服务器上都安装同样版本的 PostgreSQL,我们在 3 台服务器上分别进行以下操作。

1)导入 PostgreSQL 仓库配置:


sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'  

2)导入仓库签名密钥:


wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -  

3)更新软件包列表:


sudo apt-get update  

4)安装 Postgresql 15:


sudo apt-get -y install postgresql  

3、安装 Citus

我们先跳过 Postgresql 初始化配置,先在 3 台数据库服务器上分别安装 Citus,后面在统一进行配置.

Citus 没有在 Ubuntu 默认仓库中,我们需要先把仓库地址加入进来再安装 Citus。

1) 下载仓库安装脚本,在当前用户的 home 目录下执行:


curl https://install.citusdata.com/community/deb.sh > add-citus-repo.sh  

2) 执行脚本将仓库加入,执行后会自动执行 apt update:


sudo bash add-citus-repo.sh  

3) 执行安装操作,这里需要保持版本对应 postgresql-15-citus-11.3 指 PostgreSQL 15 版本 citus 11.3 版本


sudo apt-get -y install postgresql-15-citus-11.3  

至此我们就完成了安装的步骤了,后续的步骤我们将进行一些必要的配置。

4、数据库服务器配置

我们需要在 3 台数据库服务器上分别执行命令以完成数据库配置。

1) 编辑 PostgreSQL 配置文件,设置允许远程访问,使用 Citus 插件:


sudo nano /etc/postgresql/15/main/postgresql.conf  

在文件的最后加入三行配置:

shared_preload_libraries = 'citus'  # 启用 citus

listen_addresses = '*'                 #允许远程访问

citus.shard_count = 256              # 默认分片数量设置为 256,这里需要注意的是一个工作节点对应多个 shared,shared 应该远大于最大分片数量,所以直接把 shared_count 设置为 256。


shared_preload_libraries = 'citus'
listen_addresses = '*'
citus.shard_count = 256  

2) 设置客户认证文件 (pg_hba.conf),允许远程访问


sudo nano /etc/postgresql/15/main/pg_hba.conf  

在文件最后加入两行,请注意两行的顺序,先匹配生效。

host all all 172.16.91.1/24 trust #3 台数据库服务器之间相互信任访问。

host all all 0.0.0.0/0 scram-sha-256 #允许用户通过用户名密码访问。


host  all  all  172.16.91.1/24 trust
host  all  all  0.0.0.0/0  scram-sha-256  

3) 配置完成后重启 PostgreSQL 服务,并将 PostgreSQL 加入到启动任务


sudo systemctl restart postgresql
sudo systemctl enable postgresql  

5、设置服务器管理员密码,并创建 citus 表

需要在 3 台数据库服务器上执行数据库命令来修改管理员口令以及执行 citus 创建。

需要注意的是 citus 数据库是独立的,不同的数据库需要单独运行创建命令。默认情况下都是在 PostgreSQL 数据库下执行。

1) 进入到 psql 命令行模式:


sudo -u postgres psql  

2) 在进入到 psql 命令行模式后在 psql 命令行模式下执行修改密码的命令:


ALTER USER postgres PASSWORD 'password';  

3) 继续在 psql 命令行模式下执行创建扩展 citus 的命令:


CREATE EXTENSION citus;  

这里需要注意的是 citus 是在数据库层面的设置,不同的数据库需要单独执行创建。

当前是在默认数据库 postgres 下。如果创建了新数据库需要在切换到新数据库再去执行创建命令。可以用 c 命令切换数据库。


c database  

6、配置 Citus 节点

下面的操作仅在 Citus 服务器上执行,设置协作节点,并把 node1 和 node2 服务器作为工作节点加入进来。

1) 在加入工作节点 node1 和 node2 之前先设置 citus 服务器为协调服务器:


SELECT citus_set_coordinator_host('172.16.91.60', 5432);  

2) 将两个工作节点加入到集群中:


SELECT citus_add_node('172.16.91.61', 5432);
SELECT citus_add_node('172.16.92.62', 5432);  

3) 运行以下命令可以看到两个工作节点:


SELECT * FROM citus_get_active_worker_nodes();  

如果添加错误可以执行进行删除:


SELECT citus_remove_node('172.16.91.61', 5432);  

至此我们所有的数据安装及配置已经全部完成,后面我们将测试分布式数据库。

六、测试分布式存储方案

1、创建数据库

我们先使用数据库客户端软件来创建到 3 个数据库 o2oa 的连接,以便后续步骤观察数据变化:

使用自己熟悉的工具就可以了,使用 JDBC 连接。

依上图所示,现在可以看到 3 个数据库都可以正常连接上了。

2、配置并启动 O2OA 服务器

在前面准备的应用服务器上启动一个 O2OA。

具体配置 O2OA 外部数据源以及启动 O2OA 的步骤就不再赘述,请参考相应的技术文档。

配置使用外部数据源配置 externalDataSources.json:


[
    {
        "url": "jdbc:postgresql://172.16.91.60:5432/postgres", 
        "schema": "public", 
        "username": "postgres", 
        "password": "password", 
        "includes": [], 
        "excludes": [], 
        "enable": true, 
        "statEnable": false
    }
]  

这样我们就使用了 Citus 服务器作为数据库服务器。

启动 O2OA 服务器,启动完成后我们应该可以看到在 Citus 服务器上已经创建了使用到的表。

到这里 O2OA 服务器已经正常启动了,这里要特别说明的是现在所有数据都是存放在 Citus 服务器上的,就和单独只有一个 Citus 服务器没有区别,两个 work 节点都处于空跑状态并没有集群效果,没有装载任何数据。

3、在 O2OA 中生成一些数据

我们以 QRY_ITEM 表为例来演示。

先在服务器上创建一个流程,并创建一个实例,这样在 QRY_ITEM 表中就有数据了,大家也可以使用其他方式自行验证。

1) 创建人员和组织

2) 创建表单

3) 创建流程

4) 创建流程实例并流转

这样我们就可以看到在 Citus 数据库服务器的表里已经有了完整的数据

4、对 QRY_ITEM 表进行分布式存储设置

我们再次进入到 Citus 数据库服务器的命令行中运行以下命令:


sudo -u postgres psql  

进入到 psql 命令行界面,执行 c o2oa 切换到 o2oa 数据库


c o2oa  

执行创建分布表命令:其中地 1 个参数是表名,第 2 个参数是计算分布的字段,这里我们取 xid,最后是使用 hash 方式进行计算。


SELECT create_distributed_table('qry_item', 'xid', 'hash');  

依上图所示,提示分布表已经创建。

打开数据库链接可以看到数据已经分布式存放在了 node1 和 node2 节点中。

通过命令可以查看到表的 shared 分布


select * from pg_dist_shard;  

我们再次进入到业务流程并不影响数据访问和存储。

5、回退已分布式存储的 QRY_ITEM 表

对于已经进行了分布式存储的表,如果需要回退可以执行以下操作:


SELECT undistribute_table('qry_item');  

至此我们完成了数据库表的分布以及回退,大家可以在实际环境中灵活的根据数据表的数据规模来进行分布式收缩策略希望以上内容对大家有帮助,谢谢关注!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

O2OA中如何使用PostgreSQL + Citus 实现分布式数据库实现方案? 的相关文章

  • linux进程kill命令关不掉

    1 Linux kill 命令用于删除执行中的程序或job 语法 xff1a kill s sigspec n signum sigspec pid jobspec or kill l sigspec kill s lt 信息名称或编号 g
  • linux tcpdump抓包命令使用详解

    一 抓包命令概述 作用 xff1a xff08 1 xff09 捕获网络协议包 xff08 2 xff09 分析网络协议包 分类 xff1a xff08 1 xff09 linux命令行工具 xff0c 如tcpdump xff08 2 x
  • wireshark抓包教程详解

    Wireshark软件安装 软件下载路径 xff1a wireshark官网 按照系统版本选择下载 xff0c 下载完成后 xff0c 按照软件提示一路Next安装 说明 xff1a 如果你是Win10系统 xff0c 安装完成后 xff0
  • docker打包流程常用方式

    完整的docker打包流程 把外网服务器上的docker搬到内网使用时 xff0c 报了两个错误 xff0c 外网容器到tar包都没问题 xff0c 在内网使用tar包的时候报了两个错误 cannot connect to the Dock
  • 5GC 网元AMF、SMF、UPF、PCF、UDM等介绍

    5GC 网元AMF SMF AUSF UPF PCF UDM NRF NSSF NEF介绍 1 AMF Access and Mobility Management Function xff0c 接入和移动性管理功能 xff0c 执行注册
  • 如何准备校招?

    秋招已经落尽尾声 xff0c 今天小牛想把自己的学习经验分享给大家 xff0c 避免大家多走弯路 1 首先需要确定自己想从事哪方面的工作 比如服务端开发 xff08 Java开发工程师 xff0c C 43 43 开发工程师 xff09 x
  • 5GC architecture N1、N2、N3、N4、N6等接口

    5GC architecture N1 N2 N3 N4 N6 N9 N26接口 N1接口 N1接口为UE和AMF间的信令面接口 N1是逻辑概念的接口 xff0c 不存在物理口 N1接口基于N2接口信令实现 N2接口 N2接口为 R AN和
  • FAQ:报红--maven本地有jar包仍从从远端下载

    问题 xff1a 最近编译项目 xff0c 发现有个模块依赖总是编译不过 xff0c 报无法download jar包 但是查看maven配置的远端仓库 xff0c 发现maven已不支持该jar包 但是本地确实存在 xff0c idea
  • SNMP(简单网络管理协议)详解

    一 简介 SNMP 简单网络管理协议 xff1a 专门用于在 IP 网络管理网络节点 xff08 服务器 工作站 路由器 交换机及HUBS等 xff09 的一种标准协议 xff0c 它是一种应用层协议 SNMP 使网络管理员能够管理网络效能
  • XXL-JOB分布式任务调度平台

    XXL JOB 是一个轻量级分布式任务调度平台 xff0c 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 现已开放源代码并接入多家公司线上产品线 xff0c 开箱即用 Gitee 地址下载 xff1a https gitee com
  • 2万字详解,吃透 ES

    之前已经分享过Elasticsearch的使用和原理的知识 xff0c 由于近期在公司内部做了一次分享 xff0c 所以本篇主要是基于之前的博文的一个总结 xff0c 希望通过这篇文章能让读者大致了解Elasticsearch是做什么的以及
  • 手动回收Linux内存

    linux的内存分配是采用大页面的方式 xff0c 有可能会出现内存回收不及时导致系统卡住的情况 xff0c 这时候可以手工回收一下内存 执行 xff1a echo 1 gt proc sys vm drop caches 查看系统资源使用
  • spring-expression表达式详解

    一 概述 Spring Expression Language xff08 简称 SpEL xff09 是一个支持查询和操作运行时对象的强大的表达式 语言 贯穿着整个 Spring 产品组的语言 SpEL是单独模块 xff0c 只依赖于co
  • Docker容器整合wagon-ssh自动化部署SpringBoot工程

    一 前提条件 xff1a 机器上已经安装了docker 安装过程 准备部署的springboot的jar包Dockerfile文件部署脚本deploy sh升级脚本upgrade sh 二 准备Dockerfile 文件 创建一个Docke
  • TIME_WAIT和CLOSE_WAIT状态区别

    在服务器的日常维护过程中 xff0c 会经常用到下面的命令 xff1a netstat n awk 39 tcp 43 43 S NF END for a in S print a S a 39 它会显示例如下面的信息 xff1a TIME
  • 迭代过程:batch和epochs

    目录 引入 使用mini batch的优点 xff1a xff08 对比传统的梯度下降 更容易找到全局最优解 缺点 xff1a 要定义的两个超参数 xff1a batch size epochs 引入数据 TensorDataset Dat
  • PlantUML 语法之时序图

    文章目录 前言 96 gt gt 96 信息传递声明参与者的几个关键字 96 as 96 重命名参与者 96 96 添加颜色 96 order 96 定义参与者顺序 96 96 参与者名字给自己发信息修改传达信息的箭头样式修改箭头颜色 96
  • 基于ArUco的视觉定位(一)

    一 ArUco简介及安装步骤 ArUco a minimal library for Augmented Reality applications based on OpenCV xff0c 是科尔多瓦大学 人工视觉应用 研究小组 xff0
  • 基于ArUco的视觉定位(三)

    一 ArUco之Marker Mapper 1 Marker Mapper简介 Mapping and Localization from Planar Markers是A V A小组基于ArUco开发的一个利用二维码建图与定位的项目 论文
  • 关于《基于ArUco的视觉定位》系列博文撤回的通知

    由于近期我们要申请发明专利 xff0c 博客中涉及较多私密内容 xff0c 所以暂时不能公开了 我把之前的网页保存了图片格式 xff0c 有想继续学习的同学可以在本博客下方评论区留下你们的邮箱 xff0c 我会把相关内容私发给你们 收到邮件

随机推荐

  • c++继承详解之一——继承的三种方式、派生类的对象模型

    C 43 43 是OOP xff08 Object Oriented Programming xff09 语言 xff0c 即面向对象编程语言 OOP的核心思想就是数据抽象 xff08 类的设计 xff09 xff0c 继承和动态绑定 类展
  • ZED2跑ORB-SLAM3+双目相机、IMU联合标定+显卡驱动与cuda/cudnn安装

    一 引言 同样是项目需求 xff0c 需要利用视觉惯性导航做一些开发 xff0c 所以第一步先做些算法的测试 仿真与实物测验 xff0c 通过仿真的测试结果 xff0c 最终是决定使用ORB SLAM3来完成任务 xff0c 当然了 xff
  • FreeRTOS学习笔记——任务删除 vTaskDelete() API

    任务可以使用API函数 vTaskDelete 删除自己或其他任务 空闲任务的责任是要将分配给已删除任务的内存释放掉 注意 xff1a 只有内核为任务分配的内存空间才会在任务被删除后自动回收 xff0c 任务自己占用的内存或资源需要由应用程
  • mac 安装jd-gui

    https blog csdn net daicaho article details 81141251 使用brew安装 xff0c 打开终端窗口 xff0c 输入下面命令 brew cask install jd gui 如果提示 br
  • 统计降尺度与动力学降尺度

    1 统计降尺度 xff1a 1 1 概念解释 xff1a 统计降尺度 也称为经验降尺度 xff0c 是由大尺度气候信息获取小尺度气候信息的有力工具 他可被视作是与动力降尺度平行的降尺度方法 xff0c 或者可被看做是动力降尺度的补充 1 2
  • 无人驾驶技术之激光雷达市场分析

    无人驾驶技术之激光雷达市场分析 LiDAR Light Detection And Ranging xff0c 即激光雷达 xff0c 是利用激光 全球定位系统GPS和惯性测量装置 xff08 IMU xff09 三者合一 xff0c 获得
  • 线性系统理论——状态观测器状态反馈

    在学习现代控制理论的时候 xff0c 想必大家都学过状态观测器这个东西 状态观测器的作用就是在实际控制系统某些地方不方便或者不能加传感器的时候 xff0c 对系统的各部分状态做一个估计 xff0c 这个估计一般是通过系统输出推导后得到的 为
  • 【wzdftpd安装】wzdftpd的linux版本安装教程

    近期要开展漏洞挖掘的工作 xff0c 因此需要安装wzdftpd在机器上 xff0c 又因为这个东西比较老 xff0c 自己各种摸索之下终于搞定它的安装流程了 xff0c 现在记录一下 一 下载地址 https sourceforge ne
  • 树莓派——镜像篇

    因为某些原因 xff0c 我又得重新配置树莓派环境了 xff0c 官网链接在这里 xff1a 点击 顺便一提 xff0c 有三个版本 xff0c 选择 Raspbian Buster with desktop xff0c 这个是带有桌面的
  • 树莓派——网络连接篇

    树莓派一连上电源就会开始亮灯 xff0c 通常有两盏灯 xff0c 一盏是红色的 xff0c 一盏是绿色的 xff0c 详见灯的意义在这篇博文里面有 点击 我认识的树莓派显示方式以及网络连接方式各有两种 xff1a 界面显示方式 xff1a
  • 19年电赛经验总结

    1 今年带了两个学弟 xff0c 结果他两因为从来没有这样子熬夜过导致晚上脑子转不动 xff0c 相当于晚上就不能熬夜的状态 总结 xff1a 还是要做好准备 xff0c 你平时没有晚上干活干到这个点可能还是不能想象当时的状态的 2 电赛清
  • 树莓派——opencv篇

    1 查看python3的版本 如果是python3 5的 xff0c 请使用这个教程 xff1b 如果是python3 7的 xff0c 请使用这个教程 2 错误集合 遇到了以下的情况 xff0c 请参考https blog csdn ne
  • 毕业季——找工作必备APP

    整理了一些在我找工作的时候对我帮助挺大的APP 1 前程无忧51Job xff1a 我通常在这里面看附近大学的宣讲会安排 xff0c 蛮方便的 xff0c 比我在一个一个学校官网看信息好多了 2 BOSS直聘 拉钩招聘 xff1a 在里面看
  • 运行虚拟机卡在booting the kernel

    最近在学宋宝华的 linux设备驱动开发详解 在配置环境的时候 xff0c 按照给的工具包安装了 VMware player 7 0 0 2305329 1420626349 exe 然后就按照流程一步一步的照做 xff0c 到了最后一步运
  • eclipse与华为云之间push代码的相关问题汇总

    1 直接反馈连接超时 Transport Error Cannot get remote repository refs http codehub devcloud cn north 4 huaweicloud com ssm shoppi
  • 饿

    以为有片海苔在我桌子上 xff0c 正眼一看 xff0c 原来是一片charger ic
  • 【小记】个人面试总结

    时间 xff1a 2023 5 10晚线上 岗位 xff1a Linux软件工程师 公司名字 xff08 直接写出来会不会不太好哇 xff09 深圳光明某初创公司 这是近两个月面试的第一家公司 xff0c 我是对这个公司名字 xxx新能源以
  • Ubuntu操作系统配置阿里云镜像方法一

    Ubuntu xff0c 是一款基于 Debian Linux 的以桌面应用为主的操作系统 xff0c 内容涵盖文字处理 电子邮件 软件开发工具和 Web 服务等 xff0c 可供用户免费下载 使用和分享 阿里云官方镜像站 xff1a ht
  • 关于在Ardusub-Raspberry镜像中ssh密码错误access denied问题

    环境 xff1a Win10 在此感谢论坛大佬的回答 xff0c 一下附上原网址 http rovmaker cn t topic 1272 在ArduSub入门教程 树莓派设置中 xff0c 本人按照上面的教程 xff0c 当完成相应步骤
  • O2OA中如何使用PostgreSQL + Citus 实现分布式数据库实现方案?

    虽然 O2OA 数据表高效的表结构以及索引的设计已经极大程度地保障了数据存取操作的性能 xff0c 但是随着使用时间从增长 xff0c 数据表存放的数据量也会急剧增长 此时 xff0c 仍然需要有合适的方案来解决数据量产生的系统性能瓶颈 本