FreeBSD PostgreSQL 9 Hot Standby 实践

FreeBSD PostgreSQL 9 Hot Standby 实践

注:PostgreSQL 9 Hot Standby的关键点有2个,工作模式和操作顺序,除了概念的理解。

一、安装PostgreSQL 9

portmaster -d databases/postgresql90-server
修改/etc/login.conf
postgres:\
:lang=en_US.UTF-8:\
:setenv=LC_COLLATE=C:\
:tc=default:
执行cap_mkdb /etc/login.conf

二、初始化主数据库

su pgsql
/usr/local/bin/initdb -D /usr/local/pgsql/data –locale=C -E UTF8 初始化
修改postgresql.conf:
wal_level = hot_standby
max_wal_senders = 1
wal_keep_segments = 32
log_destination = ‘stderr’
logging_collector = on
log级别根据需要设置,建议debug1下一级别即可(log,info)
修改pg_hba.conf:
host replication pgsql 127.0.0.1/32 trust

三、启动主数据库

/usr/local/bin/postmaster -D /usr/local/pgsql/data
看看日志,已经起来:
LOG: database system is ready to accept connections
LOG: autovacuum launcher started

四、基础备份:

流程:在主数据库服务器执行 pg_start_backup(),复制data目录,再执行
pg_stop_backup()。
$ psql -d postgres
postgres=# select pg_start_backup(”);
这个时候,所有请求在写日志之后不会再刷新到磁盘。除非pg_stop_backup()这个函数
被执行。
接下来,把data目录直接复制data2,这个目录将通过scp、rsync等工具同步到节点服
务器,data2就是基础备份的内容。
cd /usr/loca/pgsql
cp -R data/ data2

五、创建节点数据库(Standby)

cd data2
修改postgres.conf
port = 54321
hot_standby = on
增加recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=127.0.0.1 port=5432 user=pgsql’
rm postmaster.pid

六、停止主数据库基础备份

postgres=# select pg_stop_backup();
现在数据会写入磁盘,当节点服务器启动后,他会自动连接到主服务器,拉取主服务器
自基础备份后的事务日志。然后,对事务日志进行重演,从而达到恢复数据的效果。

七、启动节点数据库

/usr/local/bin/postmaster -D /usr/local/pgsql/data2
看看日志:
DEBUG: initializing for hot standby
LOG: streaming replication successfully connected to primary
DEBUG: end of backup reached
LOG: consistent recovery state reached at 0/3000000
LOG: database system is ready to accept read only connections

八、测试。

FreeBSD下通过smartcl和sendEmail实现硬盘健康监控通知

FreeBSD下通过smartcl和sendEmail实现硬盘健康监控通知

通过smatctl检查硬盘的S.M.A.R.T.状态,并通过sendEmail向管理员发送邮件报告。

安装相关软件

smartctl

smartctl是非常全面的硬盘S.M.A.R.T.检查工具

cd /usr/ports/sysutils/smartmontools/ && make install clean

sendEmail

sendEmail是一款小巧便捷的邮件工具,支持smtp

cd /usr/ports/net/sendemail/&& make install clean && rehash

这2个软件安装后均无需额外配置即可实现本文功能

编写脚本

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

  ##变量根据自己情况修改##
  #smtp服务器地址#
smtpadd="smtp.yourmail.com"
  #smtp登录用户#
smtpusr="username"
  #smtp用户密码#
smtppass="password"
  #发件人邮箱#
sender="sneder@yourmail.com"
  #收件人邮箱#
rcver="rcver@yourmail.com"
  #临时日志,用于记录smartctl输出信息#
tmplog="/tmp/my_disks_smart.log"
  #获取主机名,对服务器加以区分#
myhost=`hostname`

  ##列出本机所有硬盘##
dsks=`geom disk status\
| grep -Ev ‘cd[0-9]|^Name.*’\
| awk ‘{print "/dev/" $1}’`

  ##查询每个硬盘的S.M.A.R.T.健康简况,并保存在临时日志中##
for i in ${dsks}
do
smartinfo=`smartctl -H ${i}\
  | grep -Ev ‘^$|===|^smartctl|^Copyright’`
echo ${i} : ${smartinfo} >> ${tmplog}
done

  ##通过邮件报告硬盘健康简况##
email_notify=`sendEmail\
-f ${sender}\
-s ${smtpadd}\
-xu ${smtpusr}\
-xp ${smtppass}\
-t ${rcver}\
-u "disks_smart of ${myhost} at $(date +%Y-%m-%d)"\
-o message-file=${tmplog}\
| grep  sent\ successfully!`

  ##发送后的处理,成功即删除临时日志,失败则添加记录##
if [ ! "${email_notify}" ]
then
  echo "email send fail" >> ${tmplog}
  chmod 600 ${tmplog}
else
  rm ${tmplog}
fi
exit 0

给脚本执行权限

加入cron执行

编辑/etc/crontab

@daily root /path/to/your/script

原文链接:http://wiki.freebsdchina.org/howto/s/smartctl_sendemail