绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
【入门教程】PostgreSQL+SequoiaDB HA 实践
2020-06-17 17:06:16

前言

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:安装

make install


Step4:修改文件权限

chown -R sdbadmin:sdbadmin_group /opt/postgresql/data02/pgpool/master

当安装完成后,可通过echo $? 命令验证,如果为0则表示安装成功,非0表示失败。安装成功如图1所示:

2. PostgreSQL复制流部署

先配置主库,再配置备库。

1)配置主库

Step1:初始化数据库

mkdir /opt/postgresql/data02/pgpool/master /pg_data

/opt/postgresql/data02/pgpool/master /bin/initdb -D pg_data/

初始化成功则如图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不小心把主库或从库的某个日志文件删了(如果开启了归档,则包含归档文件),即主库有而备库没有,或者备库有而主库没有都会引起该异常。解决方法:如果是主备日志文件异常(某个库缺个日志文件),则根据日志的异常把报错日志考到 另一个没有的库,在重启,如果是WAL日志被覆盖,则把主库整个pg_data数据路径下的pg_xlog日志文件拷到备库,如果是在开启归档模式下出现的异常,需要把归档文件都重新覆盖备库的,再重启,都不能解决,那就暴力的把整个pg_data目录拷贝到备库,在重启就可以了。


Step3:修改pg_hba.conf配置文件

# IPv4 local connections:

host all all 127.0.0.1/32 trust

host replication all 0.0.0.0/0 trust


Step4:启动服务,创建用户

/opt/postgresql/data02/pgpool/master/bin/pg_ctl -D /opt/postgresql/data02/pgpool/master/pg_data/ -l /opt/postgresql/data02/pgpool/master/log/pg.log start; #启动服务

/opt/postgresql/data02/pgpool/master/bin/createuser -P -d -a -c 5 --replication -e sequoiadb -p 7654

Enter password for new role:

Enter it again:

CREATE ROLE sequoiadb PASSWORD 'md570b40d6703c0a012afc8356f4511c197' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN REPLICATION CONNECTION LIMIT 5;

创建用户可根据自己需求赋予权限。

2)配置从库

Step1:拷贝主库为从库

cp -r /opt/postgresql/data02/pgpool/master /opt/postgresql/data02/pgpool/slave

Step2:修改从库 postgresql.conf配置文件

listen_addresses = '*'

port = 4567

max_connections = 1000 # 一般查多于写的应用从库的大连接数要比较大

hot_standby = on #说明这台机器不仅仅是用于数据归档,也用于数据查询

max_standby_streaming_delay = 30s # 数据流备份的大延迟时间

wal_receiver_status_interval = 1s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置长的间隔时间

hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈

由于主备模式,主库可进行任何增删改查等操作,而从库只能提供查询操作,这是为了数据的一致性,因此,通常情况下会把查询都向从库进行,以减轻主库的压力。


Step2: 修改recovery.conf配置文件

把/share/recovery.conf.sample文件拷贝到数据库目录中,在复制模板。

cp /opt/postgresql/data02/pgpool/slave/share/recovery.conf.sample /opt/postgresql/data02/pgpool/slave/pg_data/

cp recovery.conf.sample recovery.conf

standby_mode = on # 这个说明这台机器为从库

primary_conninfo = 'host=centos01 user=sequoiadb password= 123456 port=7654 keepalives_idle=60' # 这个说明这台机器对应主库的信息

其中,primary_conninfo配置可以与不需要用户名及密码,这是由于在pg_hba.conf中的信任关系为trust,所以可以不用填写。

3)主库对接SequoiaDB

Step1:从 SequoiaDB 的安装包中,拷贝 PostgreSQL 的扩展文件

su – sdbadmin

cd /opt/postgresql/data02/pgpool/master

cp /opt/sequoiadb/postgresql/sdb_fdw.so_2.8.1_27726 lib/

cp /opt/sequoiadb/postgresql/sdb_fdw.control share/extension/

cp /opt/sequoiadb/postgresql/sdb_fdw--1.0.sql share/extension/

cd lib/

ln -s sdb_fdw.so_2.8.1_27726 sdb_fdw.so

添加完软连接完成后,可查看文件(ls –trl )验证,如图3展示,则表示成功。

Step2:登录主库,创建连接

/opt/postgresql/data02/pgpool/master/bin/psql –U sequoiadb –d postgres –p 7654

create extension sdb_fdw;

create server sdb_server foreign data wrapper sdb_fdw options(address 'centos01', service '11810');


Step3:测试连接

create foreign table foo (name text, age int) server sdb_server options ( collectionspace 'foo', collection 'bar', decimal 'on' ) ;

select * from test limit 1;

测试结果如图4:

4)测试复制流

Step1:启动备库

/opt/postgresql/data02/pgpool/slave/bin/pg_ctl -D /opt/postgresql/data02/pgpool/slave/pg_data/ -l /opt/postgresql/data02/pgpool/slave/log/pg.log start

