暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

国产数据库PolarDB 能不能跑在 H国产操作系统openEuler里?

铃木园子 2025-01-16
335

A国产数据库PolarDB 能不能跑在 H国产操作系统openEuler里?

作者

digoal

日期

2025-01-15

标签

PostgreSQL , PolarDB , DuckDB , docker , macOS , m2 , openEuler


背景

A国产数据库PolarDB 能不能跑在 H国产操作系统openEuler里? 国产会不会为难国产? 看完本篇你就知道了: 有哪些坑? 安装起来丝滑不丝滑?

环境

宿主机 macOS M2 chip

模拟器 Docker Desktop 内核版本 6.10.14-linuxkit

H国产操作系统 openEuler 22.03 ltp sp4

A国产数据库PolarDB 15 开源版本

制作openEuler for PolarDB开发环境镜像

目前PolarDB 官方未提供基于 openeuler 的开发环境镜像, 需要自己制作.

1、下载openeuler 22.03 ltp sp4镜像

https://gitee.com/openeuler/openeuler-docker-images

$ docker pull hub.oepkgs.net/openeuler/openeuler:22.03-lts-sp4  
  
$ docker images  
REPOSITORY                                                               TAG                    IMAGE ID       CREATED        SIZE  
hub.oepkgs.net/openeuler/openeuler                                       22.03-lts-sp4          44d906e4642a   2 weeks ago    316MB  

2、测试该镜像在macOS M2 chip宿主机中是否正常?

$ cd ~/data_volumn    
$ PWD=`pwd`    
    
$ docker run -d -it -v $PWD:/data -P --shm-size=1g --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name ol1 hub.oepkgs.net/openeuler/openeuler:22.03-lts-sp4 bash    
  
  
$ docker exec -ti ol1 bash  
  
Welcome to 6.10.14-linuxkit  
  
System information as of time:  Wed Jan 15 03:17:07 UTC 2025  
  
System load:    3.64  
Memory used:    7.0%  
Swap used:  28.4%  
Usage On:   18%  
Users online:   0  

3、基于openeuler 22.03 ltp sp4, 制作PolarDB devel环境镜像

参考

目前PolarDB 官方未提供openeuler镜像, 我基于龙蜥8的 Dockerfile 改了一个, (注: 1 因为有报错, 暂未支持perl tap test包, 但是启动容器后手工安装perl模块正常 ; 2 LC_ALL和LC_LANGUAGE环境变量好像没有被正确设置.), 已经放在我的github

  • https://github.com/digoal/polardb-pg-docker-images/blob/main/Dockerfile-devel-openeuler22.03.lts.sp4

制作PolarDB devel环境镜像

cd ~   
rm -rf polardb-pg-docker-images    
git clone --depth 1 https://github.com/digoal/polardb-pg-docker-images    
  
cd ~/polardb-pg-docker-images/    
mkdir logs    
cp ./Dockerfile-devel-openeuler22.03.lts.sp4 ./Dockerfile    
  
docker build --platform=linux/arm64 -t="polardb/polardb_pg_devel:openeuler22.03.lts.sp4" --no-cache . 2>&1 | tee ./logs/build.log   
$ docker images  
REPOSITORY                                                               TAG                      IMAGE ID       CREATED          SIZE  
polardb/polardb_pg_devel                                                 openeuler22.03.lts.sp4   1c045b9ab756   22 minutes ago   1.92GB  

下面的DEMO基于这个镜像, 试一试PolarDB RAC部署是否正常, 参考

DEMO : PolarDB RAC 部署 on openEuler 22.03 ltp sp4

1、在宿主机(macOS)中生成1个文件(以下文件20GB), 后面在两个容器中将使用这个文件作为loop块设备.

mkdir ~/data_volumn    
cd ~/data_volumn    
dd if=/dev/zero of=./VirtualDisk.img bs=1m count=20480 oflag=direct    

2、启动容器pb1

cd ~/data_volumn    
PWD=`pwd`    
    
docker run -d -it -v $PWD:/data -P --shm-size=1g --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name pb1 polardb/polardb_pg_devel:openeuler22.03.lts.sp4 bash    

后面要确保2个容器的网络可以互通

