docker postgres主从数据库搭建

本文详细介绍了在Docker环境下配置PostgreSQL主从复制的过程,包括环境搭建、数据库配置、数据同步及测试脚本等内容。适用于希望在Docker中实现PostgreSQL高可用性的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

  • Ubuntu 16.04 LTS
    • 192.168.5.112 5432 Master
    • 192.168.5.114 5433 Slave
  • docker 18.09
  • docker-compose 1.16.0
  • postgres 9.6.12

主数据库配置

启动postgresql
version: '2'
services:
  postgresdb:
    restart: always
    image: postgres:9.6.12
    ports:
      - "5432:5432"
    volumes:
      - /data/docker/postgres_data:/var/lib/postgresql/data/
    env_file: .env
配置pg_hba.conf

末尾增加

host replication   replica   192.168.5.114/32    md5
配置postgresql.conf
listen_addresses = '*'
max_connections = 100
shared_buffers = 128MB
dynamic_shared_memory_type = posix
wal_level = hot_standby
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f'
max_wal_senders = 32
wal_keep_segments = 64
wal_sender_timeout = 60s
synchronous_standby_names = '*'
hot_standby = on
创建复制账号并验证
docker exec -it conatiner_id bash # 进入容器 
psql -U postgres
set synchronous_commit =off;
create role replica login replication encrypted password '123456'; # replica 和密码是可以换

从数据库配置

配置postgresql.conf
hot_standby = on
hot_standby_feedback = on
新建recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=192.168.5.112 port=5432 user=replica password=123456'

数据同步

#停止容器
docker stop masterpostgresql
docker stop slavepostgresql
#切换到root用户,生产ssh  key实现ssh免密
ssh-keygen -t rsa -C "xxx@xx.xx"
rsync -cva --inplace --exclude=*pg_xlog* /data/docker/postgres_data/  192.168.5.114:/data/docker/postgres_data/  #主数据库服务器上运行

注:同步之后修改从数据库的postgresql.conf

hot_standby_feedback = on
max_connections = 200

先重启主服务器,再重启从服务器

测试脚本(一次性导入数据)

# -*- coding: UTF-8 -*-

import psycopg2
import sys
import os
import datetime
import calendar
import time


now_time = time.strftime("%Y-%m-%d",time.localtime())

def create_tableandinit(table_name):
    conn = psycopg2.connect(
        database = 'postgres',
        user = 'postgres',
        password = 'postgres',
        host = '192.168.5.112',
        port = '5432',
    )
    cur = conn.cursor()
    cur.execute("create table %s (ID int, name char(20), age int)" % table_name)

    names = ['xiaoming', 'xiaobai', 'xiaohong', 'xiaogang']
    k = 0
    for i in range(1,10000):
        for name in names:
            cur.execute("insert into %s values (%d, '%s', '%d')" % (table_name,k,name,i))
            k = k + 1
    cur.close()
    conn.commit()
    conn.close()
create_tableandinit("test2")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值