一、预期目的

主数据库(Primary pg ,假定主机名为A,后文不再赘述)和备用数据库(Standby pg,假定主机名为B,后文不再赘述)之间的数据能够相互备份。

主数据库发生故障时备用数据库可以接管工作,变为主数据库。旧的主数据库恢复后,能变为新的主数据库的备用数据库。

主数据库有写入、读取功能,备数据库只有读取功能。

二、使用的软件

Pgpool-II

Postgresql 9.2

使用的特性:

posgresql的streaming replication 功能

pgpool-II的master/slave和online recovery

三、部署结构图

四、部署环境

在centos、suse环境下

服务器有几个系统配置需要修改:文件句柄数和最大用户进程数

1.    修改最大用户进程数

vi /etc/security/limits.conf  添加

*          soft     nproc          65535

*          hard     nproc          65535

*          soft     nofile         65535

*          hard     nofile         65535

and  vi  /etc/security/limits.d/90-nproc.conf 添加

*          soft     nproc          65535

*          hard     nproc          65535

*          soft     nofile         65535

*          hard     nofile         65535

2.    修改文件句柄数

vi  /etc/sysctl.conf   添加

fs.file-max = 65536

3.    验证:

ulimit -a  命令可得结果

五、部署步骤

4.    创建postgres用户

最好手动创建postgres用户,如果已经存在请先删除,语句如下:

userdel -r postgres    //删除postgres用户及其对应的主目录

useradd -d /home/postgres  -m -g root postgres   //创建用户postgres,-d指定主目录为/solr/postgres,-m如果目录不存在则创建该目录,-g指定用户组为root。

5.    修改postgres用户密码

passwd postgres  //修改postgres用户密码,需要在root用户下执行。连续输入两次密码postgres,postgres。

6.    关闭所有机器的防火墙

在centos下:

chkconfig iptables off

service iptables stop

在suse下:

sudo SuSEfirewall2 stop

7.    ssh无密钥登录postgres用户

在所有需要安装pg数据库的主机之间以及主机自己跟自己之间,要求相互能够无密钥登录。

在进行下面操作前,请确保主机这间通过ip及主机名能够相否ping通。

1)   登录主机A,进入postgres用户

su postgres

执行以下命令生成密钥对

ssh-keygen -t dsa

在整个过程中只需点击Enter建

 

2)   登录主机B,进入postgres用户

su postgres

执行以下命令生成密钥对

ssh-keygen -t dsa

 

在整个过程中只需点击Enter建

3)   登录主机A

su postgres

将密钥对的公钥加入相应主机

cat  ~/.ssh/id_dsa.pub  |  ssh postgres@A  'cat - >> ~/.ssh/authorized_keys'

在提示输入密码后,就能在主机A的postgres用户下无密钥登录到主机A的postgres用户了。测试命令为:

ssh  A

cat  ~/.ssh/id_dsa.pub  |  ssh postgres@B  'cat - >> ~/.ssh/authorized_keys'

在提示输入密码后,就能在主机A的postgres用户下无密钥登录到主机B的postgres用户了。测试命令为:

ssh  B

 

4)   登录主机B

su postgres

将密钥对的公钥加入相应主机

cat  ~/.ssh/id_dsa.pub  |  ssh postgres@A  'cat - >> ~/.ssh/authorized_keys'

在提示输入密码后,就能在主机B的postgres用户下无密钥登录到主机A的postgres用户了。测试命令为:

ssh  A

 

cat  ~/.ssh/id_dsa.pub  |  ssh postgres@B  'cat - >> ~/.ssh/authorized_keys'

在提示输入密码后,就能在主机B的postgres用户下无密钥登录到主机B的postgres用户了。测试命令为:

ssh  B

8.    安装C++ 编译包

如果c++的编译包没有安装,需要安装,已经安装可以跳过。

将目录gcc及其下的文件copy到需要安装gcc的主机上,如在/home/pcc下面。

cd  /home/gcc  //切换到gcc目录下

chmod  +x  *.rpm  //修改所有rpm为可执行权限

以下命令为安装gcc的包:

rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm

rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm

rpm -ivh cpp-4.4.6-4.el6.x86_64.rpm --force --nodeps

rpm -ivh  kernel-headers-2.6.32-279.el6.x86_64.rpm

rpm -ivh glibc-headers-2.12-1.80.el6.x86_64.rpm --force --nodeps

