PostgreSQL码农集散地

PolarDB 100 问|如何构建PolarDB Docker镜像 OR 本地编译PolarDB?

参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;


PolarDB 100 问|如何构建PolarDB Docker镜像 OR 本地编译PolarDB?

PolarDB 开源项目polardb-pg-docker-images提供了一系列Dockerfile可用于构建CentOS、Rocky、ubuntu、Anolis各版本的Docker镜像. 由于依赖非常多, 参考这些Dockerfile里都安装了一些什么包, 你就可以比较简单的在自己的操作系统环境中直接编译安装PolarDB. 下面文档将参考以下官方文档进行讲解.

  • https://github.com/ApsaraDB/polardb-pg-docker-images/blob/main/README.md
  • https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/development/customize-dev-env.html
  • https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/development/dev-on-docker.html

PolarDB提供了3种Dockerfile, 第一种用来构建基本开发环境, 第二种基于第一种将PolarDB源码拷贝进去并编译成可以执行二进制, 第三种基于第二种镜像并新增了1个用于初始化PolarDB数据库实例的脚本. 下面分别介绍这三种镜像.

首先将polardb-pg-docker-images这个开源项目克隆到本地

git clone --depth 1 https://github.com/ApsaraDB/polardb-pg-docker-images  

1、PolarDB 开发环境镜像

polardb/polardb_pg_devel:ubuntu22.04

只包含编译PolarDB依赖的包等, 不包含PolarDB源码.

假设我们接下来要基于ubuntu:22.04构建PolarDB 开发环境镜像, 首先要拉取ubuntu:22.04

docker pull ubuntu:22.04  

用Dockerfile-devel-ubuntu22.04这个文件来build

cd polardb-pg-docker-images/  
mkdir logs  
mv ./Dockerfile-devel-ubuntu22.04 ./Dockerfile  

如有必要, 可修改 Dockerfile 里面的相关代码:

# set to empty if GitHub is not barriered  
# ENV GITHUB_PROXY=https://ghproxy.com/  
ENV GITHUB_PROXY=  

build (注意我的build环境是macOS m2芯片, 如果是x86机器使用的是--platform=linux/amd64)

docker build --platform=linux/arm64 -t="polardb/polardb_pg_devel:ubuntu22.04" --no-cache . 2>&1 | tee ./logs/build.log  

2、PolarDB 二进制镜像

polardb/polardb_pg_binary:15

包含PolarDB源码, 以及编译好的PolarDB 二进制, 编译选项写在Dockerfile里, 更多编译选项说明请查看PolarDB源码中的build.sh --help)

使用Dockerfile-binary

cd polardb-pg-docker-images/  

mv ./Dockerfile ./Dockerfile-devel-ubuntu22.04  
mv ./Dockerfile-binary ./Dockerfile  

克隆你需要编译的PolarDB分支, 这里使用了PolarDB 15的最新分支

cd polardb-pg-docker-images/  

git clone --depth 1 -b POLARDB_15_STABLE https://github.com/ApsaraDB/PolarDB-for-PostgreSQL  

build

docker build --platform=linux/arm64 -t="polardb/polardb_pg_binary:15" --no-cache . 2>&1 | tee ./logs/build.log  

解说一下这个Dockerfile中用了2个FROM, 一开始我还以为写错了, 问了研发小哥, 这是两阶段构建, 第一阶段构建完毕后,把产物直接拷进第二阶段,然后第一阶段的镜像就不要了。这样镜像层会很薄。

FROM polardb/polardb_pg_devel:ubuntu22.04 AS building  
LABEL maintainer="[email protected]"

# Copy source code  
WORKDIR /home/postgres/  
COPY ./PolarDB-for-PostgreSQL ./PolarDB-for-PostgreSQL  

# Compile and install PolarDB-PG  
USER root  
WORKDIR /home/postgres/PolarDB-for-PostgreSQL  
RUN ./build.sh --ec="--prefix=/u01/polardb_pg/ --with-pfsd" --debug=off --ni --port=5432  

FROM polardb/polardb_pg_devel:ubuntu22.04  
LABEL maintainer="[email protected]"

# Copy binary  
COPY --from=building /u01/polardb_pg/ /u01/polardb_pg/  
COPY --from=building /home/postgres/PolarDB-for-PostgreSQL/src/backend/utils/misc/polardb.conf.sample /u01/polardb_pg/share  

RUN sudo chown -R postgres:postgres /u01/polardb_pg/  
RUN sudo chmod -R 700 /u01/polardb_pg/  

