环境准备:一台安装了Docker的Linux服务器。

为了简化演示环境,这里只用一台服务器来演示,通过不同端口来区分。

01

创建一个docker bridge 网路用于测试

docker network create --subnet=172.18.0.0/24 dockernetwork
docker network ls

设置了网段为 172.18.0.0,规划主从库IP端口如下:

主库 172.18.0.101:5432

从库 172.18.0.102:5433

02

拉取 postgres:12 镜像

docker pull postgres:12

03

创建数据库数据目录

mkdir -p /data/psql/master
mkdir -p /data/psql/slave
mkdir -p /data/psql/repl
chown 999:999 /data/psql/master
chown 999:999 /data/psql/slave
chown 999:999 /data/psql/repl

master:主库数据

slave:从库数据

repl:临时使用复制数据

04

运行master容器

docker run -d \
--network dockernetwork --ip 172.18.0.101 -p 5432:5432 \
--name pg12master -h pg12master \
-e LANG="C.UTF-8" \
-e 'TZ=Asia/Shanghai' \
-e "POSTGRES_DB=postgres" \
-e "POSTGRES_USER=postgres" \
-e "POSTGRES_PASSWORD=postgres" \
-v /data/psql/master:/var/lib/postgresql/data \
postgres:12

05

查看容器运行情况

docker ps -a -f network=dockernetwork --format "table {{.Names}}\t{{.Image}}\t{{.RunningFor}}\t{{.Status}}\t{{.Networks}}\t{{.Ports}}"

06

创建主从流复制专用账号

用客户端工具连接数据库后执行以下语句,这里我使用了pgAdmin4。

CREATE ROLE repuser WITHLOGINREPLICATIONCONNECTION LIMIT 5PASSWORD 'Q1w2E#';

pgAdmin 也可以用 docker 来启动。

docker pull dpage/pgadmin4
mkdir -p /data/pgadmin4
chown 5050:5050 /data/pgadmin4docker run -d --restart=unless-stopped \
--network dockernetwork --ip 172.18.0.105 \
--name pgadmin4 -h pgadmin4 \
-e TZ=Asia/Shanghai \
-e 'PGADMIN_DEFAULT_EMAIL=admin@pgadmin4.com' \
-e 'PGADMIN_DEFAULT_PASSWORD=pgadmin4' \
-p 5430:80 \
-v /data/pgadmin4:/var/lib/pgadmin \
dpage/pgadmin4

通过 http://ip:5430/即可访问pgadmin4,账号密码如脚本所示。具体使用也很简单,自己摸索下就懂了。

07

修改配置文件 /data/psql/master/pg_hba.conf

cd /data/psql/master
nano pg_hba.conf

在文末添加如下一行,其中 repuser 即我们新建的主从专用账号,172.18.0.102/32 为从库 ip。

host replication repuser 172.18.0.102/32 md5

08

修改配置文件 /data/psql/master/postgresql.conf

nano postgresql.conf

查找文件中以下几个参数,并调整如下:

archive_mode = on
archive_command = '/bin/date'
max_wal_senders = 10
wal_keep_segments = 16
synchronous_standby_names = '*'

09

重启主库使设置生效

#使用 pg_ctl stop 安全停止数据库
docker exec -it -u postgres pg12master pg_ctl stop
docker start pg12master

10

创建从库容器

docker run -d \
--network dockernetwork --ip 172.18.0.102 -p 5433:5432 \
--name pg12slave -h pg12slave \
-e LANG="C.UTF-8" \
-e 'TZ=Asia/Shanghai' \
-e "POSTGRES_DB=postgres" \
-e "POSTGRES_USER=postgres" \
-e "POSTGRES_PASSWORD=postgres" \
-v /data/psql/slave:/var/lib/postgresql/data \
-v /data/psql/repl:/var/lib/postgresql/repl \
postgres:12

这里我们把/data/psql/repl挂载到容器中,再看下容器列表:

docker ps -a -f network=dockernetwork --format "table {{.Names}}\t{{.Image}}\t{{.RunningFor}}\t{{.Status}}\t{{.Networks}}\t{{.Ports}}"

主从库容器都已经跑起来了,当然了,这个从库还没配置。

11

进入从库容器,同步初始主库数据到 repl 目录

docker exec -it -u postgres pg12slave /bin/bash
pg_basebackup -R -D /var/lib/postgresql/repl -Fp -Xs -v -P -h 172.18.0.101 -p 5432 -U repuser

根据提示输入repuser的密码Q1w2E#后,会在宿主机的 /data/psql/repl 目录生成备份。

备份成功,退出容器。

exit

12

重建 slave 容器

通过上一步的初始备份,现在可以使用 /data/psql/repl 里的数据重建 slave容器了。首先删除slave目录,然后将repl目录改为slave,这个目录就是从库的数据目录了。

docker stop pg12slave && docker rm pg12slave
cd /data/psql/
rm -rf slave
mv repl slave
cd /data/psql/slave# postgresql.auto.conf 将含有复制所需信息
cat postgresql.auto.conf

检查 postgresql.auto.conf 文件里是否包含如下内容:

primary_conninfo = 'user=repuser password=''Q1w2E#'' host=172.18.0.101 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

正确无误后,重建容器。