# 进入容器pb1    
docker exec -ti pb1 bash    
  
sudo dnf install -y iproute iputils  
    
ip addr show    
    
104: eth0@if105: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc noqueue state UP group default    
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0    
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0    
       valid_lft forever preferred_lft forever    

等2个容器都启动后检查确认网络可以互通

172.17.0.2    
  
ping 172.17.0.3    
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.050 ms    

3、启动容器pb2

cd ~/data_volumn    
PWD=`pwd`    
    
docker run -d -it -v $PWD:/data -P --shm-size=1g --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name pb2 polardb/polardb_pg_devel:openeuler22.03.lts.sp4 bash    

确保2个容器的网络可以互通

# 进入容器pb2    
docker exec -ti pb2 bash    
  
sudo dnf install -y iproute iputils  
  
ip addr show    
172.17.0.3    

等2个容器都启动后检查确认网络可以互通

ping 172.17.0.2    
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.050 ms    

4、在pb1中使用共享的VirtualDisk.img文件创建loop设备, 需要找到一个空闲的loop设备. ps: pb1创建好的loop设备在这个macOS宿主机中的容器中都可以看到.

$ losetup -f  
/dev/loop0  
  
$ sudo losetup --direct-io=on /dev/loop0 /data/VirtualDisk.img    
$ ll /dev/loop0    
brw-rw-rw- 1 root root 7, 1 Dec 16 13:52 /dev/loop0    

5、pb1,pb2. 将loop设备软链到nvme1n1方便使用, 如果你的容器内已经有这个名字, 可以换一个例如nvme2n1.

# 注意: 容器重启后, 这个软链就不存在了, 需重新创建该软链     
  
sudo ln -s /dev/loop0 /dev/nvme1n1    

6、格式化共享盘, 在pb1 或 pb2中, 任意一个容器中执行一次即可.

sudo pfs -C disk mkfs -f nvme1n1    
    
以下是日志:    
pfs tool cmd record:mkfs -f nvme1n1   
[PFS_LOG] Jan 15 08:14:45.753538 INF [270] pfs build version:libpfs_version_("pfsd-build-desc-_-Wed Jan 15 07:36:27 UTC 2025")  
[PFS_LOG] Jan 15 08:14:45.753654 INF [270] pid: 269, caller: sudo pfs -C disk mkfs -f nvme1n1    
[PFS_LOG] Jan 15 08:14:45.753703 INF [270] pid: 195, caller: bash    
[PFS_LOG] Jan 15 08:14:45.755449 INF [270] open device cluster disk, devname nvme1n1, flags 0x13  
[PFS_LOG] Jan 15 08:14:45.755492 INF [270] disk dev path: /dev/nvme1n1  
[PFS_LOG] Jan 15 08:14:45.755505 INF [270] open local disk: open(/dev/nvme1n1, 0x10002)  
[PFS_LOG] Jan 15 08:14:45.755536 INF [270] ioctl status 0  
[PFS_LOG] Jan 15 08:14:45.755546 INF [270] pfs_diskdev_info get pi_pbdno 0, pi_rwtype 1, pi_unitsize 4194304, pi_chunksize 10737418240, pi_disksize 21474836480  
[PFS_LOG] Jan 15 08:14:45.755551 INF [270] pfs_diskdev_info waste size: 0  
[PFS_LOG] Jan 15 08:14:45.755553 INF [270] disk size 0x500000000, chunk size 0x280000000  
[PFS_LOG] Jan 15 08:14:45.756284 INF [270] mkfs runs forcedly, although PBD nvme1n1 chunk 0 is already formatted  
Init chunk 0  
        metaset        0/1: sectbda           0x1000, npage       80, objsize  128, nobj 2560, oid range [       0,      a00)  
        metaset        0/2: sectbda          0x51000, npage       64, objsize  128, nobj 2048, oid range [       0,      800)  
        metaset        0/3: sectbda          0x91000, npage       64, objsize  128, nobj 2048, oid range [       0,      800)  
  
