复制方式           优点                                                                 缺点
————————————————————————————————————————————————————————————————————————————————————
同步 数据一致性高                                            1.写入性能低
                                                                          2.只支持一个从节点、多余的从节点为备份
                                                                          3.若只有一个从节点时、从节点正好宕机、则阻塞主节点事物

异步方式(从节点都连接主节点) 写入性能高 1.数据一致性相对弱点(具体看网络部署)
                                                                          2.从节点多时,主节点存在压力较高

异步级联复制 主节点压力小 可靠性差、若前面从节点宕机,则后面从节点数据复制失效

异步+同步复制 数据一致性+高可用都会有保障 1. 需要对同步的从节点设置备份节点
                                                                           2. 故障切换复杂

搭建1主两从同步流复制环境

创建自定义网络类型,并且指定网段

 10.1.20.114:docker network create --subnet=172.172.0.0/ docker-br0
10.1.20.124:docker network create --subnet=172.172.1.0/ docker-br0

创建docker系统

 docker run -d --privileged --name pg01 --hostname pg01 --net docker-br0 --ip 172.172.0.100 -v /data/pgdata:/pgdata -p  : -p  : centos:latest /usr/sbin/init
docker run -d --privileged --name pg02 --hostname pg02 --net docker-br0 --ip 172.172.1.100 -v /data/pgdata:/pgdata -p : -p : centos:latest /usr/sbin/init

创建路由

  10.1.20.114:ip route add 172.172.1.0/ via 10.1.20.124 dev eth0
10.1.20.124:ip route add 172.172.0.0/ via 10.1.20.114 dev eth0

安装postgresql(10.1.20.114)

###安装依赖包
yum install zlib-devel gcc make ###创建用户和组
groupadd postgres
useradd -g postgres postgres
passwd postgres ###创建postgresql安装目录
mkdir -p /usr/local/postgresql
chown -R postgres:postgres /usr/local/postgresql ###下载安装文件
cd /usr/local/src
wget https://ftp.postgresql.org/pub/source/v10.5/postgresql-10.5.tar.gz ###解压
tar -xzvf postgresql-10.5.tar.gz ###安装软件
cd postgresql-10.5
./configure --prefix=/usr/local/postgresql --without-readline
make && make install ###安装contrib目录下的一些工具,是第三方组织的一些工具代码,建议安装
cd contrib
make && make install ###创建postgresql的数据目录
mkdir -p /pgdata/postgresql/data
mkdir -p /pgdata/postgresql/logfile
mkdir -p /pgdata/postgresql/archive
chown -R postgres:postgres /pgdata su - postgres
###配置环境变量
vi .bash_profile
export PGHOME=/usr/local/postgresql/
export PGDATA=/pgdata/postgresql/data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGHOME/lib/
PATH=$PATH:/usr/local/postgresql/bin
source .bash_profile
###初始化数据库
initdb -D /pgdata/postgresql/data
###创建配置文件postgresql.conf
cat > /pgdata/postgresql/data/postgresql.conf << EOF
listen_addresses = '*'
port =
max_connections =
superuser_reserved_connections =
wal_level = logical ##pg10版本中,待选的值为minimal、replica、logical。 minimal --不能通过基础备份和wal日志恢复数据库。 replica = 9.6版本以前的archive和hot_standby --该级别支持wal归档和复制。logical --在replica级别的基础上添加了支持逻辑解码所需的信息。
full_page_writes = on
wal_log_hints = off
archive_mode = on
archive_command = 'cp %p /pgdata/postgresql/archive/%f < /dev/null'
max_wal_senders =
hot_standby = on
log_destination = 'csvlog'
logging_collector = on
log_directory = '/pgdata/postgresql/logfile'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S'
log_rotation_age = 1d
log_rotation_size = 10MB
log_statement = 'mod' log_timezone = 'PRC'
timezone = 'PRC'
EOF
###启动服务
pg_ctl -D /pgdata/postgresql/data -l logfile start
###设置为开机自启动
su - root
# 添加启动服务(确认文件postgresql内的目录正确)
cp /usr/local/src/postgresql-10.5/contrib/start-scripts/linux /etc/init.d/postgresql
chown -R postgres:postgres /etc/init.d/postgresql
chmod a+x /etc/init.d/postgresql
# 添加开启自启动
chkconfig --add postgresql

#修改开机启动文件/etc/init.d/postgresql的配置信息
vi /etc/init.d/postgresql
prefix=/usr/local/postgresql
PGDATA="/pgdata/postgresql/data"
PGLOG="/pgdata/postgresql/logfile/serverlog"
#重新加载并启动
systemctl daemon-reload
systemctl stop postgresql
systemctl start postgresql
###启动后进程情况如下
 postgres            : ?        :: /usr/local/postgresql/bin/postgres -D /pgdata/postgresql/data
postgres : ? :: postgres: checkpointer process
postgres : ? :: postgres: writer process
postgres : ? :: postgres: wal writer process
postgres : ? :: postgres: autovacuum launcher process
postgres : ? :: postgres: stats collector process
postgres : ? :: postgres: bgworker: logical replication launcher
###测试
[root@pg01 data]# source ~/.bash_profile
[root@pg01 data]# psql -U postgres
Password for user postgres:
psql (10.5)
Type "help" for help. postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+-----------+---------+-------+-----------------------
postgres | postgres | SQL_ASCII | C | C |
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
test | postgres | SQL_ASCII | C | C |
( rows)
postgres=# CREATE DATABASE pgpool ;
CREATE DATABASE
postgres=# \c pgpool
You are now connected to database "pgpool" as user "postgres".
pgpool=#
pgpool=# CREATE TABLE pgpool (id serial,age bigint,insertTime timestamp default now());
CREATE TABLE
pgpool=# insert into pgpool (age) values ();
INSERT
pgpool=# select * from pgpool;
id | age | inserttime
----+-----+----------------------------
| | -- ::03.329849
( row)

安装postgresql(10.1.20.124)

安装步骤和主库10.1.20.114一致

###登录主库并创建同步账号

ALTER USER postgres WITH PASSWORD 'postgres-vcredit';
CREATE USER replica WITH PASSWORD 'replica-vcredit' REPLICATION;

###修改配置信息(10.1.20.114上执行

vi pg_hba.conf
local all all md5
host all all 0.0.0.0/0 md5
host replication replica 0.0.0.0/0 md5 local all all ident map=map_root 注:trust为无密码信任登录,只需输入ip和port即可登录;mds需要用户验证登录;ident为映射系统账户到pgsql访问账户。

###同步主库数据(在10.1.20.124上执行

pg_basebackup -F p --progress -D /pgdata/postgresql/data -h 10.1.20.114 -p  -U replica --password
#pg_basebackup -h 10.10.56.16 -p -U repl -w -Fp -Xs -Pv -R -D /pgdata/postgresql/data 参数说明 -h 启动的主库数据库地址 -p 主库数据库端口
-U 流复制用户 -w 不使用密码验证
-Fp 备份输出正常的数据库目录 -Xs 使用流复制的方式进行复制
-Pv 输出复制过程的详细信息 -R 为备库创建recovery.conf文件
-D 指定创建的备库的数据库目录

###创建recovery.cnf 文件(10.1.20.124)

cat >> recovery.conf << EOF
standby_mode = on
primary_conninfo = 'application_name=slave1 host=10.1020.114 port=5432 user=replica password=replica-vcredit'
recovery_target_timeline = 'latest'
#trigger_file = '/pgdata/postgresql/data/trigger_activesdb'
EOF

#################################  小技巧 ##########################################

我们默认情况下使用root,但是必须切换到postgres管理员用户才能执行initdb或psql等命令,而如果我们将root映射成postgres管理员,即可不需要切换用户。

