PostgreSQL码农集散地

数据库实验手册系列:19 体验最流行的开源企业ERP软件 odoo

文章开始前推荐2个学习环境:

1、欢迎使用镜像快速体验PostgreSQL/DuckDB强大功能: 《最好的PostgreSQL学习镜像 》

2、欢迎使用云起实验室: 《免费体验PolarDB开源数据库 》 3、PolarDB开源数据库内核、应用等学习图谱:  https://www.aliyun.com/database/openpolardb/activity

标签

PostgreSQL , PolarDB , 数据库 , 教学

背景

欢迎数据库应用开发者参与贡献场景, 在此issue回复即可, 共同建设《沉浸式数据库学习教学素材库》, 帮助开发者用好数据库, 提升开发者职业竞争力, 同时为企业降本提效.

  • 系列课程的核心目标是教大家怎么用好数据库, 而不是怎么运维管理数据库、怎么开发数据库内核. 所以面向的对象是数据库的用户、应用开发者、应用架构师、数据库厂商的产品经理、售前售后专家等角色.

本文的实验可以使用永久免费的阿里云云起实验室来完成.

如果你本地有docker环境也可以把镜像拉到本地来做实验:

x86_64机器使用以下docker image:

  • 《amd64 image》

ARM机器使用以下docker image:

  • 《arm64 image》

业务场景1 介绍: 体验最流行的开源企业ERP软件 odoo

odoo是非常流行的开源企业 ERP软件, 支持二次开发, 根据企业需求定制功能. 国内基于odoo的ERP软件公司也非常多, 有兴趣的同学可以关注ODOO中文社区.

另外我们知道企业ERP的场景对数据库的要求非常高, 因为流程复杂, 同时关联关系复杂, 业务请求转换成数据库的SQL可能达上百个表的JOIN, 嵌套子查询等. 事务通常也会非常大, 为了保证数据的一致性, 业务流程长, 事务大.

odoo选择了功能高级的PG数据库作为默认的数据库, 但是随着企业数据量的增长, PolarDB PG这种分布式共享存储读写分离的架构可能更加能满足大型企业的需求.

实现和对照

使用上海开源信息技术协会的odoo benchmark来部署odoo, 同时对比pg和PolarDB pg.

  • https://github.com/shanghaiopen/PolarDB-PG-Benchmark

下面的步骤在我的测试环境macbook(M2 chip)中完成. 如果你本地没有资源运行这个测试, 可以使用云起实验室来完成.

1、安装docker、docker compose: https://docs.docker.com/engine/install/

2、启动PG和PolarDB-PG, 这里用到了2个镜像.

2.1、PolarDB-PG

# 拉取 PolarDB-PG 镜像  
docker pull polardb/polardb_pg_local_instance

# 创建并运行容器
docker run -it -d -P --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name polardb --shm-size=512m --network bridge polardb/polardb_pg_local_instance

获得polardb-pg容器IP

docker inspect polardb|grep IPAddress  
172.17.0.2

进入容器, 并创建数据库用户.

docker exec -ti polardb bash  

-- 创建用户, 但是不要创建odoo使用的目标数据库.
psql
create role pd login createdb encrypted password 'postgres';

数据库监听端口:

postgres=# show port;  
port
------
5432
(1 row)

2.2、PG-14

# 拉取 PG 14 镜像    
docker pull registry.cn-hangzhou.aliyuncs.com/digoal/opensource_database:pg14_with_exts

# 创建并运行容器
docker run --platform linux/amd64 -d -it -P --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name pg --shm-size=512m --network bridge registry.cn-hangzhou.aliyuncs.com/digoal/opensource_database:pg14_with_exts

获得pg-14容器IP

docker inspect pg|grep IPAddress  
172.17.0.3

进入容器, 并创建数据库用户.

docker exec -ti pg bash  

-- 创建用户, 但是不要创建odoo使用的目标数据库.
psql
create role pg login createdb encrypted password 'postgres';

数据库监听端口:

postgres=# show port;  
port
------
1921
(1 row)

3、拉取odoo 16镜像

docker pull --platform linux/amd64 odoo:16   

https://github.com/odoo/docker-official-images

4、克隆PolarDB-PG-Benchmark项目

git clone --depth 1 https://github.com/shanghaiopen/PolarDB-PG-Benchmark

改了一点配置文件还没有MR, 所以你可能要使用下面这条git clone
git clone --depth 1 https://github.com/digoal/PolarDB-PG-Benchmark

5、根据上面得到的实际情况, 配置变量

cd PolarDB-PG-Benchmark  

cp .env.example .env, 配置 .env 变量

vi .env

PG_HOST=172.17.0.3
PG_PORT=1921
PG_DB=postgres
PG_USER=pg
PG_PASS=postgres
PG_ODOO_HOST=pg

PD_HOST=172.17.0.2
PD_PORT=5432
PD_DB=postgres
PD_USER=pd
PD_PASS=postgres
PD_ODOO_HOST=pd

6、配置nginx和odoo

cp nginx/nginx.conf.example nginx/nginx.conf  
cp odoopd/config/odoo.conf.example odoopd/config/odoo.conf
cp odoopg/config/odoo.conf.example odoopg/config/odoo.conf

-- 将目录和子目录及文件权限配置为777
chmod -R 777 odoop*

7、启动nginx和2个odoo服务(一个连的是PolarDB-PG, 另一个连的是PG-14),

docker compose up

或(如下后台运行, 不便于观察日志.)
docker compose up -d
如果你使用后天运行如何观察日志?

docker logs nginx
docker logs odoopg
docker logs odoopd

8、将odoo服务的网络加入到bridge网桥, 用于打通odoo服务和数据库服务容器的网络

docker network connect bridge odoopg  
docker network connect bridge odoopd

9、配置宿主机(macbook)的hosts, 以便于nginx服务区分两个odoo服务(连接PolarDB-PG和PG-14的2个odoo服务).

sudo vi /etc/hosts  

## add for odoo test. 对应 PG_ODOO_HOST, PD_ODOO_HOST
127.0.0.1 pg
127.0.0.1 pd

10、实例起来之后,通过WEB配置odoo, 安装销售、采购、库存等应用模块

10.1、配置连接PG-14的odoo服务

http://pg:80

Master Password: admin  
Database Name: pg
Email: [email protected]
Password: 123456
Phone number: 123456
Language: 中文
Country: china
Demo data: yes

click: Create Database

10.2、配置连接PolarDB-PG的odoo服务

http://pd:80

Master Password: admin  
Database Name: pd
Email: [email protected]
Password: 123456
Phone number: 123456
Language: 中文
Country: china
Demo data: yes

click: Create Database

后续登陆odoo使用到里面的email和Password.

PS:

如果忘记master password, 修改宿主机对应配置文件admin_passwd即可.

PolarDB-PG-Benchmark/odoopd/config/odoo.conf  

PolarDB-PG-Benchmark/odoopg/config/odoo.conf

admin_passwd = admin

11、压测

压测留给同学们自己完成, 测试脚本在如下目录中:

PolarDB-PG-Benchmark/tests

有兴趣的同学可以学习下一个实验, 《沉浸式学习PostgreSQL|PolarDB 20: 学习成为数据库大师级别的优化技能》

12、odoo里面有大量的模块可以体验, 例如crm, MRP, 会计, 制造, 费用, 知识库, 项目管理, 邮件营销, 库存, 采购, 开票, 电子商务, 工时表, 休假 ...

感兴趣的同学可以自行研究.

知识点

PolarDB PG 共享存储读写分离架构: https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/

pgpool-II

优化器

遗传JOIN算法 geqo

aqo

思考

PolarDB-PG 在这个case中相比单机PG的优势是什么?

