/var/lib/postgresql/data 尽管有明确的插入和更新行,但 docker 中时间刻度的盲挂载文件夹数据不会更新

Posted

技术标签:

【中文标题】/var/lib/postgresql/data 尽管有明确的插入和更新行,但 docker 中时间刻度的盲挂载文件夹数据不会更新【英文标题】:/var/lib/postgresql/data blind mount folder data for timescale in docker are not updated despite of explicit insert and update rows to it 【发布时间】:2021-02-04 16:38:56 【问题描述】:

我们有一个用于时间刻度的 docker 容器,它明确使用 volume 盲挂载设置,如下所示:

timescaledb:
    restart: always
    image: timescale/timescaledb:latest-pg11
    user: root
    container_name: timescaledb
    logging:
      driver: syslog
      options:
        syslog-address: "tcp://$DOCKER_HOST_IP:5006"
        tag: ".Name/.ID"
    ports:
      - 5432:5432
    volumes:
      - ./postgresql/postgresql.conf:/etc/postgresql/postgresql.conf
      - /mnt/postgresql/data:/var/lib/postgresql/data
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TIMESCALEDB_TELEMETRY=off
      - POSTGRES_PASSWORD=*was there but removed*
    command: postgres -c 'config_file=/etc/postgresql/postgresql.conf'
    depends_on:
      - logstash

所以请在此处注意/mnt/postgresql/data:/var/lib/postgresql/data

更新一些现有行后,我使用此处的方法检查/mnt/postgresql/data 文件夹中主机上的最后修改文件:https://***.com/a/7448828/1759063

find $1 -type f -exec stat --format '%Y :%y %n' "" \; | sort -nr | cut -d: -f2- | head

我还没有在那里找到任何最近的文件更新。那么实际时间尺度数据存储在哪里以及我们实际应该挂载什么以便不丢失docker-compose down等上的数据?

输出是这样的:

find $1 -type f -exec stat --format '%Y :%y %n' "" \; | sort -nr | cut -d: -f2- | head
2020-10-12 00:33:25.027351283 +0000 ./data/pg_stat/global.tmp
2020-10-12 00:33:18.714856683 +0000 ./data/pg_stat_tmp/global.stat
2020-10-12 00:33:18.714856683 +0000 ./data/pg_stat_tmp/db_0.stat
2020-10-12 00:33:14.770545499 +0000 ./data/pg_stat_tmp/db_13117.stat
2020-10-12 00:01:09.337593127 +0000 ./data/pg_wal/00000001000000240000002A
2020-10-12 00:01:02.329038233 +0000 ./data/global/pg_control
2020-10-12 00:01:02.061017012 +0000 ./data/pg_logical/replorigin_checkpoint
2020-10-12 00:01:01.724990408 +0000 ./data/base/13117/18130
2020-10-12 00:01:01.436967605 +0000 ./data/pg_xact/0018
2020-10-11 23:59:16.664673521 +0000 ./data/pg_stat_tmp/pgss_query_texts.stat

今天是

 date
Wed Oct 21 17:54:06 UTC 2020

那么在容器中存储更新数据的文件夹的实际位置是什么?

最有趣的部分是最后更新的文件是根据从容器内和主机在同一文件夹中的观察方式(即映射为 volume 盲挂载)

从容器中,查看映射的文件夹:

find $1 -type f -exec stat -c '%Y :%y %n' "" \; | sort -nr | cut -d: -f2- | head
2020-10-21 19:08:46.000000000 ./data/pg_stat_tmp/global.stat
2020-10-21 19:08:46.000000000 ./data/pg_stat_tmp/db_13117.stat
2020-10-21 19:08:46.000000000 ./data/pg_stat_tmp/db_0.stat
2020-10-21 12:51:21.000000000 ./data/pg_stat_tmp/pgss_query_texts.stat
2020-10-21 10:36:06.000000000 ./data/pg_wal/00000001000000080000001A
2020-10-21 10:36:00.000000000 ./data/pg_xact/0002
2020-10-21 10:36:00.000000000 ./data/pg_logical/replorigin_checkpoint
2020-10-21 10:36:00.000000000 ./data/global/pg_control
2020-10-21 10:36:00.000000000 ./data/base/13117/16539
2020-10-13 18:22:56.000000000 ./data/base/13117/50258