rpm -ivh glibc-devel-2.12-1.80.el6.x86_64.rpm  --force --nodeps

rpm -ivh libgomp-4.4.6-4.el6.x86_64.rpm

rpm -ivh nscd-2.12-1.80.el6.x86_64.rpm --force --nodeps

rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm

rpm -ivh gcc-4.4.6-4.el6.x86_64.rpm  --force --nodeps

rpm -ivh libstdc++-devel-4.4.6-4.el6.x86_64.rpm --force --nodeps

rpm -ivh gcc-c++-4.4.6-4.el6.x86_64.rpm --force --nodeps

9.    安装postgresql数据库

主数据库节点及备用数据库节点均需安装,确保不同机器上指定的安装路径相同,建议不要安装在系统盘。

将postgresql-9.2.4-1-linux-x64.run放到待安装数据库的主机任意目录下。

chmod  +x postgresql-9.2.4-1-linux-x64.run //修改权限为可执行

./postgresql-9.2.4-1-linux-x64.run    //开始安装

在安装的过程中,需要指定安装路径,此处例子为/opt/PostgreSQL/9.2;还需要指定超级用户的密码,请指定为postgres;需要选定数据库编码,请选择UTF-8 CN 。

安装完成后需要将数据库的执行目录加入系统环境变量PATH中:

vi /etc/profile

在文件的开始处加入

export  PATH=/opt/PostgreSQL/9.2/bin:$PATH

退出vi,刷新配置文件

source /etc/profile

1)   修改pg_hba.conf文件内容

在/opt/PostgreSQL/9.2/data/pg_hba.conf里面

pool_hba.conf 10.196.0.0可能需要根据你的网络环境修改。

注意除上面两行外,还需要加入下面两行,stream replication要求必须为伪数据库replication配置连接权限。

2)   重启数据库

su postgres //到postgres用户下

pg_ctl   -D  /opt/PostgreSQL/9.2/data restart

10.         安装pgpool-II

将pgpool-II-3.2.6.tar.gz放置到要安装的机器上(主备主机上都要安)的目录下。

在root用户下操作

tar zxvf pgpool-II-3.3.1.tar.gz   //解压pgpool-II-3.2.6.tar.gz到当前目录

cd pgpool-II-3.3.1 //进入解压的pgpool目录

./configure  --with-pgsql=/opt/PostgreSQL/9.2  //配置pgpool编译环境,/opt/PostgreSQL/9.2为上步安装的pg数据库的路径。

make   //编译

make install  //安装

刷新共享库文件

sudo ldconfig -v

 

然后,安装pgpool-II的pg数据库c语言函数

在root用户下操作

cd  pgpool-II-3.3.1/sql/pgpool-regclass/  //到解压出的pgpool-II下的pgpool-regclass目录下

make install //编译安装

 

cd pgpool-II-3.3.1/sql/pgpool-recovery/  //到解压出的pgpool-II下的pgpool-recovery目录下

make install  //编译安装

su postgres //到postgres用户下,以下.sql文件的路径根据安装环境相应的调整

psql -f  /home/pgpool-II-3.3.1/sql/pgpool-regclass/pgpool-regclass.sql template1

psql -f  /home/pgpool-II-3.3.1/sql/pgpool-regclass/pgpool-regclass.sql postgres

 

psql -f  /home/pgpool-II-3.3.1/sql/pgpool-recovery/pgpool-recovery.sql template1 

psql -f  /home/pgpool-II-3.3.1/sql/pgpool-recovery/pgpool-recovery.sql postgres

/home/kmstool/postgresql/pgpool-II-3.3.1/sql -f /home/kmstool/postgresql/pgpool-II-3.3.1/sql/pgpool-regclass/pgpool-regclass.sql template1

11.         配置postgresql数据库

以下1至4步需在主、备数据库上都执行

1)   创建目录

mkdir  /opt/PostgreSQL/9.2/archive

修改所属用户

chown  postgres:postgres /opt/PostgreSQL/9.2/archive

2)   修改postgresql.conf文件内容

在/opt/PostgreSQL/9.2/data/postgresql.conf里面,修改

wal_level = hot_standby # minimal, archive, or hot_standby

archive_mode = on

max_wal_senders = 5

hot_standby = on

archive_command = 'cp  -i  "%p"  /opt/PostgreSQL/9.2/archive/"%f"  </dev/null'

