Docker快速搭建PostgreSQL15流复制集群

搭建流复制集群

目录

  • 获取镜像
  • 主节点配置
  • 从节点配置
  • 测试
  • 开始插件

获取镜像

拉取镜像:docker pull timescale/timescaledb-ha:pg15-all

配置 docker-compose.yaml 文件:

version: '3.9'
services:# 写节点postgres-01:container_name: postgres-01hostname: postgres-01image: timescale/timescaledb-ha:pg15-allprivileged: trueenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: postgresvolumes:- ./postgres-01:/home/postgresports:- "5001:5432"networks:pg-net:ipv4_address: 10.20.0.5# 读节点一      postgres-02:container_name: postgres-02hostname: postgres-02image: timescale/timescaledb-ha:pg15-allprivileged: trueenvironment:PGDATA: /home/postgres/dbPOSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: postgresvolumes:- ./postgres-02:/home/postgresports:- "5002:5432"networks:pg-net:ipv4_address: 10.20.0.6# 读节点二      postgres-03:container_name: postgres-03hostname: postgres-03image: timescale/timescaledb-ha:pg15-allprivileged: trueenvironment:PGDATA: /home/postgres/dbPOSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: postgresvolumes:- ./postgres-03:/home/postgresports:- "5003:5432"networks:pg-net:ipv4_address: 10.20.0.7
networks:pg-net:ipam:config:- subnet: 10.20.0.0/16

目录结构如下:

➜  postgres ✗ ls -lh                             
total 8
-rw-r--r--@ 1 yuelong  staff   1.3K Sep 23 17:03 docker-compose.yaml
drwxr-xr-x@ 4 yuelong  staff   128B Sep 23 14:34 postgres-01
drwxr-xr-x@ 5 yuelong  staff   160B Sep 23 14:52 postgres-02
drwxr-xr-x@ 3 yuelong  staff    96B Sep 23 14:06 postgres-03

这里最好将 postgres-01postgres-02postgres-03 设置为:chmod 777 -R postgres-01。接着启动容器:docker compose up -d

主节点配置

进入主节点的容器内 :docker exec -it postgres-01 sh

如果需要 root 的权限可以执行:docker exec -it -u root postgres-01 sh

进入容器内的/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

接着配置 postgresql.conf

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

接着退出容器,重启容器:docker compose restart postgres-01

然后在进入容器内,进入 psql,创建流复制的账号:

$ psql
psql (15.8 (Ubuntu 15.8-1.pgdg22.04+1))
Type "help" for help.postgres=# create role replica with login replication encrypted password 'replica';
create role

好了,这样主节点就配置好了。

从节点配置

接下来配置从节点,这里我们先设置数据目录为:

version: '3.9'
services:# 写节点......# 读节点一      postgres-02:container_name: postgres-02hostname: postgres-02image: timescale/timescaledb-ha:pg15-allprivileged: trueenvironment:# 配置数据目录PGDATA: /home/postgres/dbPOSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: postgresvolumes:- ./postgres-02:/home/postgres

这个时候我们需要进入 postgres-02 的容器内:docker exec -it postgres-02 sh,同步主节点的数据。

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.confstandby.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'

接着退出容器,修改 docker-compose.yamlpostgres-02容器的数据目录注释掉:

version: '3.9'
services:# 写节点......# 读节点一      postgres-02:container_name: postgres-02hostname: postgres-02image: timescale/timescaledb-ha:pg15-allprivileged: trueenvironment:# 配置数据目录#PGDATA: /home/postgres/dbPOSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: postgresvolumes:- ./postgres-02:/home/postgres

然后删除掉 postgres-02容器,重启启动:

docker compose down postgres-02
docekr compose up -d postgres-02

另一个节点也是一样操作。

测试

在主节点的 psql 中执行:SELECT * FROM pg_stat_replication;

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           
-----+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------+-----------+------------+---------------+------------+-------------------------------400 |    20845 | replica | walreceiver      | 10.20.0.6 |                 |       58166 | 2024-09-23 10:36:09.844301+00 |              | streaming | 0/7018420 | 0/7018420 | 0/7018420 | 0/7018420  |           |           |            |             0 | async      | 2024-09-23 11:57:15.271431+00469 |    20845 | replica | walreceiver      | 10.20.0.7 |                 |       42680 | 2024-09-23 10:41:39.307304+00 |              | streaming | 0/7018420 | 0/7018420 | 0/7018420 | 0/7018420  |           |           |            |             0 | async      | 2024-09-23 11:57:15.29262+00
(2 rows)

这就配置成功了。

开始插件

