背景
欢迎数据库应用开发者参与贡献场景, 在此issue回复即可, 共同建设《沉浸式数据库学习教学素材库》, 帮助开发者用好数据库, 提升开发者职业竞争力, 同时为企业降本提效.
- 系列课程的核心目标是教大家怎么用好数据库, 而不是怎么运维管理数据库、怎么开发数据库内核. 所以面向的对象是数据库的用户、应用开发者、应用架构师、数据库厂商的产品经理、售前售后专家等角色.
本文的实验可以使用永久免费的阿里云云起实验室来完成.
如果你本地有docker环境也可以把镜像拉到本地来做实验:
x86_64机器使用以下docker image:
ARM机器使用以下docker image:
业务场景1 介绍: 体验最流行的开源企业ERP软件 odoo
odoo是非常流行的开源企业 ERP软件, 支持二次开发, 根据企业需求定制功能. 国内基于odoo的ERP软件公司也非常多, 有兴趣的同学可以关注ODOO中文社区.
另外我们知道企业ERP的场景对数据库的要求非常高, 因为流程复杂, 同时关联关系复杂, 业务请求转换成数据库的SQL可能达上百个表的JOIN, 嵌套子查询等. 事务通常也会非常大, 为了保证数据的一致性, 业务流程长, 事务大.
odoo选择了功能高级的PG数据库作为默认的数据库, 但是随着企业数据量的增长, PolarDB PG这种分布式共享存储读写分离的架构可能更加能满足大型企业的需求.
实现和对照
使用上海开源信息技术协会的odoo benchmark来部署odoo, 同时对比pg和PolarDB pg.
下面的步骤在我的测试环境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服务
Master Password: admin Database Name: pg Email: digoal@aliyun.com Password: 123456 Phone number: 123456 Language: 中文 Country: china Demo data: yes click: Create Database
10.2、配置连接PolarDB-PG的odoo服务
Master Password: admin Database Name: pd Email: digoal@aliyun.com 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) - 如何治疗选择综合症》