//此处路径/opt/PostgreSQL/9.2/archive为上面创建的路径

修改链接数大小:max_connections=5000; 

3)   加入并修改recovery.done

将config目录下的recovery.done文件,copy到A主机的/opt/PostgreSQL/9.2/data目录下,

修改其中的host=10.196.142.226为主机B的IP。

将config目录下的recovery.done文件,copy到B主机的/opt/PostgreSQL/9.2/data目录下,

修改其中的host=10.196.142.226为主机A的IP。

并根据安装路径修改其中的restore_command值的路径。

修改文件的权限

chown postgres:postgres /opt/PostgreSQL/9.2/data/recovery.done

 

4)   添加并修改basebackup.sh

将config目录下的basebackup.sh文件,copy到/opt/PostgreSQL/9.2/data/下,并

chmod 777 /opt/PostgreSQL/9.2/data/basebackup.sh //修改为可执行权限

注意根据你的数据库安装路径修改文件里面opt/PostgreSQL/9.2/,共有3处。

 

12.         配置pgpool-II

以下配置需在主、备数据库上都执行

 

1)   添加故障转移脚本文件

将config目录下的failover_stream.sh文件,copy到/opt/PostgreSQL/9.2/bin/下,并

chmod 777 /opt/PostgreSQL/9.2/bin/failover_stream.sh //修改为可执行权限

2)   添加并修改远程启动脚本文件

将config目录下的pgpool_remote_start文件,copy到/opt/PostgreSQL/9.2/data/下,并

chmod 777 /opt/PostgreSQL/9.2/data/pgpool_remote_start //修改执行权限

注意根据你的数据库安装路径修改文件中的/opt/PostgreSQL/9.2/bin/pg_ctl。

3)   修改pgpool-II配置

将config目录下的pcp.conf文件,copy到usr/local/etc/下,并

chmod 777  /usr/local/etc/pcp.conf  //修改权限

将config目录下的pgpool.conf文件,copy到usr/local/etc/下,并

chmod 777  /usr/local/etc/pgpool.conf  //修改权限

根据部署情况修改pgpool.conf文件内容:

此处A、B分别为主备数据库主机名

backend_hostname0 = 'A'

backend_port0 = 5432

backend_weight0 = 1

backend_data_directory0 = '/opt/PostgreSQL/9.2/data'

backend_hostname1 = 'B'

backend_port1 = 5432

backend_weight1 = 100

backend_data_directory1 = '/opt/PostgreSQL/9.2/data'

failover_command = '/opt/PostgreSQL/9.2/bin/failover_stream.sh  %d  %H  /tmp/trigger_file'

//需要根据安装情况修改

4)   创建目录

mkdir  /var/run/pgpool

chown  postgres:root  /var/run/pgpool/

 

13.         启动数据库

以下操作顺序很重要,请一定遵循。

1)   先将主、备数据库都关闭

su postgres  //到postgres用户下

pg_ctl   -D  /opt/PostgreSQL/9.2/data  stop

2)   启动主数据库

在主数据库主机上

su postgres  //到postgres用户下

pg_ctl   -D  /opt/PostgreSQL/9.2/data  start

3)   启动备数据库

先,在主数据库主机上

su  postgres

sh  /opt/PostgreSQL/9.2/data/basebackup.sh  /opt/PostgreSQL/9.2/data  B  /opt/PostgreSQL/9.2/data

//   B为备数据库的主机名

再,在备数据库主机上启动数据库

su postgres  //到postgres用户下

pg_ctl   -D  /opt/PostgreSQL/9.2/data  start

4)   启动成功的验证

在主数据库主机上,执行

ps -ef | grep sender

预期结果

在备数据库主机上,执行

ps -ef | grep receiver

预期结果

14.         启动pgpool-II

启动单机pgpool

现在只需要启动一个pgpool-II,在主数据库主机上启动。结合HA的虚拟IP,可以启动两个pgpool-II,如果你选择有HA的pogool请直接跳到第六节。

touch  /home/pgpool.log

chmod 777  /home/pgpool.log //改变权限

su  postgres //到postgres用户

pgpool -n -d > /home/pgpool.log 2>&1 &

现在,直接可以通过pgadmin工具去连接pppool-II的9999端口数据库。能够写入和查询。

在关掉主数据库(必须kill不能stop)后,仍然能访问pppool-II的9999端口。