Init chunk 1  
        metaset        1/1: sectbda      0x280001000, npage       80, objsize  128, nobj 2560, oid range [    1000,     1a00)  
        metaset        1/2: sectbda      0x280051000, npage       64, objsize  128, nobj 2048, oid range [     800,     1000)  
        metaset        1/3: sectbda      0x280091000, npage       64, objsize  128, nobj 2048, oid range [     800,     1000)  
  
Inited filesystem(21474836480 bytes), 2 chunks, 2560 blktags, 2048 direntries, 2048 inodes per chunk  
making paxos file  
init paxos lease  
making journal file  
pfs mkfs succeeds!  

7、pb1, pb2. 都启动pfsd, -w为工作进程数量, 数字越大IO性能越好, 这里受制于容器资源限制设置为1.

sudo /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p nvme1n1 -w 1    
  
日志如下:   
option workers `    
option pbdname nvme1n1    
option server id 0    
option logconf /usr/local/polarstore/pfsd/bin/../conf/pfsd_logger.conf    
starting pfsd[68] nvme1n1    
pfsdaemon nvme1n1 start success    
    
# 查看该共享盘内, 当前无数据    
sudo pfs -C disk ls /nvme1n1/    
  
输出日志如下:   
  File  1     4194304           Mon Dec 16 14:02:16 2024  .pfs-paxos    
  File  1     1073741824        Mon Dec 16 14:02:45 2024  .pfs-journal    
total 2105344 (unit: 512Bytes)    

停止pfsd使用如下方式, (这里不需要执行, 只是展示一下如何停止pfsd):

sudo /usr/local/polarstore/pfsd/bin/stop_pfsd.sh nvme1n1    

8、在pb1编译polardb 15.

cd /data    
    
# 克隆PolarDB 15 稳定分支代码    
git clone --depth 1 -b POLARDB_15_STABLE https://github.com/ApsaraDB/PolarDB-for-PostgreSQL    
    
# 编译安装PolarDB 15, 不要初始化实例    
cd /data/PolarDB-for-PostgreSQL    
./build.sh --prefix=/data/polardb --jobs=4 --debug=on --port=5432 --ni --ec="--with-pfsd"     
  
# 在实际生产中可以使用 --debug=off , 这里开启--debug=on主要是方便出了问题好调试.     

9、pb1, pb2. 将编译好的二进制拷贝到pb1, pb2的HOME目录, 便于调用:

$ cp -r /data/polardb/tmp_polardb_pg_15_base ~/    
    
    
$ which psql    
/home/postgres/tmp_polardb_pg_15_base/bin/psql    

版本

$ psql -V    
psql (PostgreSQL) 15.10    

10、pb1, 将pb1作为primary 节点, 在pb1执行创建polardb实例共享数据目录.

sudo pfs -C disk mkdir /nvme1n1/shared_data    

11、pb1, 初始化primary节点

initdb -D $HOME/primary    
    
sudo /home/postgres/tmp_polardb_pg_15_base/bin/polar-initdb.sh $HOME/primary/ /nvme1n1/shared_data/ primary    
    
    
以下是日志    
....    
copy file from /home/postgres/primary//pg_multixact/offsets/0000 to /nvme1n1/shared_data///pg_multixact/offsets/0000 succeeded    
copy file from /home/postgres/primary//pg_multixact/members/0000 to /nvme1n1/shared_data///pg_multixact/members/0000 succeeded    
list base dir file 1    
13572    
4    
5    
delete /home/postgres/primary/base/1/*    
delete /home/postgres/primary/base/13572/*    
delete /home/postgres/primary/base/4/*    
delete /home/postgres/primary/base/5/*    
delete /home/postgres/primary/global/*    
delete /home/postgres/primary/pg_wal    
delete /home/postgres/primary/pg_logindex    
delete /home/postgres/primary/pg_twophase    
delete /home/postgres/primary/pg_xact    
delete /home/postgres/primary/pg_commit_ts    
delete /home/postgres/primary/pg_multixact    
init PolarDB data dir success    
    
    
可以看到当前pfs里共享数据目录中已经有数据了. 实际上是初始化过程中把一些initdb的目录move过去的, 剩下的就是本地实例文件.      
$ sudo pfs -C disk ls /nvme1n1/shared_data    
   Dir  1     512               Mon Dec 16 14:34:48 2024  base    
   Dir  1     7808              Mon Dec 16 14:34:48 2024  global    
   Dir  1     0                 Mon Dec 16 14:34:48 2024  pg_tblspc    
   Dir  1     256               Mon Dec 16 14:35:19 2024  pg_wal    
   Dir  1     0                 Mon Dec 16 14:35:19 2024  pg_logindex    
   Dir  1     0                 Mon Dec 16 14:35:19 2024  pg_twophase    
   Dir  1     128               Mon Dec 16 14:35:19 2024  pg_xact    
   Dir  1     0                 Mon Dec 16 14:35:19 2024  pg_commit_ts    
   Dir  1     256               Mon Dec 16 14:35:20 2024  pg_multixact    
total 0 (unit: 512Bytes)    

12、配置pb1本地实例 postgresql.conf, pg_hba.conf

echo "  
huge_pages=off   
port=5432    
polar_hostid=1    
polar_enable_shared_storage_mode=on    
polar_disk_name='nvme1n1'    
polar_datadir='/nvme1n1/shared_data/'    
polar_vfs.localfs_mode=off    
shared_preload_libraries='\$libdir/polar_vfs,\$libdir/polar_worker'    
polar_storage_cluster_name='disk'    
logging_collector=on    
log_line_prefix='%p\t%r\t%u\t%m\t'    
log_directory='pg_log'    
listen_addresses='0.0.0.0'    
max_connections=200  
# 下面几个参数解决replica不能promote的问题, 因为RO依赖logindex.  
polar_logindex_mem_size=64MB  
polar_xlog_queue_buffers=64MB  
polar_xlog_page_buffers=64MB  
# 使用pfs时可以关掉 full page write 和 polar_has_partial_write , 否则请打开这两   
full_page_writes = off  
polar_has_partial_write = off    
# 参考代码 src/backend/storage/buffer/bufmgr.c  
" >> ~/primary/postgresql.conf    
echo "    
host all all 0.0.0.0/0 md5    
host    replication postgres    172.17.0.0/16   trust    
" >> ~/primary/pg_hba.conf    

参数模板可参考: https://github.com/ApsaraDB/PolarDB-for-PostgreSQL/blob/POLARDB_15_STABLE/src/backend/utils/misc/polardb.conf.sample

#------------------------------------------------------------------------------  
# Common Parameters for PostgreSQL  
#------------------------------------------------------------------------------  
full_page_writes = off  
listen_addresses = '*'  
logging_collector = on  
max_prepared_transactions = 10  
max_worker_processes = 128  
max_connections = 1000  
shared_buffers = 256MB  
shared_preload_libraries ='\$libdir/polar_vfs,\$libdir/polar_io_stat,\$libdir/polar_monitor_preload,\$libdir/polar_worker'  
  
#------------------------------------------------------------------------------  
# Common Parameters for PolarDB  
#------------------------------------------------------------------------------  
polar_disk_name = 'home'  
polar_enable_shared_storage_mode = on  
polar_vfs.localfs_mode = true  
polar_logindex_mem_size=64MB  
polar_xlog_queue_buffers=64MB  
polar_xlog_page_buffers=64MB  
polar_has_partial_write = on  

13、在pb1启动primary实例

pg_ctl start -D $HOME/primary    

下面准备创建replica节点

14、在 pb1 Primary 节点上,为pb2的 Replica 节点创建相应的复制槽,用于 Replica 节点的物理复制:

psql -p 5432 -d postgres -c "SELECT pg_create_physical_replication_slot('replica1');"    
    
 pg_create_physical_replication_slot    
-------------------------------------    
 (replica1,)    
(1 row)    

15、replica节点部署.

在pb2节点本地磁盘的 ~/replica1 路径下创建一个空目录,然后通过 polar-initdb.sh 脚本使用共享存储上的数据目录来初始化 Replica 节点的本地目录。初始化后的本地目录中没有默认配置文件,所以还需要使用 initdb 创建一个临时的本地目录模板,然后将所有的默认配置文件拷贝到 Replica 节点的本地目录下:

# 进入pb2容器  
docker exec -ti pb2 bash    
    
mkdir -m 0700 $HOME/replica1    
sudo /home/postgres/tmp_polardb_pg_15_base/bin/polar-initdb.sh $HOME/replica1/ /nvme1n1/shared_data/ replica    
    
# 日志如下:    
  
init replica    
list base dir file 5    
1    
4    
13572    
mkdir /home/postgres/replica1/base/5    
mkdir /home/postgres/replica1/base/1    
mkdir /home/postgres/replica1/base/4    
mkdir /home/postgres/replica1/base/13572    
init PolarDB replica mode dir success    

修改replica数据目录及子目录及文件的权限和owner

sudo chmod -R 700 $HOME/replica1    
sudo chown -R postgres:postgres  $HOME/replica1  

生成初始配置文件

initdb -D /tmp/replica1    
cp /tmp/replica1/*.conf $HOME/replica1/  
rm -rf /tmp/replica1  

16、编辑pb2 replica节点配置文件

echo "    
port=5432    
polar_hostid=2    
polar_enable_shared_storage_mode=on    
polar_disk_name='nvme1n1'    
polar_datadir='/nvme1n1/shared_data/'    
polar_vfs.localfs_mode=off    
shared_preload_libraries='\$libdir/polar_vfs,\$libdir/polar_worker'    
polar_storage_cluster_name='disk'    
logging_collector=on    
log_line_prefix='%p\t%r\t%u\t%m\t'    
log_directory='pg_log'    
listen_addresses='0.0.0.0'    
max_connections=200  
# 下面几个参数解决replica不能promote的问题, 因为RO依赖logindex.  
polar_logindex_mem_size=64MB  
polar_xlog_queue_buffers=64MB  
polar_xlog_page_buffers=64MB  
# 使用pfs时可以关掉 full page write 和 polar_has_partial_write , 否则请打开这两   
full_page_writes = off  
polar_has_partial_write = off   
    
# replication    
primary_slot_name='replica1'    
primary_conninfo='host=172.17.0.2 port=5432 user=postgres dbname=postgres application_name=replica1'    
" >> ~/replica1/postgresql.conf     
echo "      
host all all 0.0.0.0/0 md5      
host    replication postgres    172.17.0.0/16   trust      
" >> ~/replica1/pg_hba.conf      

标识节点以 Replica 模式启动:

touch $HOME/replica1/replica.signal    

启动 Replica 节点:

pg_ctl start -D $HOME/replica1    

检查 Replica 节点能否正常运行:

psql -p 5432 -d postgres -c 'SELECT version();'    
    
                                    version                                         
--------------------------------------------------------------------------------    
 PostgreSQL 15.10 (PolarDB 15.10.2.0 build d4f5477d debug) on aarch64-linux-gnu    
(1 row)    

17、检查PolarDB基于共享存储的复制是否正常

pb1 检查到replica复制槽正常连接

postgres=# select * from pg_stat_replication;    
-[ RECORD 1 ]----+------------------------------  
pid              | 19083  
usesysid         | 10  
usename          | postgres  
application_name | replica1  
client_addr      | 172.17.0.3  
client_hostname  |   
client_port      | 44606  
backend_start    | 2025-01-15 08:21:45.745786+00  
backend_xmin     |   
state            | streaming  
sent_lsn         | 0/4099F2B8  
write_lsn        | 0/4099F2B8  
flush_lsn        | 0/4099F2B8  
replay_lsn       | 0/4099F2B8  
write_lag        | 00:00:00.000277  
flush_lag        | 00:00:00.000277  
replay_lag       | 00:00:00.000332  
sync_priority    | 0  
sync_state       | async  
reply_time       | 2025-01-15 08:22:05.316927+00  

在pb1 primary 节点建表, 写入测试数据库

~/primary$ psql    
psql (PostgreSQL 15.10 (PolarDB 15.10.2.0 build d4f5477d debug) on aarch64-linux-gnu)    
Type "help" for help.    
    
postgres=# create table tbl (id int primary key, info text, ts timestamp);    
CREATE TABLE    
postgres=# insert into tbl select generate_series(1,10), md5(random()::text), clock_timestamp();    
INSERT 0 10    

在pb2 replica 节点, 查询到数据正常, 确认PolarDB基于共享存储的复制正常

~/replica1$ psql    
psql (PostgreSQL 15.10 (PolarDB 15.10.2.0 build d4f5477d debug) on aarch64-linux-gnu)    
Type "help" for help.    
    
postgres=# select * from tbl;    
 id |               info               |             ts                 
----+----------------------------------+----------------------------    
  1 | 8ddf7a3ddf9d9a348637dba4bc2d9308 | 2024-12-17 14:09:44.805661    
  2 | 374171ae8e839d595112570bbf6e6a5d | 2024-12-17 14:09:44.808097    
  3 | 36c83070ecef903804f843d8b6f542a5 | 2024-12-17 14:09:44.808106    
  4 | eeb9fb43ed70b98bc1e3cac7a8591268 | 2024-12-17 14:09:44.80811    
  5 | 7d24eb72eee5dc5abd73337f55b3bf91 | 2024-12-17 14:09:44.808114    
  6 | 4c2910dc1939dc57a7cc91334a3546ce | 2024-12-17 14:09:44.808118    
  7 | e59739763a6137b05f9b85c6f4daf83d | 2024-12-17 14:09:44.808121    
  8 | 36183814d28784a1dd8e145daada9e75 | 2024-12-17 14:09:44.808124    
  9 | 1757ba67ab4c49af449e56ee0f70485c | 2024-12-17 14:09:44.808127    
 10 | 4b2a4e2849c9ace23c21258c6e95842b | 2024-12-17 14:09:44.808131    
(10 rows)    

补充问题

节点启动后, 一直存在如下警告, 不知道是何原因?

告警来自实例本地数据目录日志文件中 $PGDATA/pg_log/xxx_error.log  
...   
207                     2024-12-24 14:48:13.410 CST     WARNING:  Failed to get the instance memory usage  
207                     2024-12-24 14:48:13.910 CST     WARNING:  Failed to get the instance memory usage  
..  
207                     2024-12-24 14:48:20.415 CST     WARNING:  Failed to get the instance memory usage  
207                     2024-12-24 14:48:20.915 CST     WARNING:  Failed to get the instance memory usage  

报错代码来自PolarDB external/polar_resource_manager/polar_resource_manager.c

/*  
 * check ins memory  
 */  
void  
polar_check_mem_exceed(void)  
{  
        Size            pfsd_rss = 0;  
        Size            ins_rss_limit = 0;  
        Size            ins_mem_limit = 0;  
        Size            ins_mem_usage = 0;  
        Size            ins_rss = 0;  
        Size            ins_mapped_file = 0;  
  
        /* Get instance memory limit and memory usage */  
        if (polar_get_ins_memorystat(&ins_rss, &ins_mapped_file, &ins_rss_limit) != 0)  
        {  
                elog(WARNING, "Failed to get the instance memory usage");  
                return;  
        }  
  
        /* Get the pfsdaemon process rss */  
        if (enable_account_otherproc && polar_get_procrss_by_name("(pfsdaemon)", &pfsd_pid, &pfsd_rss) != 0)  
        {  
                pfsd_pid = InvalidPid;  
                elog(DEBUG1, "Failed to get the pfsdaemon rss");  
        }  
  
        /* Calculate memory limit, memory request and memory usage */  
        ins_mem_limit = Min(ins_rss_limit / 100 * total_mem_limit_rate, ins_rss_limit - total_mem_limit_remain_size * 1024);  
        /* mapped_file is generated by DSM */  
        ins_mem_usage = ins_rss + ins_mapped_file + pfsd_rss;  
  
        /*  
         * total mem usage reach mem limit evict resource manager to release  
         * exceed_rss memory  
         */  
        /* priority to release resource manager which exceed limit */  
        /* After setting the random policy, other release methods will be shielded */  
        if (mem_release_policy == TERMINATE_ANY_RANDOM && ins_mem_usage > ins_mem_limit)  
        {  
                if (enable_log)  
                        ereport(LOG, (errmsg("[polar_resource_manager] For Random Policy: Instance memory usage database memory %lu bytes, "  
                                                                 "database dynamic shared memory %lu bytes, pfsd memory %lu bytes",  
                                                                 ins_rss, ins_mapped_file, pfsd_rss)));  
  
                /* The idle process will be released first */  
                polar_throttle_mem_random(ins_mem_usage, ins_mem_limit, RM_TBLOCK_DEFAULT, idle_terminate_num);  
  
                /*  
                 * Since the memory size of the process is not obtained under the  
                 * random policy, it is necessary to obtain the instance memory usage  
                 * again to determine whether to release the active sessions.  
                 */  
                if (polar_get_ins_memorystat(&ins_rss, &ins_mapped_file, &ins_rss_limit) != 0)  
                {  
                        elog(WARNING, "Failed to get the instance memory usage");  
                        return;  
                }  
  
                if (enable_account_otherproc && polar_get_procrss_by_name("(pfsdaemon)", &pfsd_pid, &pfsd_rss) != 0)  
                {  
                        pfsd_pid = InvalidPid;  
                        elog(DEBUG1, "Failed to get the pfsdaemon rss");  
                }  
  
                ins_mem_usage = ins_rss + ins_mapped_file + pfsd_rss;  
  
                /* If the memory still exceeds the limit, release the active session */  
                if (ins_mem_usage > ins_mem_limit)  
                        polar_throttle_mem_random(ins_mem_usage, ins_mem_limit, RM_TBLOCK_INPROGRESS, active_terminate_num);  
        }  
        else if (ins_mem_usage > ins_mem_limit)  
        {  
                /*  
                 * When the memory is larger than the memory limit, it will perform  
                 * the forced release memory mode.  
                 */  
                if (enable_log)  
                        ereport(LOG, (errmsg("[polar_resource_manager] For Limit: Instance memory usage database memory %lu bytes, "  
                                                                 "database dynamic shared memory %lu bytes, pfsd memory %lu bytes",  
                                                                 ins_rss, ins_mapped_file, pfsd_rss)));  
  
                polar_throttle_mem(ins_mem_usage, ins_mem_limit, true);  
        }  
}  

关于这个warning, 研发的回复来了

通过polar_resource_manager.enable_resource_manager 参数可以设置该功能为off.  
该功能为监控内存占用,如果过高会 terminate backend, 防止 OS 的 kill -9  
  
监控数据来自Linux cgroup:   /sys/fs/cgroup/memory/memory.stat     
  
但是在macOS 的docker容器内容, 该目录为: /sys/fs/cgroup/memory.stat  
所以一直报无法获取数据的warning.  
  
至于为什么macOS内的docker 容器cgroup目录和Linux中的目录不一致, 暂时不得而知.    
猜测和macOS的docker是模拟出来的原因, 路径未模拟正确.    

小结

A国产数据库PolarDB RAC架构 on H国产操作系统openEuler, 目前看部署是非常丝滑的, 这是为什么呢?

深度使用的话就需要更多实践和时间的考验了.

更多PolarDB RAC玩法可参考: 《2025-穷鬼玩PolarDB RAC一写多读集群 系列文章》

参考

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

《穷鬼玩PolarDB RAC一写多读集群系列 | 在Docker容器中用loop设备模拟共享存储搭建PolarDB RAC》

https://gitee.com/openeuler/openeuler-docker-images

https://github.com/digoal/polardb-pg-docker-images

《PolarDB PG 15 编译安装 & pg_duckdb 插件 + OSS 试用》

https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/deploying/fs-pfs.html

https://github.com/ApsaraDB/PolarDB-FileSystem/blob/master/Readme-CN.md

https://github.com/ApsaraDB/PolarDB-FileSystem/blob/master/docs/PFS_Tools-CN.md

https://www.jamescoyle.net/how-to/2096-use-a-file-as-a-linux-block-device

《在 macOS 中将文件模拟为块设备》

《在 macOS 中用docker --device挂载块设备报错》

期望 PostgreSQL|开源PolarDB 增加什么功能?

PolarDB 开源数据库

PolarDB 学习图谱

PostgreSQL 解决方案集合

德哥 / digoal’s Github - 公益是一辈子的事.

About 德哥

digoal's wechat

文章转载自铃木园子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论