查看日志如图5表示启动成功,进入主备模式。

Step2:登录主库,进行异步复制

select pg_start_backup('hot_backup');

select pg_is_in_backup();#查看是否在备份中backup。返回"t"表示true。“f”表示false。

select pg_stop_backup();

其中,select pg_start_backup('hot_backup');语句里的hot_backup参数不是固定的,这里的 hot_backup 是任意DBA想使用的这次备份操作的标识,DBA也可以指定备份文件存放全路径,如:select pg_start_backup('/opt/backup/backup_20170413');这是推荐使用的方式;select pg_stop_backup(),Postgresql将会生成一个文件,如“000000010000000000000000.003911E0.backup”,这是一个备份的历史文件。pg_stop_backup()将保留本次生成的备份历史文件,然后把上次执行本方式备份产生的备份历史文件清理掉,然后发信号告知归档进程(pg_stop_backup -> CleanupBackupHistory -> XLogArchiveCheckDone -> XLogArchiveNotify -> SendPostmasterSignal),可以归档了。

操作结果如图6所示:


Step3:登录备库,进行查看

../bin/psql –U sequoiadb –d postgres –p 4567

select * from test limit 1;

测试结果如图7所示,表示成功。

安装部署pgpool

1) 安装pgpool

./configure --prefix=/opt/postgresql/data02/pgpool-II-3.6.2 --with-pgsql=/opt/postgresql/data02/pgpool/master

make

make install #需要root权限。

在编译安装过程中,如果出现libtool异常,重新编译安装时加上参数 --disable-libtool-lock,如:./configure -–prefix --with-pgsql=pg_path --disable-libtool-lock,特别注意的是,当不指定—prefix时,会默认安装在/usr/local/目录下,且无论是否把安装目录拷贝出来,每次执行都会到/usr/local/默认目录下读取配置信息,所以建议指定安装路径(--prefix)。如果安装成功,则会如图8所示:


2) 安装 pgpool_regclass, pgpool_recovery 函数

安装pgpool_regclass, pgpool_recovery 函数库时,进入目录src/sql下,但无法直接使用make编译,会报找不到pg_config文件,因此,需要找到pg_config配置文件,该文件存在于postgresql安装目录中,如上面安时指定的—with-pgsql参数路径中寻找,并把其全路径替换掉Makefile文件中的变量PG_CONFIG =pg_config参数值,才能安装。当在src/sql目录下把Makefile参数改了,还是没能够编译安装时,则需要依次登录其库目录src/sql/pgpool_regclass和src/sql/pgpool_recovery,在分别替换掉Makefile文件中的变量PG_CONFIG =pg_config参数值,就能够安装 了。具体部署如下:

find /opt/postgresql/data02/pgpool/master -name “pg_config”;

cd /opt/postgresql/data02/pgpool/pgpool-II-3.6.2/src/sql/pgpool-regclass;

vi Makefile

PG_CONFIG ?= /opt/postgresql/data02/pgpool/master/bin/pg_config

:wq

make

make install

详情操作可如图9和图10 所示:

安装pgpool_regclass函数库成功后,会在postgresql中的 /share/extension/目录下会有三个文件,分别为pgpool_regclass.control、pgpool_regclass--1.0.sql和pgpool-regclass.sql,而安装成功pgpool_recovery函数库,则在postgresql 中的 /share/extension/目录下也有三个文件,分别为:pgpool_recovery.control、pgpool-recovery.sql和pgpool_recovery--1.1.sql。

pgpool_regclass与pgpool_recovery函数库安装成功则如图11:

3) 配置pgpool.conf文件

listen_addresses = '*'

port = 9999

socket_dir = '/tmp'

pcp_listen_addresses = '*'


pcp_port = 9898


pcp_socket_dir = '/tmp'


backend_hostname0 = 'centos01' #配置数据节点,可以是主机名或IP地址

backend_port0 = 7654

backend_weight0 = 1 #负载均衡中的权重值

backend_data_directory0 = '/opt/postgresql/data02/pgpool/master/pg_data' #指定节点0数据路径

backend_flag0 = 'ALLOW_TO_FAILOVER' #允许自动切换

backend_hostname1 = 'centos01'

backend_port1 = 4567

backend_weight1 = 1

backend_data_directory1 = '/opt/postgresql/data02/pgpool/slave/pg_data'

backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = on #开启pool_hba验证

pool_passwd = 'pool_passwd' #验证文件(pool_passwd格式为,客户端连接到pgpool的账户名 root:md5生成的密码)

authentication_timeout = 60 #验证超时时间。

pid_file_name = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/run/pgpool.pid'

logdir = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/status'

load_balance_mode = on #开启负载模式

master_slave_mode = on #开启主备模式