# 恢复重建从库容器
docker run -d \
--network dockernetwork --ip 172.18.0.102 -p 5433:5432 \
--name pg12slave -h pg12slave \
-e LANG="C.UTF-8" \
-e 'TZ=Asia/Shanghai' \
-e "POSTGRES_DB=postgres" \
-e "POSTGRES_USER=postgres" \
-e "POSTGRES_PASSWORD=postgres" \
-v /data/psql/slave:/var/lib/postgresql/data \
postgres:12

这里不再挂载repl了,slave容器运行起来后,主从创建完成。

13

查看主从复制信息

# 验证主从
ps -aux | grep postgres
# 主库有 walsender 进程如下
postgres: walsender repuser
# 从库有 walreceiver 进程如下
postgres: walreceiver

连接主库,通过sql可以查询复制信息:

select * from pg_stat_replication;

14

总结

以上是在单机环境下的演示,在实际生产环境中,只要调整相应的账号密码ip端口即可实现类似效果,其他配置信息具体根据自己需要再行调整。

dotnet core 下连接PostgreSQL的库主要是Npgsql,Entity Framework Core 下可以使用包Npgsql.EntityFrameworkCore.PostgreSQL。相较于MySQL,PostgreSQL对SQL标准的支持更完整,功能更强大。网上对这两个数据库的比较很多,这里就不多赘述了。

欢迎关注公众号 "dotnet 新征程"

使用 Docker 搭建 PostgreSQL 12 主从环境相关推荐

  1. 使用Docker搭建大数据Hadoop环境

    使用Docker搭建大数据Hadoop环境 一.安装Docker 原文地址:https://www.imooc.com/article/48676.http://www.runoob.com/dock ...

  2. Docker 配置 PostgreSQL13 的主从环境

    Docker 配置 PostgreSQL13 的主从环境 前言 PostgreSQL 数据库支持多种复制解决方案,以构建高可用性,可伸缩,容错的应用程序,其中之一是预写日志(WAL)传送.该解决方案允 ...

  3. Docker搭建 Nginx+PHP+MySQL 环境并部署WordPress实践

    本文给大家分享的是作者基于Docker搭建 Nginx+PHP+MySQL 环境并部署WordPress的详细过程,非常的全面,有需要的小伙伴可以参考下 Docker基于LXC实现了把软件封装到一个完 ...

  4. 基于CectOS7利用docker搭建Vulhub漏洞靶机环境

    基于CectOS7利用docker搭建Vulhub漏洞靶机环境 准备条件 第一步:在CentOS7上安装docker centos安装python3 安装 docker-compose docker- ...

  5. 使用Docker搭建Elasticsearch集群环境

    本篇文章首发于头条号单机如何搭建Elasticsearch集群?使用容器技术快速构建集群环境,欢迎关注头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_te ...

  6. 使Docker搭建Java Web运行环境

    Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它.Docker 是一种"轻量级"容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公 ...

  7. nvidia docker容器不支持中文的解决办法_用docker搭建深度学习实验环境

    tensorflow和pytorch官方都维护了不同版本的docker镜像.借助docker我们可以方便的搭建起深度学习实验环境. 但是想要在同一个容器内同时拥有tensorflow.pytorch. ...

  8. Docker搭建便捷的开发者环境

    你可能遇到这样的场景:开发软件时,需要像数据库(mysql,mongodb).消息系统(rabbitmq).缓存服务(redis)等其它依赖服务.当然我们可以找台机器,一步步安装依赖,然后把所有依赖的 ...

  9. 【jeecg Docker安装】使用 Docker 搭建 Java Web 运行环境

    Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它.Docker 是一种"轻量级"容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公 ...

最新文章

  1. 零基础学python这本书怎么样-看了这本基础教程的书籍你还担心你的python学不好吗?...
  2. Dirichlet分布与多项分布的共轭性
  3. vue按钮字体大小设置_vue-elementui之按钮
  4. django-如何debug
  5. 【Elasticsearch】消除 Elasticsearch 中的重复文档
  6. win10,动态图片(GIF)生成
  7. 拓扑排序所有可能java_拓扑排序获取所有可能序列JAVA实现
  8. MVC模式中编写一个登录的Servlet
  9. html显示tif图片,呈现HTML中的TIF文件
  10. android 路由表命令,一个轻量简易的Android路由框架
  11. h5 nan_易企秀资深前端架构师袁飞:移动H5开发如何避坑
  12. 论文笔记:PSGAN
  13. 在页面上用$(#userName).val();获取不到值,提示$(#userName)未定义
  14. FME学习资料……new
  15. 如何让文字转换成语音
  16. CS61B Project 0 项目记录
  17. 重装系统无法安装在efi分区_提示“在EFI系统上windows只能安装到GPT磁盘”解决方法...
  18. 坑爹的卓越亚马逊盗版网上书店
  19. 国内实现web网页打开并播放PPT
  20. 金庸笔下的“十大名师”

热门文章

  1. Java研发方向如何准备BAT技术面试答案(上)
  2. iOS开发网络篇—网络编程基础
  3. 改变listview中item选中时文字的颜色
  4. wpf中的datagrid中如何显示图片
  5. [转]IIS的完整控制类
  6. 火狐查cookie_Firefox 65默认会阻止跟踪Cookie
  7. 【JS第34期】BOM-window对象
  8. Linux shell 编程(七):流程控制语句
  9. 虚拟化记录--No.1
  10. centos 下安装man手册