我们这里使用的timescale/timescaledb-ha:pg15-all镜像里面包含了,时序和空间插件,这里连接是数据库,执行SELECT * FROM pg_extension;查看开启的插件。

postgres=# SELECT * FROM pg_extension;oid  |       extname       | extowner | extnamespace | extrelocatable | extversion |                                                                                 extconfig                                                                                 |                                                              extcondition                                                               
-------+---------------------+----------+--------------+----------------+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------13542 | plpgsql             |       10 |           11 | f              | 1.0        |                                                                                                                                                                           | 17830 | timescaledb_toolkit |       10 |         2200 | f              | 1.18.0     |                                                                                                                                                                           | 16384 | timescaledb         |       10 |         2200 | f              | 2.16.1     | {16403,16404,16426,16440,16439,16459,16458,16474,16473,16499,16515,16516,16533,16532,16552,16553,16609,16622,16649,16662,16672,16682,16686,16702,16712,16727,16736,16735} | {"","WHERE id >= 1","","","","","","","","","","","","","","WHERE id >= 1000"," WHERE key <> 'uuid' ","","","","","","","","","","",""}
(3 rows)

这里需要我们先创建一个数据库:

create database db1; # 创建库
\c db1;    # 连接库
CREATE EXTENSION postgis;  # 开启插件
CREATE EXTENSION postgis_topology; 
CREATE EXTENSION fuzzystrmatch; 
CREATE EXTENSION postgis_tiger_geocoder;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149179.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一篇大模型Agent记忆机制研究综述

转自&#xff1a;PaperAgent 基于大型语言模型&#xff08;LLM&#xff09;的智能体最近吸引了研究和工业社区的广泛关注。与原始的大型语言模型相比&#xff0c;基于LLM的智能体以其自我进化能力为特色&#xff0c;这是解决需要长期和复杂智能体-环境交互的现实世界问题的基础…

10.安卓逆向-安卓开发基础-api服务接口设计1

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

实战精选 | 5分钟利用 OpenVINO™ 部署 Qwen2.5

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 英特尔 AI 软件工程师 排版 | 吴紫琴 OpenVINO™ Qwen2.5 是阿里通义团队近期最新发布的文本生成系列模型&#xff0c;基于更富的语料数据集训练&#xff0c;相较于 Qwen2&#xff0c;Qwen2.5 获得了显著更多的知识&#xff…

HSD AIM915 916 芯片调试

在车机显示 系统中&#xff0c;AIM915X和AIM916X作为车机和显示屏之间的传输芯片&#xff0c;车机的LVDS视频信号传到显示屏&#xff1b;控制信号如I2C、GPIO可实现双向透传&#xff1b; 一、设备树 开发平台&#xff1a;IMX6D 1、设备节点 2、timing参数 二、分辨率 1、修改为…

通过企业微信群机器人 发送群消息

1、添加群机器人&#xff0c;复制的webhook地址 2、 public static void main(String[] args) { String reqUrl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6xdexxxxxxxxxxxxxxxxxxxxxxxxxxx"; String title "填…

FP7208:升压汽车车灯方案 高效稳定的电力支持

前言 近年来随着汽车的不断普及&#xff0c;车灯方面也在不断发展&#xff0c;车灯对于汽车不仅是外观件更是汽车主动安全的重要组成部分。灯光在保证照亮前部道路的同时&#xff0c;还要确保不对对面车辆产生眩目影响。同时需要针对不同路况和不同载荷引起的灯光偏离进行调整&…

入门数据结构JAVA DS——二叉树的介绍 (构建,性质,基本操作等) (1)

前言 二叉树的概念和性质 二叉树的基本概念 二叉树的种类 二叉树的性质 二叉树的构建存储与遍历 存储 构建 遍历 前序遍历 后序遍历 中序遍历 层序遍历 二叉树的基本操作 获取树中结点个数 获取叶子结点个数 获取第K层结点的个数 获取二叉树的高度 检测值为v…

【新书】从零构建大型语言模型,370页pdf

学习如何从零开始创建、训练和调整大型语言模型&#xff08;LLMs&#xff09; 在《从零构建大型语言模型》一书中&#xff0c;畅销书作者塞巴斯蒂安拉什卡&#xff08;Sebastian Raschka**&#xff09;将一步步指导你创建自己的LLM。每个阶段都有清晰的文字、图表和示例解释。…

【Python】生成dataframe的测试样例,用于测试一个或者多个dataframe

我们在处理dataframe测试时&#xff0c;发现&#xff0c;总需要重新构造一个新的dataframe&#xff0c;每次想找个现成的就想抓狂。 所以&#xff0c;为了方便随用随拿&#xff0c;我在这里直接保存一个直接生成dataframe 的方法。 1. 生成一个随机dataframe的方法&#xff1…