#在pg_hba.conf添加本地账户为ident
vim pg_hba.conf
local all all ident map=map_root
#在pg_ident.conf中添加映射,将本地root账户映射为pgsql管理员账户postgres
vim pg_ident.conf
# MAPNAME SYSTEM-USERNAME PG-USERNAME
map_root root postgres
#测试在系统账户root下,直接以postgres账户登录数据库;而默认下是不允许这样登录的

###################################################################################

###重启服务

su - root
systemctl stop postgresql
systemctl start postgresql

至此主从搭建完毕

安装pgpool(10.1.20.114)

###安装依赖包

yum install gcc-c++ flex readline* readline-devel zlib* openssl openssl-devel -y
yum -y install openssh openssh-clients openssh-server openssh-askpass
yum -y install initscripts

###创建安装目录

mkdir -p /usr/local/pgpool
chown -R postgres:postgres /usr/local/pgpool

###下载安装包

cd /usr/local/src
wget http://www.pgpool.net/mediawiki/images/pgpool-II-3.7.5.tar.gz

###解压

tar -xzvf pgpool-II-3.7..tar.gz

###编译安装

cd pgpool-II-3.7.
./configure --prefix=/usr/local/pgpool -with-pgsql=path -with-pgsql=/usr/local/postgresql --with-openssl
make && make install

###安装扩展包

cd src/sql/
$ cd pgpool-II-x.x.x/src/sql/pgpool-regclass
$ make
$ make install psql -f pgpool-regclass.sql -h 172.172.1.100 -p -U postgres template1 psql -f insert_lock.sql -h 172.172.1.100 -p -U postgres template1 psql -f pgpool-recovery.sql -h 172.172.1.100 -p -U postgres template1 chown -R postgres:postgres /usr/local/pgpool 连接主库,创建扩展函数(该步骤非必须,上述安装成功内部已经安装了扩展,下述只为方便查看) postgres=# create extension pgpool_regclass;
CREATE EXTENSION
postgres=# CREATE EXTENSION pgpool_recovery;
CREATE EXTENSION
postgres=# select * from pg_extension;
extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-----------------+----------+--------------+----------------+------------+-----------+--------------
plpgsql | | | f | 1.0 | |
pgpool_regclass | | | t | 1.0 | |
pgpool_recovery | | | t | 1.1 | |
( rows) postgres=#

###服务器配置pgpool-Ⅱ

cd /usr/local/pgpool/etc
cp pcp.conf.sample pcp.conf
cp pgpool.conf.sample pgpool.conf
cp pool_hba.conf.sample pool_hba.conf mkdir -p /pgdata/pgpool/data /pgdata/pgpool/logfile /pgdata/pgpool/script
chown -R postgres:postgres /pgdata

#执行完自动生成pool_passwd文件
pg_md5 -p -m -u postgres pool_passwd 
pg_md5 -p -m -u pg_check pool_passwd
chown -R postgres:postgres /usr/local/pgpool/

###修改配置文件pgpool.conf

