一、预期目的

主数据库(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. Codeforces 558E A Simple Task(权值线段树)

    题目链接  A Simple Task 题意  给出一个小写字母序列和若干操作.每个操作为对给定区间进行升序排序或降序排序. 考虑权值线段树. 建立26棵权值线段树.每次操作的时候先把26棵线段树上的 ...

  2. ros pub sub ("~")

    base_velocity_smoother.cpp                        remap ("~")    订阅: "cmd_vel"   ...

  3. Java开发者使用C++写程序踩的坑

    笔者是一个很矛盾的人.平时用Java.但是一开始学习的时候学的是汇编语言,而且对C语言也很熟悉.为什么不学C++呢?是因为我可以完全用Java的编码规范去写C++.因此我不需要了解更多的诸如C++的命 ...

  4. 继承LIst 的类JSON序列化,无法序列化属性的问题

    /// <summary> /// Paged list /// </summary> /// <typeparam name="T">T< ...

  5. 简单了解HTML5中的Web Notification桌面通知

    原文:http://www.zhangxinxu.com/wordpress/2016/07/know-html5-web-notification/ 需要注意的是,消息通知只有通过Web服务访问该页 ...

  6. Android---简单的动画

  7. Access自定义函数(人民币大写)

    人民币大写函数:整数不超过13位. Public Function 人民币大写(A) As String Dim aa As String Dim bb As String Dim cc As Str ...

  8. Android GC 原理探究

    导语 想写一篇关于 android GC 的想法来源于追查一个魅族手机图片滑动卡顿问题,由于不断的 GC 导致的丢帧卡顿的问题让我们想了很多方案去解决,所以就打算详细的看看内存分配和 GC 的原理,为 ...

  9. 百科知识 DMG文件如何打开

    1 DMG格式是在MAC系统上的一个镜象文件,也可以说是压缩文件,如果你是使用苹果机或在PC上装了MAC OS X for X86,在MAC系统上双击这个文件就可以解开了:现在在Windows平台,我 ...

  10. iOS开发 — (UINaVigationController)导航控制器,界面传值

    UINavigationController 继承于 UIViewController , 以栈的方式管理所 控制的视图控制器 . 至少要有一个被管理的视图控制器 ,这个控制器我们称作导航控制器的根视 ...