1688店铺装修模板1688店铺怎么装修1688装修模板1688店铺装修教程视频1688运营阿里巴巴店铺装修设计阿里店铺首页怎么装修产品分类效果

侧边栏装修效果&#xff0c;代码1688店铺怎么装修1688装修模板1688店铺装修教程视频1688运营阿里巴巴店铺装修设计阿里店铺首页怎么装修 工具是一秒美工助手

食家巷苦豆粉,香得很哟

苦豆粉&#xff0c;它看似普通&#xff0c;却承载着西北的厚重历史与浓郁风情。那一抹淡淡的绿色粉末&#xff0c;蕴含着大自然的馈赠和西北人民的智慧。 苦豆&#xff0c;这种生长在西北土地上的植物&#xff0c;经过精心研磨&#xff0c;变成了细腻的苦豆粉。它的味道独特&am…

python对文件的写入和追加

写入文件 1.打开文件 文件可以是不存在的&#xff0c;不存在就会创建 f open(./test.txt, w, encoding"utf-8")2.写数据到内存中 f.write("你好&#xff0c;世界")3.写到硬盘中 f.flush()#或者 close()有刷新的功能 f.close()整体代码 #打开文件 f …

鲲鹏计算这五年:硬生态基本盘稳住,才能放手进击软生态

文 | 智能相对论 作者 | 叶远风 数智化深入发展、新质生产力成为主旋律的当下&#xff0c;本土计算产业的发展被寄予越来越多的关注和期待。自2019年开启以来&#xff0c;鲲鹏计算产业生态已经整整走过5个年头。 因此&#xff0c;今年华为全联接大会的鲲鹏之夜&#xff0c;在…

还在用windows自带录屏?试试这三款录屏工具

作为一名办公室文员&#xff0c;我经常需要录制电脑屏幕来制作教程或者记录工作流程。在众多的录屏工具中&#xff0c;我尝试了四款不同的录屏工具&#xff0c;包括Windows自带录屏工具。今天&#xff0c;我就来跟大家分享一下我的使用体验&#xff0c;希望能帮助到和我有同样需…

在视频上绘制区域:使用Vue和JavaScript实现交互式画布

在数字时代&#xff0c;交互式媒体内容的创建和消费变得越来越普遍。特别是视频内容&#xff0c;它不仅提供了视觉信息&#xff0c;还允许用户与之互动&#xff0c;从而增强了用户体验。本文将介绍如何使用Vue.js框架和JavaScript创建一个交互式组件&#xff0c;该组件允许用户…

谷歌老户的优势及优化策略,增加曝光度方法介绍

谷歌老户&#xff08;已存在一段时间并积累了历史数据的账户&#xff09;通常具有较高的权重和稳定性&#xff0c;这使其在投放广告时可以更快速地增加流量并保持稳定的表现。以下是一些策略和建议&#xff0c;帮助您最大化利用谷歌老户的优势。 一、它的优势&#xff1a; 账…

Cherry Studio:开启AI智能工作的新篇章

引言 在当今快速发展的科技时代&#xff0c;如何高效利用人工智能技术提升工作效率&#xff0c;成为了各行各业专业人士的共同追求。&#x1f352; Cherry Studio 正是为此而生&#xff0c;它是一款支持多模型服务的桌面客户端&#xff0c;内置了超过 30 个行业的智能助手&…

MDS130-16-ASEMI充电桩专用MDS130-16

编辑&#xff1a;ll MDS130-16-ASEMI充电桩专用MDS130-16 型号&#xff1a;MDS130-16 品牌&#xff1a;ASEMI 封装&#xff1a;DXT-5 批号&#xff1a;2024 现货&#xff1a;50000 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;130A …

VOC2007数据集

目标检测入门code 文件目录 下载数据集——在官网下载VOC2007数据集 下载训练数据集 TRAIN data 下载测试数据集 TEST data 解压数据集 解压——训练数据集&#xff0c;在服务器上&#xff0c;目录为VOCdevkit 部分文件目录 全部文件总目录 解压——测试数据集 &#xff08;…

828华为云征文|云服务器Flexus X实例评测体验之搭建MySQL数据库

全文目录&#xff1a; 一、前言二、Flexus X云服务器2.1 Flexus X实例概述2.2 为什么选择 Flexus X实例&#xff1f; 三、购选及登录教程3.1 如何选购Flexus X&#xff1f;3.2 登录方式选择 四、安装 MySQL4.1 安装MySQL依赖库4.2 下载MySQL安装包4.3 上传MySQL安装包4.4 解压M…