10月13, 2017

Stream Replication in PostgreSQL

0x00 POSTSTART

PostgreSQL 是一个开源的关系型数据库服务器,有着极其丰富的数据类型的支持,并且支持对数据类型进行扩展。本文介绍PostgreSQL的基本用法和流复制(stream replication)功能。

0x01 配置安装

我们测试使用的操作系统版本为CentOS release 6.6,yum install postgresql之前需要先在系统中添加官网提供的对应版本的Yum仓库.

sudo yum install http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-18.noarch.rpm

sudo yum install postgresql93-server postgresql93-contrib

安装过程中会创建postgres用户对PostgreSQL进行日常管理,postgres为默认的管理用户名.

sudo mkdir -p /data/pgsql
sudo chown postgres:postgres /data/pgsql
sudo su - postgres
cp /etc/skel/.bash* /var/lib/pgsql

设置PGDATE环境变量,指向数据库物理文件的路径,比如存放在刚创建好的/data/pgsql目录下. 在/var/lib/pgsql/.bashrc中添加以下环境变量:

export PGDATA=/data/pgsql
export PATH=/usr/pgsql-9.3/bin:$PATH

重新加载.bashrc使得环境变量生效

source /var/lib/pgsql/.bashrc

接下来就可以初始化数据库了

[root@merger24 /]# su - postgres
Last login: Wed Oct 11 17:55:07 CST 2017 on pts/1
[postgres@merger24 ~]$ initdb

0x02 Stream Replication

在开始流复制的构建前,需要在两台机器上安装好PostgreSQL,其中备库的PostgreSQL可以先不执行initdb命令进行数据库初始化。

P.s. 也可以在一台机器上启动两个PostgreSQL实例来搭建流复制环境。

我们使用的环境是:

PG1:server1,24 CPU、128G内存、2T磁盘,IP: server01 

PG2: server2,24 CPU、128G内存、2T磁盘,IP: server02 

OS:CentOS Linux release 7.2.1511 (Core) 

DB:PostgreSQL 9.3.18

连接主库后,创建复制用户

CREATE USER repuser REPLICATION LOGIN CONNECTION LIMIT 2 ENCRYPTED PASSWORD 'Pass_PostgreSQL';

配置pg_hba.conf,添加以下配置项

host   replication     repuser          server02/32         trust

设置主库postgresql.conf内容如下

listen_addresses = 'server01'        # 设置为内网IP,允许远程登录主机
wal_level = hot_standby        # write ahead log,流复制时为hot_standby
hot_standby = on
max_wal_senders = 2          # 流复制的最大连接数
wal_keep_segments = 16        # 流复制保留的最大xlog数

重启数据库

pg_ctl restart

查看表空间目录和数据目录

[postgres@pg1 data]$ psql
psql (9.3.18)
Type "help" for help.

postgres=# \db
       List of tablespaces
    Name    |  Owner   | Location
------------+----------+----------
 pg_default | postgres |
 pg_global  | postgres |
(2 rows)

postgres=# \q
[postgres@pg1 data]$ echo $PGDATA
/data/pgsql

配置备库时需要确认备库是否有与主库相同的数据目录,如果有移除之

cd /opt/PostgreSQL/9.3.18/
mv data data20151116
mkdir -p /opt/PostgreSQL/9.3.18/data
chown -R postgres /opt/PostgreSQL/9.3.18/data
chmod 700 /opt/PostgreSQL/9.3.18/data

在postgres根目录下创建.pgpass, 加入以下内容:

server01:5432:postgres:repuser:Pass_PostgreSQL

执行如下命令进行授权

chmod 600 ~/.pgpass

使用pg_backendup生成备库

su postgres
pg_basebackup -D /opt/PostgreSQL/9.3.18/data -Fp -Xs -v -P -h server01 -p 5432 -U repuser

这时表空间目录和$PGDATA目录已经复制过来了

接下来配置server02的recovery.conf,首先生成recovery.conf

cp /opt/PostgreSQL/9.3.18/share/postgresql/recovery.conf.sample $PGDATA/recovery.conf

然后在recovery.conf中添加如下内容,其中,需要确保用户postgres对/data/pgsql目录具有写权限

standby_mode = 'on'
trigger_file = '/data/pgsql/pg.trigger'
primary_conninfo = ‘host=server01 port=5432 user=repuser password=Pass_PostgreSQL'

启动备库服务。

pg_ctl start

0X03 主备同步测试

确认主库中进程有“postgres: wal sender process”, 备库进程中有”postgres: wal receiver process”

ps -ef | grep postgres

进入测试数据库testdb,主库上执行如下命令返回f,备库上返回t。

select pg_is_in_recovery();

执行如下命令查看快照,它返回主库记录点、备库记录点;主库每增加一条写入,记录点的值就会加1。

testdb=# select txid_current_snapshot();

testdb=# insert into ta values(now());

执行如下命令可以查看主备同步状态。

select * from pg_stat_replication;

字段state显示的同步状态有:startup(连接中)、catchup(同步中)、streaming(同步);字段sync_state显示的模式有:async(异步)、sync(同步)、potential(虽然现在是异步模式,但是有可能升级到同步模式)。

0x04 主备切换

备库的状态是read only,那么如何把备库的状态从只读切换为读写呢?

把备库的postgresql.conf中hot_standby修改为off,并且删除recovery.conf,然后重启库就可以提供服务了。

0x05 PRESTOP

PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在备库apply每个WAL record,这里的流复制每次传输单位是WAL日志的record。而PostgreSQL9.0之前提供的方法是主库写完一个WAL日志文件后,才把WAL日志文件传送到备库,这样的方式导致主备延迟特别大。

同时,PostgreSQL9.0之后提供了Hot Standby,备库在应用WAL record的同时也能够提供只读服务,大大提升了用户体验。

本文链接:https://www.opsdev.cn/post/stream-replication-in-postgresql.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。