如果想使用PolarDB-PG的透明读写分离功能, 应该是有什么连接池软件? pgpool-ii

如何部署多机+共享存储的真.PolarDB-PG的透明读写分离功能?

对于很多表的JOIN数据库有什么优化方法? 如何选择出最佳JOIN方法(hash, merge, nestloop, anti...)和JOIN顺序(abc, bca, cba, cab, ...)? 穷举法? geqo? aqo?

参考

《PolarDB 开源版 使用pgpool-II实现透明读写分离》

《PolarDB for PostgreSQL 开源版本 + 阿里云多机挂载共享ESSD云盘》

《network block device(nbd) 共享网络块设备 - 用于测试RAC和PolarDB for PG共享存储版》

https://developer.aliyun.com/article/1163005

《PostgreSQL SQL动态优化器 aqo 背景论文》

《[未完待续] PostgreSQL PRO 特性 - AQO(机器学习执行计划优化器)》

《数据库优化器原理(含动态规划、机器学习建模优化器aqo) - 如何治疗选择综合症》

202202/20220216_01.md 《一起学PolarDB - 第23期 - 为什么磁盘RT会严重影响vacuum垃圾回收效率?》
202202/20220214_01.md 《一起学PolarDB - 第22期 - 为什么高并发数据写入吞吐无法达到磁盘极限-1》
202202/20220208_04.md 《一起学PolarDB - 第21期 - 从3到2.5》
202201/20220120_01.md 《一起学PolarDB - 第20期 - 为什么GIS时空查询即耗CPU又费IO?》
202201/20220119_02.md 《一起学PolarDB - 第19期 - 为什么做检查点会导致性能抖动?》
202201/20220118_05.md 《一起学PolarDB - 第18期 - 为什么创建索引慢?》
202201/20220117_01.md 《一起学PolarDB - 第17期 - 为什么只读实例延迟高?》
202201/20220112_03.md 《一起学PolarDB - 第16期 - Oracle的RAC神话被打破了!虽然有点晚,但开源》
202201/20220111_02.md 《一起学PolarDB - 第15期 - Coordinator也会有瓶颈?》
202201/20220111_01.md 《一起学PolarDB - 第14期 - 为什么SQL不能动态分组计算?》
202201/20220110_03.md 《一起学PolarDB - 第13期 - 为什么木桶有短板?》
202201/20220110_01.md 《一起学PolarDB - 第12期 - 为什么增加只读实例不能提高单条SQL的执行速度?》
202201/20220105_01.md 《一起学PolarDB - 第11期 - 为什么实例越大备份与恢复越难?》
202201/20220104_03.md 《一起学PolarDB - 第10期 - 为什么数据库重启或崩溃恢复后性能可能瞬间很差?》
202201/20220104_02.md 《一起学PolarDB - 第9期 - 为什么经常使用临时表时建议使用全局临时表?》
202201/20220104_01.md 《一起学PolarDB - 第8期 - 为什么存储RT指标对实例性能影响很大?》
202112/20211230_04.md 《一起学PolarDB - 第7期 - 为什么数据库越大崩溃恢复越慢?》
202112/20211230_03.md 《一起学PolarDB - 第6期 - 为什么failover后逻辑复制会丢数据?》
202112/20211230_02.md 《一起学PolarDB - 第5期 - 为什么PG有Double Cache?》
202112/20211230_01.md 《一起学PolarDB - 第4期 - 为什么增加RO节点动则数小时?》
202112/20211229_02.md 《一起学PolarDB - 第3期 - 为什么不能无限增加只读实例?》
202112/20211228_02.md 《一起学PolarDB - 第2期 - 为什么FPW是以牺牲(性能、存储空间、稳定性)换取的可靠性?》
202112/20211228_01.md 《一起学PolarDB - 第1期 - 为什么通常扩容需要停机?》

欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:

文章中的参考文档请点击阅读原文获得.