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;
