环境
- 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")