3、PolarDB 实例初始化镜像

polardb/polardb_pg_local_instance:15

包含PolarDB源码, 编译好的二进制, 以及entrypoint是一个初始化实例的脚本文件docker-entrypoint.sh, 通过这个镜像的脚本可以创建本地实例(包含1个rw节点和1个ro节点的共享存储架构实例环境)

build

cd polardb-pg-docker-images/  
mv ./Dockerfile ./Dockerfile-binary  
mv ./Dockerfile-local-instance ./Dockerfile  

docker build --platform=linux/arm64 --build-arg binary_image_tag=15 -t="polardb/polardb_pg_local_instance:15" --no-cache . 2>&1 | tee ./logs/build.log  

名字再改回去, 方便下次使用

cd polardb-pg-docker-images/  
mv ./Dockerfile ./Dockerfile-local-instance  

最终得到如下3个镜像:

$ docker images  
REPOSITORY                                                     TAG                    IMAGE ID       CREATED             SIZE  
polardb/polardb_pg_local_instance                              15                     20d3314a23d6   53 minutes ago      2.57GB  
polardb/polardb_pg_binary                                      15                     01d9b723fc7e   59 minutes ago      2.57GB  
polardb/polardb_pg_devel                                       ubuntu22.04            630cfe5a8779   About an hour ago   2.06GB  
ubuntu                                                         22.04                  981912c48e9a   2 months ago        69.2MB  

试一试

使用第三个镜像, 启动实例测试

docker run -it --rm polardb/polardb_pg_local_instance:15 psql    

postgres=# select version();  
                                version  
--------------------------------------------------------------------------  
PostgreSQL 15.10 (PolarDB 15.10.2.0 build 35199b32) on aarch64-linux-gnu  
(1 row)  

如果你还不想初始化、想进去修改初始化选项、想将容器放到后台运行、不想实例退出就删除、想镜像本地目录作为数据目录、想把容器端口映射到宿主机 怎么弄? 覆盖entrypoint即可

mkdir /Users/digoal/polardb_data  
export your_data_dir=/Users/digoal/polardb_data  
export POLARDB_PORT=5432  
export POLARDB_USER=postgres  
export POLARDB_PASSWORD=123456  

# 启动容器  
docker run -d -it --entrypoint=/bin/bash -p 5432-5434:5432-5434 --env POLARDB_PORT=${POLARDB_PORT} --env POLARDB_USER=${POLARDB_USER} --env POLARDB_PASSWORD=${POLARDB_PASSWORD} -v ${your_data_dir}:/var/polardb --shm-size=1g --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name pb polardb/polardb_pg_local_instance:15  

# 进入容器  
docker exec -ti pb bash  

假设想要2个ro节点, 进入容器后修改一下docker-entrypoint.sh

cd ~  
sudo vi docker-entrypoint.sh  

replica_num=2  

初始化PolarDB实例

cd ~  
./docker-entrypoint.sh  

OR  

./docker-entrypoint.sh postgres    # 执行后 ctrl^c 退出即可 ; 看docker-entrypoint.sh你就知道是什么意思, 不多解释了.  

查询

psql  

postgres=# select * from pg_stat_replication;  
pid | usesysid | usename  | application_name | client_addr | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn | flush_lsn | replay_lsn |  
  write_lag    |    flush_lag    |   replay_lag    | sync_priority | sync_state |          reply_time            
-----+----------+----------+------------------+-------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-  
----------------+-----------------+-----------------+---------------+------------+-------------------------------  
282 |       10 | postgres | replica1         | 127.0.0.1   |                 |       38260 | 2024-12-05 16:14:45.329432+08 |              | streaming | 0/193B390 | 0/193B390 | 0/193B390 | 0/193B390  |  
00:00:00.000061 | 00:00:00.000061 | 00:00:00.000081 |             0 | async      | 2024-12-05 16:15:15.130381+08  
298 |       10 | postgres | replica2         | 127.0.0.1   |                 |       38264 | 2024-12-05 16:14:45.646553+08 |              | streaming | 0/193B390 | 0/193B390 | 0/193B390 | 0/193B390  |  
00:00:00.00004  | 00:00:00.00004  | 00:00:00.000107 |             0 | async      | 2024-12-05 16:15:15.13041+08  
(2 rows)  

在macOS宿主机连接PolarDB

