复制方式           优点                                                                 缺点
————————————————————————————————————————————————————————————————————————————————————
同步 数据一致性高                                            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. Java解析property文件(和静哥说的,SQL执行限定时间写在xml中,增加扩展,在不改源代码基础上)

    在Java项目中一些配置参数保存在Property文件中,这样能保证不修改原代码直接修改Property文件. 简单的很,就是在java文件中读取外界的properyt配置文件 PropertyPar ...

  2. shell入门(二)——面试题实例

    [~/shell]$ cat one.sh #!/bin/bash path=/root/shell/test.txt if [ ! -f $path ] //检测文件是否存在,如果不存在,把内容改为 ...

  3. TECH books

    文章目录 TECH books linux vxworks bat c gdb c++ vbscript make java bash perl web uml software-misc cpu e ...

  4. MySQL Network--Localhost与127.0.0.1的差异

    localhost为本地服务器,而127.0.01为本机地址.在使用localhost时不经过网卡传输,不受网络防火墙和网卡相关的限制,访问localhost不会被解析成ip地址,不会占用网卡和网络资 ...

  5. LoadRunner 压测场景制定以及报告分析

    这里,我们利用 LoadRunner 来制定场景,且以测试 tps 值为导向,主要介绍手工场景 单服务器的业务请求处理能力 tps 值在 10~200 是合理的:如果是访问单接口不走关系型数据库的,访 ...

  6. SELECT 语句语法

    SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_R ...

  7. roadhog 知识点

    roadhog 是一个 cli 工具,提供 server. build 和 test 三个命令,分别用于本地调试和构建,并且提供了特别易用的 mock 功能.命令行体验和 create-react-a ...

  8. 大数据离线分析平台 JavaSDK数据收集引擎编写

    JavaSDK设计规则 JavaSDK提供两个事件触发方法,分别为onChargeSuccess和onChargeRefund.我们在java sdk中通过一个单独的线程来发送线程数据,这样可以减少对 ...

  9. Hadoop "Cannot create directory .Name node is in safe mode."解决方案

    转载自:http://www.waitig.com/hadoop-name-node-is-in-safe-mode.html 在使用Hadoop建立文件的时候,出现“Cannot create di ...

  10. 深入理解java虚拟机读后总结(个人总结记录)

    1.jvm布局:   jdk1.6版本JVM布局分为:heap(堆),method(方法区),stack(虚拟机栈),native stack(本地方法栈),程序计数器共五大区域. 其中方法区包含运行 ...