POSTGRESQL主备部署模式
一、预期目的
主数据库(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主备部署模式的更多相关文章
- HA主备路由模式的原理 + HA和负载均衡的区别
HA主备路由模式的原理 HA是High Availability缩写,即高可用性 ,可防止网络中由于单个防火墙的设备故障或网络故障导致网络中断,保证网络服务的连续性和安全强度.目前,ha功能已经 ...
- PostgreSQL主备流复制机制
原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...
- PostgreSQL主备切换
备库如何激活 在PostgreSQL(HOT-Standby)如主库出现异常.备库如何激活:来替换主库工作.有下列2种方式 备库在recovery.conf文件中有个配置项trigger_file.它 ...
- Jenkins 主备master-slave模式搭建
jenkins的版本是2.70,使用下来感觉是一个不错的版本,至于如何搭建jenkins,在此就不多说了,推荐的方法是先安装tomcat,然后再加jenkins.war放在tomcat的webapp路 ...
- mysql主备部署[高可用]
配置方案 master:192.168.99.61 service-id:61 slave:192.168.99.62 service-id:62同步账号:sync 同步密码:sync 主:192 ...
- mongodb在双活(主备)机房的部署方案和切换方案设计
1. 概述 现在很多高可用系统为了应对极端情况,比如主机宕机.网络故障以及机房宕机等灾难的发生,通常会部署主备架构(双机房),或者双活架构(双机房),甚至多活架构(三个机房或者以上),mongodb天 ...
- Mssql主备见证的弊端及主备模式主down掉怎么恢复
mssql主备见证有个没有解决的问题,mssql的主备是针对单个库的,有时候单个或多个库主备切换了,但是整个主数据库并没有挂掉,并且还运行着其他的库,程序检测到的数据库连接是正常的,只是部分库连接不了 ...
- mysql主备切换[高可用]
到这一步的时候, 是主备部署已经处理好, 请关注:mysql主备部署[高可用] 这次使用的是keepalived-1.2.22.tar.gz版, 官网地址:keeplived官网 笼统知识请自行查询百 ...
- Centos7.6部署k8s v1.16.4高可用集群(主备模式)
一.部署环境 主机列表: 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 master01 7.6. ...
随机推荐
- chartcontrol(统计坐标图形控件)
统计图形 把控件拖放到界面会弹出下图 图形共分八系列:Bar Series,Point and line Series,pie Series,Funnel Series,Area Series,Ra ...
- Codeforces 804D Expected diameter of a tree(树的直径 + 二分 + map查询)
题目链接 Expected diameter of a tree 题目意思就是给出一片森林, 若把任意两棵树合并(合并方法为在两个树上各自任选一点然后连一条新的边) 求这棵新的树的树的直径的期望长度. ...
- GRPC协议的相关原理
GRPC的Client与Server,均通过Netty Channel作为数据通信,序列化.反序列化则使用Protobuf,每个请求都将被封装成HTTP2的Stream,在整个生命周期中,客户端Cha ...
- go语言:函数参数传递详解
参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程.比较常见的参数传递有:值传递,按地址传递参数或者按数组传递参数. 1.常规传递 使用普 ...
- GO语言_用redis作为url队列的爬虫
// Copyright 2016 laosj Author @songtianyi. All Rights Reserved. // // Licensed under the Apache Lic ...
- 使用hexo搭建github个人博客网站
搭建步骤: 1>Mac或win电脑一台,本文以mac为例. 2>下载安装Git和Node 3>安装hexo 4>注册登录GitHub,创建一个仓库,库名格式为:GitHub用户 ...
- serialVersionUID的作用以及如何用idea自动生成实体类的serialVersionUID
转载:http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用: 通过判断实体类的serialVer ...
- https双向认证訪问管理后台,採用USBKEY进行系统訪问的身份鉴别,KEY的证书长度大于128位,使用USBKEY登录
近期项目需求,须要实现用USBKEY识别用户登录,採用https双向认证訪问管理后台管理界面,期间碰到过一些小问题,写出来给大家參考下. 1:前期准备工作 USBKEY 硬件:我买的是飞天诚信 epa ...
- Linux基础(2)- 用户、群组和权限
一.用户.群组和权限 1) 新建用户natasha,uid为1100,gid为555,备注信息为“master” 2) 修改natasha用户的家目录为/Natasha 3) 查看用户信息配置文 ...
- 「零秒思考」是个神话,不过这款笔记术你值得拥有zz
今天读完了赤羽雄二的<零秒思考>,作者是一位在麦肯锡公司工作了 14 年的资深顾问.依照作者的说法,「零秒思考」指的是: 瞬间便能认清现状, 瞬间便能整理问题, 瞬间便能考虑出解决办法, ...