listen_addresses = '*'
port =
pcp_listen_addresses = '*'
pcp_port = backend_hostname0 = '172.172.1.100' #主库IP
backend_port0 =
backend_weight0 =
backend_data_directory0 = '/pgdata/postgresql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = '172.172.0.100' #从库IP
backend_port1 =
backend_weight1 =
backend_data_directory1 = '/pgdata/postgresql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER' enable_pool_hba = on
pool_passwd = 'pool_passwd' pid_file_name = '/pgdata/pgpool/data/pgpool.pid'
logdir = '/pgdata/pgpool/logfile' connection_cache = on
replication_mode = off
load_balance_mode = on master_slave_mode = on
master_slave_sub_mode = 'stream' sr_check_period =
sr_check_user = 'postgres'
sr_check_password = 'postgres-vcredit'
sr_check_database = 'postgres'
delay_threshold =
follow_master_command = '' health_check_period =
health_check_timeout =
health_check_user = 'postgres'
health_check_password = 'postgres-vcredit'
health_check_database = 'postgres'
health_check_max_retries =
health_check_retry_delay =
connect_timeout = failover_command = '/pgdata/pgpool/script/failover.sh %d %P %H %R'
failback_command = ''
fail_over_on_backend_error = on
search_primary_node_timeout = use_watchdog = on
wd_hostname = '172.172.1.100'
wd_port =
wd_priority =
wd_authkey = ''
wd_ipc_socket_dir = '/tmp' #delegate_IP = '172.172.0.220' #VIP IP
#if_cmd_path = '/usr/sbin' #if_up_cmd = 'ip addr add $_IP_$/24 dev eth0 label eth0:0'
#if_down_cmd = 'ip addr del $_IP_$/24 dev eth0' #arping_path = '/usr/sbin'
#arping_cmd = 'arping -U $_IP_$ -w 1 -I eth0' wd_monitoring_interfaces_list = ''
wd_lifecheck_method = 'heartbeat'
wd_interval = wd_heartbeat_port =
wd_heartbeat_keepalive =
wd_heartbeat_deadtime =
heartbeat_destination0 = '172.172.0.100' #从库IP
heartbeat_destination_port0 =
heartbeat_device0 = 'eth0' other_pgpool_hostname0 = '172.172.0.100' #从库IP
other_pgpool_port0 =
other_wd_port0 =

###创建failover.sh文件

cat >> /pgdata/pgpool/script/failover.sh << EOF
#!/bin/bash -x falling_node=$
old_primary=$
new_primary=$
pgdata=/pgdata/pgpool/data pghome=/usr/local/postgresql
log=/pgdata/pgpool/logfile/failover.log date >> $log
echo "failed_node_id=$falling_node new_primary=$new_primary" >> $log if [ $falling_node = $old_primary ]; then
if [ $UID -eq ]
then
su postgres -c "ssh -T postgres@$new_primary $pghome/bin/pg_ctl promote -D $pgdata"
else
ssh -T postgres@$new_primary $pghome/bin/pg_ctl promote -D $pgdata
fi
exit ;
fi;
exit ;
EOF chmod /pgdata/pgpool/script/failover.sh
chown -R postgres:postgres /pgdata/pgpool/script/failover.sh

###启动

pgpool -n -d -D -a /usr/local/pgpool/etc/pool_hba.conf -f /usr/local/pgpool/etc/pgpool.conf -F /usr/local/pgpool/etc/pcp.conf > /pgdata/pgpool/logfile/pgpool.log >& &

###停止

pgpool -m fast stop

###pgpool 状态查看

psql -h 10.200.22.114 -p  -U postgres pgpool
show pool_nodes;
show pool_processes; -- 查看 pgpool进程 信息
show pool_status; -- 查看pgpool 配置信息
show pool_pools; -- 查看 pgpool 连接池

###pcp 配置管理 pgpool

pcp_watchdog_info -h 10.1.20.114 -p  -U postgres -v  --查看 pgpool集群状态
pcp_node_count -h 10.1.20.114 -p -U postgres -v -- 查看节点数量
pcp_pool_status -h 10.1.20.114 -p -U postgres -v -- 查看pgpool集群配置
pcp_proc_count -h 10.1.20.114 -p -U postgres -v -- 查看pgpool processor进程信息

参考资料:

https://blog.csdn.net/yaoqiancuo3276/article/details/80983201
https://blog.csdn.net/kk185800961/article/details/78458999
https://blog.csdn.net/yanggd1987/article/details/51150190
https://my.oschina.net/Suregogo/blog/551626
https://my.oschina.net/Suregogo/blog/552765
https://www.jianshu.com/p/2d07339774c0
https://blog.csdn.net/hkyw000/article/details/51693683
https://www.cnblogs.com/yjf512/p/4499547.html

