今年以来,公司的产品开始采用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
PGP VIP: 192.168.200.200
软件和系统版本
Pgsql 版本: pgsql 9.3.2
Pgpool 版本: pgpool II 3.3.2
Linux 版本: CenterOS 5.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目录下:
#vi pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
host all all 127.0.0.1/32 trust
host all all 192.168.200.0/24 trust
#local replication postgres trust
#host replication postgres ::1/128 trust
host replication postgres 192.168.200.0/24 trust
(192.168.200.0/24 为双方所在网络的网段)
#vi postgresql.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/pgsql start
说明:
关闭pgsql的命令 /opt/bjca3/pgsql/bin/pgsql stop
强行关闭的命令 /opt/bjca3/pgsql/bin/pgsql stop -m fast
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'
(192.168.200.231为本机的ip)
wd_port = 9000
delegate_IP = '192.168.200.200'
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
(以上两项是虚拟ip及掩码设置)
wd_escalation_command = '/opt/bjca3/pgsql/bin/mast.sh'
wd_interval = 10
heartbeat_destination0 = '192.168.200.230'
other_pgpool_hostname0 = '192.168.200.230'
(以上两项是对方的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 -m fast stop
2.为了在关闭pgpool的过程中不发生主备切换,可以先关闭备机的pgpool之后在关闭主机的pgpool,关闭备机pgsql,最后关闭主机pgsql。
2.2 主备切换
经过以上几步的配置,主备之间能够同步数据了,但为了在主备之间建立一次同步状态,需要关闭主节点的pgsql做一次主备切换。具体步骤如下:
1.切换到主节点,关闭pgsql:/opt/bjca3/pgsql/bin/pgsql stop -m fast.
说明:当主节点的pgsql down掉后,主节点上的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
最后跟大家分享一位网友对集群的实现:http://blog.csdn.net/lengzijian/article/details/7704814