今年以来,公司的产品开始采用postgresql开源数据库,为了使数据库服务具有高可用性,利用postgresql自带的流复制功能,来实现了双机热备,做到无缝隙无人工参与的主备循环N次切换的高可用。下面选取两个具有代表性的实施项目跟大家分享下,如有问题,欢迎交流。
一.部署说明
1.1实施环境
本文档实验环境如下:
PGsql主机:192.168.200.231
PGsql备机:192.168.200.230
PGPool主机:192.168.200.231
PGPool备机:192.168.200.230
PGPVIP:192.168.200.200
软件和系统版本
Pgpool版本:pgpoolII3.3.2
Linux版本:CenterOS5.8
1.2文档说明
在CA服务中默认情况下数据库pgsql采用的单机环境,本文档详细说明了在单机环境下进行双机扩展,使pgsql数据库具备双机热备流复制功能。
二.实施目的
在图一所示的网络拓扑图上,主机Master和备机Slave运行pgsql,主机处于读写状态,备机处于只读状态,备机数据和主机保持数据同步状态。当主机down了,pgpoll自动把备机切换为主机,等主机恢复后,手动执行脚本切换为备机(注:这一步无需重做数据,否则后期数据量会比较大;与此同时,在将down掉的原主机执行脚本切为当前主机的备机时,有可能跟当前主机的数据量相差数百M或G的数据)。
(图一:利用pgpool实现pgsql热备的拓扑图)
上面PGPool也分主备状态,通过VIP方式提供对外pgsql的访问,当主机down了,VIP就漂移到备机上,继续提供pgsql的访问,对外的IP地址等都没有改变。
附:down机的情况包括有:断电、断网、kill 数据库进程以及重启等;
三.配置步骤
在配置pgsql之前,首先要设置两台服务器使得postgres用户可以无密码相互访问,配置过程见附一。
1.pgsql设置
1.1配置文件
切换到主机下,数据库的配置主要涉及到pg_hba.conf,postgresql.conf两个配置文件,配置文件都已经配置过,现场实施人员对照着在检查一遍同时将涉及到的IP地址修改为现场的ip,进入/opt/bjca3/pgsql/data目录下:
#vipg_hba.conf
#TYPEDATABASEUSERADDRESSMETHOD
localallalltrust
hostallall127.0.0.1/32trust
hostallall192.168.200.0/24trust
#localreplicationpostgrestrust
#hostreplicationpostgres::1/128trust
hostreplicationpostgres1trust
(为双方所在网络的网段)
#vipostgresql.conf
listen_addresses='*'
port=5432
(postgresql服务的端口,建议采用默认值5432)
max_connections=100
shared_buffers=1280MB
wal_level=hot_standby
fsync=on
full_page_writes=on
checkpoint_segments=32
archive_mode=on
archive_command='cp%p/opt/bjca3/pgsql/archive/%f'
max_wal_senders=2
wal_keep_segments=250
hot_standby=on
max_standby_archive_delay=300s
max_standby_streaming_delay=300s
wal_receiver_status_interval=10s
hot_standby_Feedback=on
log_line_prefix='[%t]'
启动主机postgresql:/opt/bjca3/pgsql/bin/pgsqlstart
说明:
关闭pgsql的命令/opt/bjca3/pgsql/bin/pgsqlstop
强行关闭的命令/opt/bjca3/pgsql/bin/pgsqlstop-mfast
1.2环境配置
在主机和备机中,分别进入/opt/bjca3/pgsql/目录下,根据现场实际环境对配置文件envvars参数值进行修改,具体如下:
(配置文件涉及到产品参数,此处省略配置)
其中:
PGHOME:pgsql的安装路径
POOLHOME:pgpool的安装路径
REMOTE_IP:对方服务器的ip
LOCAL_IP:本机的ip
VIRTUAL_IP:虚拟ip
Log:log日志的路径
主机和备机的配置文件envvars设置完成后,切换到备机,在确保主机pgsql开启的状态下执行流复制脚本/opt/bjca3/pgsql/bin/basebackup-stream.sh,脚本成功执行时在data目录下会产生logfile文件进行查看。
2.pgpool设置
启动pgpool前,核实下配置文件/opt/bjca3/pgpool/etc/pgpool.conf中的如下几个关键项,该配置取自主机192.168.200.231(备机为192.168.200.230)。
listen_addresses='*'
port=9999
(pgpool的服务端口,默认值9999)
backend_hostname0='192.168.200.231'
192.168.200.231为本机的ip)
backend_port0=5432
backend_weight0=1
backend_data_directory0='/opt/bjca3/pgsql/data'
backend_flag0='ALLOW_TO_FAILOVER'
(如果是备机的话,该值为DISALLOW_TO_FAILOVER)
health_check_period=1
failover_command='/opt/bjca3/pgsql/bin/failover.sh'
use_watchdog=on
wd_hostname='192.168.200.231为本机的ip)
wd_port=9000
delegate_IP='192.168.200.200'
if_up_cmd='ifconfigeth0:0inet$_IP_$netmask255.255.255.0'
(以上两项是虚拟ip及掩码设置)
wd_escalation_command='/opt/bjca3/pgsql/bin/mast.sh'
wd_interval=10
heartbeat_destination0='192.168.200.230other_pgpool_hostname0='192.168.(以上两项是对方的ip)
other_pgpool_port0=9999
other_wd_port0=9000
heartbeat_device0='eth0'
2.1启动
先启动主节点后启动备机节点(注意启动顺序):/opt/bjca3/pgpool/bin/pgpool
在主节点上利用ifconfig命令会发现多了虚拟ip(192.168.200.200)的信息,至此,主备机上的pgsql和pgpool全部启动。
说明:
1.pgpool的关闭方法/opt/bjca3/pgpool/bin/pgpool-mfaststop
2.为了在关闭pgpool的过程中不发生主备切换,可以先关闭备机的pgpool之后在关闭主机的pgpool,关闭备机pgsql,最后关闭主机pgsql。
2.2主备切换
经过以上几步的配置,主备之间能够同步数据了,但为了在主备之间建立一次同步状态,需要关闭主节点的pgsql做一次主备切换。具体步骤如下:
1.切换到主节点,关闭pgsql:/opt/bjca3/pgsql/bin/pgsqlstop-mfast.
说明:当主节点的pgsqldown掉后,主节点上的pgpool能够检测到这一事件,之后会重启本机,同时备机上的pgpool检测到后会将备机提升为主。这一切换过程大约需要一分半时间(切换时间取决于关机的时间),检测备机是否切换成功的方法:切换到原备机上执行ifconfig查看是否有虚拟ip出现。
2.待本机(原先的主机)重启后,执行/opt/bjca3/pgsql/bin/hot_standby.sh脚本;
说明:该脚本会将原先down掉的主机成为当前主机的备机并与之同步数据,脚本成功执行时会同时启动pgsql和pgpoo。
至此,整个热备过程建立。
四.XXXXXX
产品部分,此处省略若干字。
五.Pgpool-II自动切换
这一部分的内容是在实际的生产运维环境中,如果主节点down掉了并已经修复需要恢复为当前主机的备机时需要做的操作。
1.切换到当前的备机(原先的主机)执行/opt/bjca3/pgsql/bin/hot_standby.sh脚本即可。该脚本会将原先down掉的主机成为当前主机的备机并与之同步数据,脚本可能需要花费数分钟的时间;
2.脚本运行完毕后即可
上面的项目是一个比较典型的Postgresql热备部署,下面在跟大家分享另一个比较典型的案例:
(Postgresql一主两从架构图)
关于这个项目的具体细节详见:http://download.csdn.net/detail/sszgg2006/8276445