搭建双节点pg_pool+主从postgresql架构的更多相关文章

  1. 九、Swift对象存储服务(双节点搭建)

    九.Swift对象存储服务(双节点搭建) 要求:Controoler节点需要2块空盘 Compute节点需要再加2块空盘 本次搭建采用Controller 和 Compute双节点节点做swift组件 ...

  2. (导航页)OpenStack-M版-双节点手工搭建-附B站视频

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 本次搭建采用双节点,离线源搭建, 配置如下 本次搭建采用2台4核4G的虚拟机,也可以改为2核4G ...

  3. 3级搭建类301-Oracle 11g RAC 双节点搭建(11.2.0.4)非公

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  4. 【RAC】双节点RAC搭建

    本文主要是双节点的RAC进行搭建,根据黄伟老师的视频进行总结和使用. 搭建环境: 1.两台安装好Linux_x64系统的服务器 2.IP设置 注意:Priv-IP的IP是自己一个网段,而剩下的SCAN ...

  5. Linux获取本机公网IP,调整双节点主从服务的RPC调用逻辑

    简单记录一次双节点的之间的服务调用叭 ~ 现有: 服务A的双节点A1.A2 服务B的双节点B1.B2 服务A 和服务B 通过 Netty 实现 RPC 通信,可能会导致比较玄学的问题.如图: 要做到 ...

  6. [翻译]用 Puppet 搭建易管理的服务器基础架构(4)

    我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第四部分. 原文地址:http://blog.jobbole.com/89214/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿 ...

  7. 双节点(nginx+keepalived)为两台apache服务器提供负载均衡

    说明:本实验为双节点nginx为两台apache服务器提供负载均衡,本文不是做lvs,所以realserver不是配置在keepalived.conf而是在nginx的配置文件中upstream.此架 ...

  8. Kubernetes 概述和搭建(多节点)

    一.Kubernetes整体概述和架构 Kubernetes是什么 Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务.通过Kubernetes能够进行应用的自动化部署和扩缩 ...

  9. RocketMQ学习笔记(16)----RocketMQ搭建双主双从(异步复制)集群

    1. 修改RocketMQ默认启动端口 由于只有两台机器,部署双主双从需要四个节点,所以只能修改rocketmq的默认启动端口,从官网下载rocketmq的source文件,解压后使用idea打开,全 ...

随机推荐

  1. MySQL Transaction--MySQL与SQL Server在可重复读事务隔离级别上的差异

    MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异. 在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQ ...

  2. CSS Overrides: Friend or Foe?

    转自:http://www.callumhart.com/blog/css-overrides-friend-or-foe Anyone familiar with CSS will know how ...

  3. hermes kafka 转http rest api 的broker 工具

    hermes 与nakadi 是类似的工具,但是设计模型有很大的差异,hermes 使用的是webhook的模式(push) nakadi 使用的是pull(event stream),各有自己解决的 ...

  4. uname command

    The command uname helps us in development special in scripts, see help of the uname uname --help Usa ...

  5. 没有了CommonsChunkPlugin,咱拿什么来分包(译)

    webpack 4 移除 CommonsChunkPlugin,取而代之的是两个新的配置项(optimization.splitChunks 和 optimization.runtimeChunk). ...

  6. URL编码规则

    一.问题的由来 问题:当url地址中包含&.+.%等特殊字符(主要是传递参数时,参数的内容中包含这些字符)时,地址无效.比如http://10.190.0.0:108/doc/test+des ...

  7. 【MatConvNet代码解析】 一些理解

    1.DagNN对象的executionOrder属性 该属性是hidden属性,所以外部是访问不到的.只有dagnn.DagNN类和dagnn.Layer类可以访问到. 该属性的设置是在DagNN类的 ...

  8. Zookeeper 四字命令 Four Letter Words

    1.zk可以通过它自身提供的简写命令来服务器进行交互 需要使用到nc命令,安装yum install nc echo  [commond] | nc [ip] [port] 2.[stat]  查看z ...

  9. Linux crontab配置

    crontab配置 1.命令功能 通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本.时间间隔的单位可以是分钟.小时.日.月.周及以上的任意组合.这个 ...

  10. Styles in Windows Phone

    1. Use resources in internal style file: <Application.Resources> <ResourceDictionary Source ...