TimescaleDB(PostgreSQL)流复制集群容器化部署(docker-compose)

TimescaleDB 是一个基于 PostgreSQL 构建的开源时序数据库(Time Series Database, TSDB)‌,专为高效存储、查询和分析大规模时间序列数据而设计。它以 PostgreSQL 扩展的形式存在,因此完全兼容标准 SQL 语法,并继承了 PostgreSQL 的可靠性、事务支持(ACID)和丰富生态(如 GIS、JSONB、自定义类型等)。

一、部署环境

docker版本:Docker version 29.2.0, build 0b9d198

docker-compose版本:Docker Compose version v5.0.2

本例使用TimescaleDB的镜像版本

timescale/timescaledb-ha:pg16-ts2.17-all

二、执行部署操作

2.1 导入timescale/timescaledb-ha:pg16-ts2.17-all镜像文件

复制代码
docker load -i timescaledb-ha_pg16-ts2.17-all.tar

2.2 创建部署目录和数据目录

复制代码
mkdir timescaledb-ha
cd timescaledb-ha
mkdir postgres-01
mkdir postgres-02
mkdir postgres-03
chmod 777 -R postgres-0* #设置数据文件目录权限

**建议:**将 postgres-01、postgres-02和 postgres-03 目录权限设置为:chmod 777 -R postgres-0*

2.3 创建docker-compose.yml文件

复制代码
version: '3.9'
services:
  postgres-01:
    container_name: postgres-01
    hostname: postgres-01
    image: timescale/timescaledb-ha:pg16-ts2.17-all
    privileged: true
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/postgres-01:/home/postgres
    ports:
      - "5001:5432"
    networks:
      pg-net:
        ipv4_address: 10.20.0.5
  postgres-02:
    container_name: postgres-02
    hostname: postgres-02
    image: timescale/timescaledb-ha:pg16-ts2.17-all
    privileged: true
    environment:
      PGDATA: /home/postgres/db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/postgres-02:/home/postgres
    ports:
      - "5002:5432"
    networks:
      pg-net:
        ipv4_address: 10.20.0.6
  postgres-03:
    container_name: postgres-03
    hostname: postgres-03
    image: timescale/timescaledb-ha:pg16-ts2.17-all
    privileged: true
    environment:
      PGDATA: /home/postgres/db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/postgres-03:/home/postgres
    ports:
      - "5003:5432"
    networks:
      pg-net:
        ipv4_address: 10.20.0.7
networks:
  pg-net:
    ipam:
      config:
        - subnet: 10.20.0.0/16

启动容器服务

复制代码
docker-compose up -d

服务目录结构

docker容器服务状态

2.4 配置主节点(postgres-01)

1、进入主节点容器

复制代码
docker exec -it postgres-01 sh

2、进入容器/home/postgres/pgdata/data目录,修改 pg_hba.conf

复制代码
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
# 配置允许复制客户端
host    replication     all             0.0.0.0/0               md5
host all all all scram-sha-256

3、修改配置postgresql.conf

复制代码
#设置修改以下
listen_addresses = '*' # 允许远程连接
hot_standby = on # 打开热备
wal_level = replica     # 设置 WAL 日志级别为 replica
max_wal_senders = 3     # 允许的 WAL 发送者数量,根据需要进行调整

4、退出容器并重启postgres-01容器

复制代码
docker-compose restart postgres-01

5、再次进入容器,执行psq命令创建流复制账号

复制代码
docker exec -it postgres-01 sh
$ psql
postgres=# create role replica with login replication encrypted password 'replica';
create role

执行以上操作完成主节点(postgres-01)配置。

2.5 配置postgres-02节点

1、进入postgres-02容器

复制代码
docker exec -it postgres-02 sh

2、执行命令同步主节点的数据

复制代码
pg_basebackup -Fp --progress -D /home/postgres/pgdata/data -R -h 10.20.0.5 -p 5432 -U replica --password

/home/postgres/pgdata/data是默认数据目录,回车输入 replica 的密码。

复制代码
Password: 
28692/28692 kB (100%), 1/1 tablespace

同步完成之后在/home/postgres/pgdata/data中会出现主节点的数据,需要注意postgresql.auto.conf和standby.signal。postgresql.auto.conf会记录主节点的信息

复制代码
$ cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replica password=replica channel_binding=prefer host=10.20.0.5 port=5432 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'

3、退出容器修改docker-compose.yaml的 postgres-02容器的数据目录

复制代码
  postgres-02:
    container_name: postgres-02
    hostname: postgres-02
    image: timescale/timescaledb-ha:pg16-ts2.17-all
    privileged: true
    environment:
      # 配置数据目录
      #PGDATA: /home/postgres/db #注释掉postgres-02容器的数据目录
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - ./postgres-02:/home/postgres

4、删除postgres-02容器并重启启动postgres-02容器

复制代码
cd timescaledb-ha
docker rm -f postgres-02
docker-compose up -d postgres-02

2.6 配置postgres-03节点

1、进入postgres-03容器

复制代码
docker exec -it postgres-03 sh

2、执行命令同步主节点的数据

复制代码
pg_basebackup -Fp --progress -D /home/postgres/pgdata/data -R -h 10.20.0.5 -p 5432 -U replica --password

/home/postgres/pgdata/data是默认数据目录,回车输入 replica 的密码。

复制代码
Password: 
28692/28692 kB (100%), 1/1 tablespace

同步完成之后在/home/postgres/pgdata/data中会出现主节点的数据,需要注意postgresql.auto.conf和standby.signal。postgresql.auto.conf会记录主节点的信息

复制代码
$ cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replica password=replica channel_binding=prefer host=10.20.0.5 port=5432 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'

3、退出容器修改docker-compose.yaml的 postgres-03容器的数据目录

复制代码
postgres-03:
    container_name: postgres-03
    hostname: postgres-03
    image: timescale/timescaledb-ha:pg16-ts2.17-all
    privileged: true
    environment:
      # 配置数据目录
      #PGDATA: /home/postgres/db #注释掉postgres-02容器的数据目录
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - ./postgres-03:/home/postgres

4、删除postgres-03容器并重启启动postgres-03容器

复制代码
cd timescaledb-ha
docker rm -f postgres-03
docker-compose up -d postgres-03

2.7 测试流复制配置

连接主节点(postgres-01)执行操作操作:SELECT * FROM pg_stat_replication;

相关推荐
水星灭绝3 小时前
win11+wsl2+docker
运维·docker·容器
what_20183 小时前
PostgreSQL 索引
数据库·postgresql
what_20184 小时前
PostgreSQL 时间
数据库·postgresql
supersolon6 小时前
Windows环境docker安装OpenClaw
docker·ai·docker-compose·openclaw·龙虾
CHQIUU7 小时前
PostgreSQL vs MySQL:选型指南与深度对比
数据库·mysql·postgresql
vpk1128 小时前
使用 Docker Compose 快速安装 MongoDB
mongodb·docker·容器
培小新8 小时前
五、Dokcer网络
linux·运维·docker·容器
杭州杭州杭州9 小时前
Docker实验2----4
运维·docker·容器
莫白媛9 小时前
Linux中Docker介绍与使用小白篇
linux·运维·docker