【入门教程】PostgreSQL+SequoiaDBHA 实践
前言
SequoiaDB作为分布式数据库,从设计之初就已经支持SQL访问。目前,SequoiaDB自研的SQL访问组件SequoiaSQL作为企业版的功能之一已经提供给上百家企业用户使用,并且已经实现分布式架构下的SQL 2003支持。
对于SequoiaDB社区版用户,我们可以通过SequoiaDB对接PostgreSQL 实现社区版的分布式SQL访问。这一应用方式基本也可以满足大部分的社区版需求。
本文就主要探讨如何使用PostgreSQL引擎对接SequoiaDB社区版实现HA高可用架构。
操作环境介绍
在一台机上分别安装centos 6.5、SequoiaDB 2.6、postgresql 9.3.4 、pgpool II 3.6.2,其中SequoiaDB为默认安装,PostgreSQL数据库则手动安装,安装在不同的目录中,使用不同的端口号。pgpool II 3.6.2则单独手动安装一个,并设好免密认证。
注:需要先配好PostgreSQL数据库之间免密登录及关闭防火墙。
安装部署PostgreSQL复制流
1. PostgreSQL的安装
Step1
./configure --without-readline--without-zlib --prefix=/opt/postgresql/data02/pgpool/master
注:--prefix=path,是指PostgreSQL的二进制程序和文档将被安装到这个目录。默认值为 /usr/local
Step2:编译
make
Step3:安装
makeinstall
Step4:修改文件权限
chown -R sdbadmin:sdbadmin_group/opt/postgresql/data02/pgpool/master
当安装完成后,可通过echo $? 命令验证,如果为0则表示安装成功,非0表示失败。安装成功如图1所示:
图1
2.PostgreSQL复制流部署
先配置主库,再配置备库。
1)配置主库
Step1:初始化数据库
mkdir /opt/postgresql/data02/pgpool/master /pg_data
/opt/postgresql/data02/pgpool/master /bin/initdb-D pg_data/
初始化成功则如图2所示:
图2
Step2:修改postgresql.conf配置文件
listen_addresses = '*'
port = 7654
wal_level = hot_standby #这个是设置主为wal的主机
archive_mode = on #开启日志归档
archive_command = 'cp %p/opt/postgresql/data02/pgpool/master/pg_data/backup/%f' #WAL归档路径。
max_wal_senders = 1 #这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 250 #设置log file 的段大小
wal_sender_timeout = 60s #设置流复制主机发送数据的超时时间
max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的。
在搭建流复制环境时,并不必须设置 archive_mode 参数为 on ,很多资料在介绍搭建流复制环境时设置这个参数为 on ,可能是出于开启 WAL 归档更安全的原因,因为在主库宕机并且较长时间不能恢复时,从库依然可以读取归档目录的 WAL,从而保证不丢数据; 另一方面,如果主库设置了较大的 wal_keep_segments ,也可以不用开启archive_mode,因为主库保留了足够的 WAL,从而大大降低了因从库所需要的 WAL 被主库覆盖而需要从归档去取 WAL 的情况。所以从这方面说,archive_mode 参数的设置与搭建流复制并没有直接关系。提示:对于比较繁忙的库,在搭建流复制从库时,建议主库设置较大的 wal_keep_segments 参数。
其实可以在同一个postgresql.conf中把所有主从属性配置都配好,postgresql数据库能够自动识别哪些是主库参数,哪些是从库参数,但注意,有些参数在主库中不能配置,否则出错,比如不能再主库中开启热备模式(hot_standby = on)。配置完成后我们可以拷贝该库都另一个目录,当成备库。
注:当日志报“xxxxxxxxxxxxxxxxxxx WAL已经被移异常”时,有可能是 WAL被覆盖引起的或者DBA不小心把主库或从库的某个日志文件删了(如果开启了归档,则包含归档文件),即主库有而备库没有,或者备库有而主库没有都会引起该异常。解决方法:如果是主备日志文件异常(某个库缺个日志文件)