通过命令可重启原来的主数据库,此时它变为新主数据库的备用数据库。

pcp_recovery_node  -d  5  A  9898 postgres postgres  0

//A为启动的pgpool-II的主机名

此时如果B数据库死掉,不能自动将A切换为主数据库,为了解决该问题以及pgpool的单点故障,请参考六节的配置。

六、pgpool的HA

1.    修改pgpool的配置

修改主、备数据库主机上的pgpool.conf文件的配置:

use_watchdog = on

delegate_IP = '10.196.142.230'      # 配置一个虚拟IP,务必确保此IP没有被人使用

wd_hostname = 'A'                # 在A主机上配置A,在B主机上配置B

ifconfig_path = '/home/apache/sbin'   # ifconfig command path

arping_path = '/home/apache/sbin'    # arping command path

wd_interval = 3

other_pgpool_hostname0 = 'B'       #在A主机上配置B,在B主机上配置A

other_pgpool_port0 = 9999

other_wd_port0 = 9000

heartbeat_destination0 = 'B'         #在A主机上配置B,在B主机上配置A

修改完成上面的配置文件后,分别在主、备数据库的root用户下做下面的操作

mkdir -p /home/apache/sbin

chown postgres:postgres /home/apache/sbin

chmod 700 /home/apache/sbin

cp /sbin/ifconfig /home/apache/sbin

cp /usr/sbin/arping /home/apache/sbin

chmod 4755 /home/apache/sbin/ifconfig

chmod 4755 /home/apache/sbin/arping

修改主数据库的配置文件failover_stream.sh中的$failed_node = 1 为$failed_node = 0,备数据不需要修改。

在此配置文件中,有一个与网络有关的配置可能需要修改,

先用ifconfig命令查看

注意此处的网络设置使用的是bond1,默认一般使用eth0,如果使用的事bond1,那么在配置中需要需改为bond1,如下图

2.    启动有HA的pgpool

在主、备数据库主机上分别:

touch /home/pgpool.log

chmod 777 /home/pgpool.log //改变权限

su  postgres //到postgres用户

pgpool -n -d > /home/pgpool.log 2>&1 &

此时A数据库为主数据库,B数据库为备数据库,虚拟IP在A机上。可通过gpadmin工具来连接虚拟IP的9999端口,跟普通的5432的操作一样

 

3.    验证效果

1)   关掉主机A

如上设置后,将A机关掉,B机自动接管,并且B机会开启动虚拟IP,达到popool的HA。仍可通过gpadmin工具来连接虚拟IP的9999端口,跟普通的5432的操作一样。

此时B机会启动虚拟IP,并将B机设置为主数据库。

需要重新启动A机为备数据库,过程如下:

接着要将A机重新开机,这时postgres会自动开启,需要先将其先关掉,

在A机上

su  postgres

pg_ctl -D /opt/PostgreSQL/9.2/data stop

在B机上执行

su postgres

pcp_recovery_node  -d  5  B  9898 postgres postgres  0

会重新将A机与B机的数据库同步并重启A机的pg数据库。

在A机上重启pgpool

su postgres

pgpool -n -d > /home/pgpool.log 2>&1 &

 

在B机pgpool上刷新A机pg的状态

su postgres

pcp_attach_node  -d  5  B  9898 postgres postgres 0

 

此时B数据库为主数据库,A数据库为备数据库,虚拟IP在B机上。

 

2)   关掉主机B

将B机关掉,A机自动接管,并且A机会开启动虚拟IP,达到popool的HA。仍可通过gpadmin工具来连接虚拟IP的9999端口,跟普通的5432的操作一样。

此时A机会启动虚拟IP,并将A机设置为主数据库。

需要重新启动B机为备数据库,过程如下:

接着要将B机重新开机,这时postgres会自动开启,需要先将其先关掉,

在B机上

su  postgres

pg_ctl -D /opt/PostgreSQL/9.2/data stop

在A机上执行

su postgres

pcp_recovery_node  -d  5  A  9898 postgres postgres  1

会重新将B机与A机的数据库同步并重启B机的pg数据库。

在B机上重启pgpool

su postgres

pgpool -n -d > /home/pgpool.log 2>&1 &

 

在A机pgpool上刷新B机pg的状态

su postgres

pcp_attach_node  -d  5  A  9898 postgres postgres  1

 

此时A数据库为主数据库,B数据库为备数据库,虚拟IP在A机上。回到原来的位置。