来自主机的同一文件夹:

:/mnt/postgresql/data#  find $1 -type f -exec stat -c '%Y :%y %n' "" \; | sort -nr | cut -d: -f2- | head
2020-10-12 00:33:25.027351283 +0000 ./pg_stat/global.tmp
2020-10-12 00:33:18.714856683 +0000 ./pg_stat_tmp/global.stat
2020-10-12 00:33:18.714856683 +0000 ./pg_stat_tmp/db_0.stat
2020-10-12 00:33:14.770545499 +0000 ./pg_stat_tmp/db_13117.stat
2020-10-12 00:01:09.337593127 +0000 ./pg_wal/00000001000000240000002A
2020-10-12 00:01:02.329038233 +0000 ./global/pg_control
2020-10-12 00:01:02.061017012 +0000 ./pg_logical/replorigin_checkpoint
2020-10-12 00:01:01.724990408 +0000 ./base/13117/18130
2020-10-12 00:01:01.436967605 +0000 ./pg_xact/0018
2020-10-11 23:59:16.664673521 +0000 ./pg_stat_tmp/pgss_query_texts.stat

在尝试访问文件时,根据2020-10-21 19:08:46.000000000 的 docker 容器进行了更改,但根据主机,它仅在一周前更改:

:/mnt/postgresql/data# ls -l pg_stat_tmp/global.stat
-rw------- 1 70 70 607 Oct 12 00:33 pg_stat_tmp/global.stat

volume 盲挂载文件夹能否包含容器视图和主机视图中的不同文件?

这里唯一不寻常的是,在同一个 docker 上,我们运行的不是盲挂载的另一个容器,而是具有相同目标的卷,就像我们在盲挂载中一样:

"Type": "volume",
>                 "Name": "9a241364bdb2c9f1f1ac5ce30effeca15d1c7477f7b99eec42acf40bee5e8ba2",
>                 "Source": "/var/lib/docker/volumes/9a241364bdb2c9f1f1ac5ce30effeca15d1c7477f7b99eec42acf40bee5e8ba2/_data",
>                 "Destination": "/var/lib/postgresql/data",
>                 "Driver": "local",
>                 "Mode": "",
>                 "RW": true,
>                 "Propagation": ""
>             

【问题讨论】:

基本上,您的安装说明似乎没问题。当您不指定附加功能时,它是否有效?即不要传递postgresql.conf,不要覆盖CMD,..也许你也可以在你的文件列表之前显示pwd 好的,让我检查一下。看起来主机位置是hdfs挂载,所以主机挂载它们可能比启动docker晚吗?现在尝试检查这个想法 【参考方案1】:

您可以获取有关已连接卷位置的信息

$ docker inspect <container_name>

从输出中,您可以获得"Source"

参考文件夹包含来自相应容器的位置 /var/log 的文件

$ ls -lah /var/lib/docker/volumes/b2.....1a/_data

【讨论】:

没错。所以对我来说不清楚,为什么挂载文件夹中的文件没有更新。就像实际上数据库写入一些内部 docker 文件位置并更新它们,而不是卷中的文件。这里的问题是 timescale db docker 容器中的替代位置是什么?

以上是关于/var/lib/postgresql/data 尽管有明确的插入和更新行,但 docker 中时间刻度的盲挂载文件夹数据不会更新的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 查询创建目录

docker-compose 安装postgres(设置默认用户名,密码,暴露端口)

你如何列出 docker 容器中的卷?

服务器必须由拥有数据目录的用户启动

使用Postgis使用SQL查询在Postgres中使用OSM给出(lat,long)时检索最近的道路