psql -h 127.0.0.1 -p 5432 -U postgres postgres -W   
Password:  输入 POLARDB_PASSWORD 定义的密码    
psql (16.3, server 15.10)  
Type "help"forhelp.  

postgres=#  

一些环境信息

在以上Dockerfile中固定了一些环境信息, 整理一下, 进入容器后方便你找东西.

1、polardb二进制软件在这:/u01/polardb_pg

2、bash环境变量文件:/home/postgres/.bashrc

3、POLARDB_PORT, PolarDB端口(在调用docker-entrypoint.sh初始化实例时识别), 从primary到replica1, replica2依次是:5432, 5433, 5434

4、数据库实例超级用户及密码, 在调用docker-entrypoint.sh初始化实例时识别: POLARDB_USER、POLARDB_PASSWORD

5、实例本地文件、实例共享文件放在这:/var/polardb

drwx------ 32 postgres postgres 1024 Dec  5 16:28 primary_datadir/  
drwx------ 36 postgres postgres 1152 Dec  5 16:28 replica_datadir1/  
drwxr-xr-x 13 postgres postgres  416 Dec  5 16:28 shared_datadir/  

手工启停PolarDB:

pg_ctl stop -m fast -D /var/polardb/replica_datadir1
pg_ctl stop -m fast -D /var/polardb/primary_datadir

pg_ctl start -D /var/polardb/primary_datadir
pg_ctl start -D /var/polardb/replica_datadir1

文末彩蛋:国产数据库周边生态

当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜90%老司机!!! 下面简单介绍一下国产数据库周边生态.

1、管控软件

鸣嵩(前阿里云数据库总经理 / 研究员)等大佬们创业创办的云猿生, 核心产品是KubeBlocks. 他们的理念是让管理数据库和搭积木一样简单, 如果你要管理很多套并且种类(OLTP\OLAP\NoSQL\KV\TS\MQ等)很多的数据库产品, 推荐首选.

  • https://github.com/apecloud/kubeblocks

PG中文社区核心委员唐成老师的公司乘数开源的Clup, 专用管理PostgreSQL和PolarDB的集群管理软件, 如果你要管理很多套数据库, 推荐选择. 并且Clup还提供了企业版、自研的连接池、分布式存储、一体机、备份平台等, 是企业用户推荐之选.

  • https://www.csudata.com/

若航老司机开源的pigsty, 集成了300多个PG插件的PG集群和PolarDB集群管理软件, 如果你要管理很多套PG或PolarDB数据库, 且对插件有特别多的需求, 推荐选择.

  • https://pigsty.cc/zh/

2、审计监控诊断优化

翟总(曾经是我背后的男人)到海信聚好看后研发的 DBdoctor, 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.

  • https://www.dbdoctor.cn/

天舟老哥的核心产品Bytebase 是位于您和数据库之间的中间件。它是数据库 DevOps 的 GitLab/GitHub,专为开发人员、DBA 和平台工程师打造。

  • https://bytebase.cc/docs/introduction/what-is-bytebase/

PawSQL, SQL优化和诊断产品.  

D-Smart, Oracle老前辈白老大出品, 专注企业级市场, 将业界顶级DBA经验的产品化作品, 产品功能包括数据库监控、诊断、优化等.

  • https://www.modb.pro/db/567140

3、国产数据库IDE

IDE是开发者的必备工具,例如社区有pgAdmin, 国产IDE则可以看看老程序猿达刚老师的DeskUI:

  • https://www.deskui.com

4、数据同步&迁移&备份恢复

NineData, 老领导出去创业做的产品, 产品涵盖了数据同步、迁移、备份、比对、devops、chatDBA等.

  • https://www.ninedata.cloud/home

DSG, 非常老牌的数据库同步迁移企业级产品, 支持各种数据库的异构和同构迁移, 用他们的话说, 没有dsg搞不定的迁移, 比goldengate还牛.

  • https://www.dsgdata.com/

公开课

如果你对PolarDB学习感兴趣可以阅读这个公开课系列:

除了PolarDB还非常值得关注的几款PG栈国产数据库:

  • HaloDB(基于PG兼容PostgreSQL、Oracle、MySQL. http://www.halodbtech.com/ )、
  • IvorySQL(基于开源PG兼容PG、Oracle. https://www.ivorysql.org/zh-cn/ )、
  • ProtonBase(云原生分布式数仓. https://protonbase.com/ )、
  • 成都文武数据库(https://ww-it.cn)

参考文档点击阅读原文获得


感谢关注我的github (https://github.com/digoal/blog) 及视频号:

Image