POSTGRESQL主备部署模式的更多相关文章

  1. HA主备路由模式的原理 + HA和负载均衡的区别

       HA主备路由模式的原理 HA是High Availability缩写,即高可用性 ,可防止网络中由于单个防火墙的设备故障或网络故障导致网络中断,保证网络服务的连续性和安全强度.目前,ha功能已经 ...

  2. PostgreSQL主备流复制机制

    原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...

  3. PostgreSQL主备切换

    备库如何激活 在PostgreSQL(HOT-Standby)如主库出现异常.备库如何激活:来替换主库工作.有下列2种方式 备库在recovery.conf文件中有个配置项trigger_file.它 ...

  4. Jenkins 主备master-slave模式搭建

    jenkins的版本是2.70,使用下来感觉是一个不错的版本,至于如何搭建jenkins,在此就不多说了,推荐的方法是先安装tomcat,然后再加jenkins.war放在tomcat的webapp路 ...

  5. mysql主备部署[高可用]

    配置方案 master:192.168.99.61 service-id:61 slave:192.168.99.62 service-id:62同步账号:sync   同步密码:sync 主:192 ...

  6. mongodb在双活(主备)机房的部署方案和切换方案设计

    1. 概述 现在很多高可用系统为了应对极端情况,比如主机宕机.网络故障以及机房宕机等灾难的发生,通常会部署主备架构(双机房),或者双活架构(双机房),甚至多活架构(三个机房或者以上),mongodb天 ...

  7. Mssql主备见证的弊端及主备模式主down掉怎么恢复

    mssql主备见证有个没有解决的问题,mssql的主备是针对单个库的,有时候单个或多个库主备切换了,但是整个主数据库并没有挂掉,并且还运行着其他的库,程序检测到的数据库连接是正常的,只是部分库连接不了 ...

  8. mysql主备切换[高可用]

    到这一步的时候, 是主备部署已经处理好, 请关注:mysql主备部署[高可用] 这次使用的是keepalived-1.2.22.tar.gz版, 官网地址:keeplived官网 笼统知识请自行查询百 ...

  9. Centos7.6部署k8s v1.16.4高可用集群(主备模式)

    一.部署环境 主机列表: 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 master01 7.6. ...

随机推荐

  1. python笔记2:函数

    5. 函数 Python函数代码块以 def 关键词开头; 函数内容以冒号起始,并且缩进. *注: python中,strings, tuples, 和 numbers 是不可更改的对象,而 list ...

  2. Django中使用表单

    使用表单 表单用 user 提交数据,是网站中比较重要的一个内容 GET 和 POST 方法 GET 和 POST 的区别 URL,全称是"统一资源定位符".用于对应互联网上的每一 ...

  3. windows命令行更改IP地址

    修改IP地址时,提示出现一个意外情况 netsh interface ip set address "以太网" static 192.168.3.151 255.255.255.0 ...

  4. Nginx+keepalived双机热备(主从模式)

    简单介绍: Keepalived是Linux下面实现VRRP备份路由的高可靠性运行软件,能够真正做到 主服务器和备份服务器故障时IP瞬间无缝交接; Keepalived的目的是模拟路由器的高可用; H ...

  5. iOS -- 设置label的自适应

    - (void)AutoLabel { //准备工作 self.font = [UIFont systemFontOfSize:]; self.textColor = [UIColor whiteCo ...

  6. 深入理解Activity启动流程(二)–Activity启动相关类的类图

    本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 在介绍Activity的详细启动流程之前,先 ...

  7. tensorflow搭建神经网络基本流程

    定义添加神经层的函数 1.训练的数据2.定义节点准备接收数据3.定义神经层:隐藏层和预测层4.定义 loss 表达式5.选择 optimizer 使 loss 达到最小 然后对所有变量进行初始化,通过 ...

  8. repeated-substring-pattern

    https://leetcode.com/problems/repeated-substring-pattern/ 下面这个方法,开始我觉得挺好.可惜还是超时了.后来我就加了一个剪枝策略,只有长度能够 ...

  9. intent 支持的action 动作

    String ACTION_AIRPLANE_MODE_CHANGED Broadcast Action: The user has switched the phone into or out of ...

  10. C#中如何让ListView控件点击选中整行

    将Listview控件的FullRowSelect属性置为True,当然Listview的View属性应该是Details. 2017年6月25日17:15:55