作者:empty 出版社:empty |
第1章前言
由于“棱镜门”事件后,国家对于信息安全的需求再度攀升,并上升到国家战略高度。目前国内在线事务处理系统数据库大部分采用Oracle,机器采用小型机,存储采用统一存储,这些关键的设备技术都掌握在国外几个大公司中,无论基于安全以及成本考虑,国内的部分厂商都在考虑去”IOE”。国内最大的网络电商淘宝去IOE已经成功,这无疑更刺激了国内一些公司。作为后续技术储备,这里采用开源的postgresql数据库代替传统的oracle进行一些技术方案的验证,寻找后续去IOE过程的有效替代方案。
第2章背景
本次测试以营销真实数据为基础,从功能、性能、安全性、高可用性、可靠性、可维护性几个方面进行测试验证。
第3章Poc结论
§3.1高可用性
是通过复制技术,来实现双机或多机数据库之间的数据一致性,从而支持高可用性。当一台主机出现故障时,另一主机可立即接管,实现业务的不间断服务。
因此,从高可用性的角度讲,postgresql和其它别的数据库产品没有区别,能满足要求。
§3.2安全性
§3.3可靠性
§3.4性能
在小数据量,低并发量的场景下,Postgresql 数据库并不逊色于Oracle。在复杂SQL语句的处理方面,Postgresql确实没有Oracle 强大;统计函数在Postgresql里面效率要低一些。
§3.5功能
§3.6可维护性
第4章测试用例说明
§4.1高可用性测试
§4.1.1高可用性(流复制模式)
主要验证PG9.3+pgpool-II--之HA (Hot-Standby+Streaming Replication)
以下验证略去了pg9.3以及pgpool-II的安装以及初始配置。
§4.1.1.1结构
§4.1.1.2配置
上面结构不言自明,那接下来怎么配呢?先说机器配置,建议你都先创建好这些目录:
1./var/lib/pgsql/9.3/data6432 目录是master数据库的目录,端口为6432
2./var/lib/pgsql/9.3/data7432 目录是一台standy数据库的目录,端口为7432
3./var/lib/pgsql/9.3/data 目录是pgpool-II使用的SystemDB数据库的目录,端口为5432
4./etc/pgpool- II-3.2/ 是pgpool-II运行时放pid的目录
5./tmp/trigger 是主从切换时放trigger文件的目录
§4.1.1.3初始化数据库
1.initdb -D /var/lib/pgsql/9.3/data6432
2.initdb -D /var/lib/pgsql/9.3/data7432
3.打开postgresql.conf修改端口
§4.1.1.4安装函数
进入安装目录/usr/pgsql-9.3/share/extension
psql -f pgpool-recovery.sql postgres --port=6432
psql -f pgpool-regclass.sql postgres --port=6432
psql -f pgpool-recovery.sql postgres --port=7432
psql -f pgpool-regclass.sql postgres --port=7432
§4.1.1.5配置HA
首先是配置master和standby,二者的postgresql.conf一样一样滴:
wal_level = hot_standby
max_wal_senders = 1
hot_standby = on
二者pg_hba.conf也一样(若更复杂的请自行设置):
#host replication postgres ::1/128 trust
local replication postgres trust
在master的data目录下放上面介绍的文件basebackup.sh和这个让master远程启动standby的pgpool_remote_start.sh文件。
接着修改/usr/local/etc/pgpool.conf:
listen_addresses = '*'
backend_hostname0 = 'localhost'
backend_port0 = 6432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/9.3/data6432'
backend_flag0= 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'localhost'
backend_port1 = 7432
backend_weight1 = 1
backend_data_directory1 = ' var/lib/pgsql/9.3/data7432a'
backend_flag1= 'ALLOW_TO_FAILOVER'
pid_file_name = '/var/run/pgpool/pgpool.pid'
logdir = '/var/run/postgres/pgpool'
master_slave_mode = on
master_slave_sub_mode = 'stream'
health_check_user = 'apache'
health_check_password = ''
failover_command = '/usr/local/etc/failover.sh %d %h %p %D %m %M %H %P'
failback_command = '/bin/rm -f /home/postgres/var/log/pgpool/trigger/'
recovery_user = 'postgres'
recovery_password = 'postgres'
recovery_1st_stage_command = 'basebackup.sh'
recovery_2nd_stage_command = ''
pgpool_remote_start.sh
#! /bin/sh
# Start PostgreSQL on the recovery target node
if [ $# -ne 2 ]
then
echo pgpool_remote_start remote_host remote_datadir
exit 1
fi
DEST=$1
DESTDIR=$2
PGCTL=/usr/pgsql-9.3/bin//pg_ctl
#$PGCTL -w -D $DESTDIR start 2>/dev/null 1>/dev/null /dev/null &
$PGCTL -w -D $DESTDIR start/null 1>/dev/null /dev/null &
$PGCTL -w -D $DESTDIR start
basebackup.sh
#/bin/sh -x
PRIMARY_PORT=6432
STANDBY_PORT=7432
PRIMARY=/var/lib/pgsql/9.3/data6432
STANDBY=/var/lib/pgsql/9.3/data7432
master_db_cluster=$1
recovery_node_host_name=$2
recovery_db_cluster=$3
if [ $master_db_cluster = $PRIMARY ];then
PORT=$PRIMARY_PORT
SOURCE_CLUSTER=$PRIMARY
DEST_CLUSTER=$STANDBY
else
PORT=$STANDBY_PORT
SOURCE_CLUSTER=$STANDBY
DEST_CLUSTER=$PRIMARY
fi
psql -p $PORT -c SELECT pg_start_backup('file_based_log_shipping', true) postgres
rsync -C -a -c --delete --exclude postgresql.conf --exclude postmaster.pid
--exclude postmaster.opts --exclude pg_log
--exclude recovery.conf --exclude recovery.done
--exclude pg_xlog
$SOURCE_CLUSTER/ $DEST_CLUSTER/
mkdir $DEST_CLUSTER/pg_xlog
chmod 700 $DEST_CLUSTER/pg_xlog
rm $DEST_CLUSTER/recovery.done
cat > $DEST_CLUSTER/recovery.conf EOF
standby_mode = on
primary_conninfo = 'port=$PORT user=postgres'
trigger_file = '/tmp/trigger/pgsql.recovery.trigger'
EOF
psql -p $PORT -c SELECT pg_stop_backup() postgres
failover.sh
#!/bin/sh
# Execute command by failover.
# special values: %d = node id
# %h = host name
# %p = port number
# %D = database cluster path
# %m = new master node id
# %M = old master node id
# %H = new master node host name
# %P = old primary node id
# %% = '%' character
failed_node_id=$1
failed_host_name=$2
failed_port=$3
failed_db_cluster=$4
new_master_id=$5
old_master_id=$6
new_master_host_name=$7
old_primary_node_id=$8
trigger=/tmp/trigger/pgsql.recovery.trigger
if [ $failed_node_id = $old_primary_node_id ];then# master failed
touch $trigger# let standby take over
fi
§4.1.1.6测试
依次启动master,pgpool,然后进入psql 进行测试,插入数据,分别查找没有问题。进入http://10.4.56.201/pgpoolAdmin/使用pgpool的管理页面。
通过pg_ctl stop -D ../data6432/ 模拟数据库当机,然 后点promote,成功了。
§4.1.1.7小结
由于用pgpool-II的Master-Slave模式来做HA的话,配置相对注意的事情比较多,应多次反复练习配置,理解其 内涵,以避免在各种情况下可能出现的问题。还有再配置过程中需要编写大量的操作系统的SHELL脚本,脚本是否能自动执行,是能成功切换的关键。
§4.1.2高可用性(Keepalived)
Postgresql提供了主从(Master/Slave)复制功能,可以配置为一主一从方式或一主多从方式。目前Postgresql自动故障切换功能通过Pgpool已经比较完善,不过实际运用时可以采用keepalived实现Postgresql的自动故障切换。
Postgresql的典型高可用配置如图所示: