版权声明:本文为神州灵云作者的原创文章,未经神州灵云允许不得转载。
本文作者:Jack
上一篇文章主要讲了双机热备的主-备方式(Active-Standby),今天来说一下另外一种方式:双主方式(Active-Active)。
PostgreSQL 9.4之前的版本并不支持双主方式,只能采用第三方插件来实现,比如:Bucardo、Pgpool、Slony等,这些都是基于触发器的解决方案,虽然从理论上解决了问题但其实并不是一个好的解决方案。令人欣喜的是从PostgreSQL 9.4版本增加了一个全新的技术来支持双主方式,称为BDR(双向复制)。
BDR1(PostgreSQL 9.4)是免费的,而BDR2(PostgreSQL 9.6)和BDR3 (PostgreSQL>=10)则是收费的,我们以PostgreSQL 9.4版本为基础来探究一下双向复制功能。
环境:
操作系统 | Centos7 64位 |
---|---|
主机master | 192.168.1.100 |
备机slave | 192.168.1.200 |
PostgreSQL版本 | bdr-9.4 |
安装:
安装过程和前面的文章《双机热备(一)》的安装方式基本一致,没有特别说明的情况下主机和备机都需要执行下面操作,本安装采用RPM包离线安装方式,当然如果你的机器能联网用yum在线安装更方便,这里提供一下下载地址:
http://packages.2ndquadrant.com/postgresql-bdr94-2ndquadrant/yum-repo-rpms/postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch.rpm
-
安装(按顺序):
# rpm -ivh postgresql-bdr94-libs-9.4.17_bdr1-1.el7.x86_64.rpm
# rpm -ivh postgresql-bdr94-9.4.17_bdr1-1.el7.x86_64.rpm
# rpm -ivh postgresql-bdr94-server-9.4.17_bdr1-1.el7.x86_64.rpm
# rpm -ivh postgresql-bdr94-contrib-9.4.17_bdr1-1.el7.x86_64.rpm
# rpm -ivh postgresql-bdr94-bdr-1.0.5-1.el7.x86_64.rpm
-
初始化数据库:
# /usr/pgsql-9.4/bin/postgresql94-setup initdb
-
启动PostgreSQL服务并使之开机自启
# systemctl enable postgresql-9.4
-
启动数据库
# systemctl start postgresql-9.4
-
给默认账户设置密码
# alter user postgres with encrypted password ‘test’;
-
配置PostgreSQL-MD5认证
修改文件:/var/lib/pgsql/9.4-bdr/data/pg_hba.conf 增加如下配置:
host replication postgres 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5
并注释掉host all all 127.0.0.1/32 ident
-
配置PostgreSQL-Configure TCP/IP,默认情况下,TCP/IP连接是不可行的,所以其他计算机用户不能连接到postgresql。
修改文件:/var/lib/pgsql/9.4-bdr/data/postgresql.conf 增加如下配置:
listen_addresses = ‘*’
port = 5432
max_connections = 500
-
BDR复制配置:
修改/var/lib/pgsql/9.4/data/postgresql.conf,在文件末尾增加以下属性:
max_worker_processes = 50
max_replication_slots = 50
max_wal_senders = 50
shared_preload_libraries = ‘bdr’
track_commit_timestamp = on
wal_level = logical
default_sequenceam = ‘bdr’
此配置完成以后需要重启一下postgresql服务
-
创建测试表以及对应的extension:
# created test
# psql test
# CREATE EXTENSION btree_gist;
# CREATE EXTENSION bdr;
-
创建主库的bdr相关信息:
# SELECT bdr.bdr_group_create(local_node_name := ‘test-Active’,node_external_dsn := ‘host=192.168.1.100 port=5432 dbname=test user=postgres password=test’);
说明:
local_node_name:主库的节点名称
node_external_dsn:主库的相关信息,包括IP、端口、数据库名称、账号密码
- 创建备库的bdr相关信息:
# SELECT bdr.bdr_group_join(local_node_name := ‘test-Standby’,node_external_dsn := ‘host=192.168.1.200 port=5432 dbname=test user=postgres password=test’,join_using_dsn := ‘host=192.168.1.100 port=5432 dbname=test user=postgres password=test’);
说明:
local_node_name:备库的节点名称
node_external_dsn:备库的相关信息,包括IP、端口、数据库名称、账号密码
join_using_dsn:备库的相关信息,包括IP、端口、数据库名称、账号密码
验证配置:
-
在主库的服务器上输入命令,会看到多出一个wal sender process的进程:
# ps -aux | grep postgres
-
在备库的服务器上输入命令,会看到多出一个wal sender process的进程:
# ps -aux | grep postgres
测试:
-
在主机上创建表user,然后在备机上可以看到user表已经被复制过来了,在主机上插入数据,备机上数据也已经复制。
-
在备机上创建表并插入数据,然后在主机上可以看到这条数据已经被复制过来了
-
停止主机,在备机上插入数据,然后再启用主机,可以看到主机也是有这条数据的
至此,双机热备的两种方式都讲完了,实际项目中可以根据相应的需求采用对应的灾备方案。