master_slave_sub_mode = 'stream' #开启流模式

sr_check_period = 10 #流式复制检查周期默认为禁用(0)

sr_check_user = 'sequoiadb' #流复制模式检测用户

sr_check_password = '123456' #检测用户密码

sr_check_database = 'postgres' #检测用户下的数据库

health_check_period = 10 #每10s检测数据库节点状态

health_check_timeout = 20 #20s无反应测超时,即检测两次无反应就超时,禁用为0。

health_check_user = 'sequoiadb' #检测某用户数据库节点状态

health_check_password = '123456' //被检测用户密码

health_check_max_retries = 0

health_check_retry_delay = 1

connect_timeout = 10000

failover_command = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/fail.sh %H'

memqcache_oiddir = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/oiddir'

其中健康检测状态有四种,即status 由数字 [0 - 3]来表示。0 - 该状态仅仅用于初始化,PCP从不显示它。1 - 节点已启动,还没有连接。2 - 节点已启动,连接被缓冲。3 - 节点已关闭,。在节点关闭或者为0的时候可以用pgpool的pcp_attach_node命令来动态增加节点,包括以后动态扩充节点也可以。

在配置过程中,需要注意的时,在3.3.4版本的pgpool II中,如果你配置pid_file_name. logdir等默认路径为/tmp变量参数,则在登录pgpool时有可能应环境而无法等路pgpool,这是由于postgresql无法找到pgpool的 .s.PGSQL.8989和.s.PGSQL.6868文件,因为postgresql是在/tmp/目录下寻找的,即使你修改postgresql的unix_socket_directories参数值和pgpool上指定的路径相同,还是会出现异常,因此建议用默认值。


4)配置pcp.conf

cp pcp.conf.sample pcp.conf

../bin/pg_md5 -u pgpool -p

password:


e10adc3949ba59abbe56e057f20f883e

操作详情如图12所示:


5) 配置pool_hba.conf

cp pool_hba.conf.sample pool_hba.conf

vi pool_hba.conf

# IPv4 local connections:

host all all 127.0.0.1/32 trust

host sequoiadb postgres 0.0.0.0/0 trust

这里特别注意,不能用md5效验,因为md5不支持复制流模式、主备模式以及并行查询模式。

6)配置pool_passwd

Pool_passwd配置哪些用户可以通过pgpool登陆数据库,格式user:md5

vi pool_passwd

sequoiadb:md570b40d6703c0a012afc8356f4511c197

7)配置fail.sh脚本

# Failover command for streaming replication.

# This script assumes that DB node 0 is primary, and 1 is standby.

#

# If standby goes down, do nothing. If primary goes down, create a

# trigger file so that standby takes over primary node.

#

# Arguments: $1: failed node id. $2: new master hostname. $3: path to

# trigger file.


new_master=$1

echo "new_master info =============== ${new_master}";

trigger_command="/opt/postgresql/data02/pgpool/slave/bin/pg_ctl -D /opt/postgresql/data02/pgpool/slave/pg_data –l /opt/postgresql/data02/pgpool/slave/log/pg.log start"


# Do nothing if standby goes down.

if [ $failed_node = 1 ]; then

exit 0;

fi

# Create the trigger file.

/usr/bin/ssh -T $new_master $trigger_command


exit 0;

8) 启动pgpool

../bin/pgpool –n –d > ../log/pgpool.log 2>&1 & #-n表示取消后台模式,-d 表示打印调试信息。

bin/psql -U sequoiadb -d postgres -p 9999 #通过postgresql工具psql登录pgpool

postgres=# show pool_nodes;

node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay

---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------

0 | centos01 | 7654 | up | 0.500000 | primary | 2 | true | 0

1 | centos01 | 4567 | up | 0.500000 | standby | 0 | false | 0

(2 rows)

postgres=#

当手动关闭主库,等一会儿在重启主库,缺发现没有了主库,具体如下图13与所示:

目前还没有找到原因,实现在线恢复功能,即主节点挂后自动选主,且在主库关闭在重启过程中,有可能会出现原主库节点直接down掉,即status状态值为down,pgpool一致报无法找到主节点的异常,具体如图14所示:


可通过pgpool自带的工具pcp_attach_node进行处理,处理命令为:bin/pcp_attach_node -U pgpool -h centos01 -p 9898 -n 0 –d –W,具体则如图15:


该命令本身是可以把原主节点拉起并使其成为主节点的,执行后结果如图16所示:


小结

使用PostgreSQL+SequoiaDB实现HA高可用架构,可以说为社区用户提供了一个更为简单的技术选择,使得SequoiaDB除了原生API之外,为社区开发者提供了SQL的接口。

当然,如果有更为复杂的需求或者更为庞大的业务数据需要管理,我们还是会推荐购买企业版的SequoiaDB,包括其中的SequoiaSQL分布式SQL引擎。


戳我,来吐槽~