PostgreSQL流复制热备

一、前提

分别在两台主机上安装好pg数据库,安装过程参考之前文章Centos安装PostgreSQL

二、节点信息

节点信息

三、部署流复制

#设置hosts(master&&slave)

[root@localhost ~]# cat >> /etc/hosts << EOF

10.1.83.136    master

10.1.83.135    slave

EOF

#初始化master数据库

[root@localhost ~]# su - postgres

[postgres@localhost ~]$ pg_ctl stop -D $PGDATA

[postgres@localhost ~]$ rm -rf /app/postgres/data/

[postgres@localhost ~]$ initdb -D $PGDATA

[postgres@localhost ~]$ pg_ctl start -D $PGDATA

[postgres@localhost ~]$ psql

psql (9.6.0)

Type "help" for help.

postgres=# ALTER ROLE postgres password 'postgres';

ALTER ROLE

postgres=# \q

[postgres@localhost ~]$ vim $PGDATA/postgresql.conf

# - Connection Settings -

listen_addresses = '*'

port = 5432

log_destination = 'stderr'

logging_collector = on

log_directory = '/app/postgres/log/'

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

log_file_mode = 0600

log_rotation_age = 1d

log_rotation_size = 100MB

log_min_messages = error

max_wal_senders = 2

wal_level = replica

archive_mode = on

archive_command = 'cd ./'

hot_standby = on

wal_keep_segments = 64

full_page_writes = on

wal_log_hints = on

[postgres@localhost ~]$ vim $PGDATA/pg_hba.conf

# "local" is for Unix domain socket connections only

local  all            all                                    md5

# IPv4 local connections:

host    all            all            127.0.0.1/32            md5

# IPv6 local connections:

host    all            all            ::1/128                md5

# Allow replication connections from localhost, by a user with the

# replication privilege.

#local  replication    postgres                                trust

#host    replication    postgres        127.0.0.1/32            trust

#host    replication    postgres        ::1/128                trust

host    all            all            0.0.0.0/0              md5

host    replication    repuser        slave                  md5

[postgres@localhost ~]$ pg_ctl restart -D $PGDATA

[postgres@localhost ~]$ psql

Password:

psql (9.6.0)

Type "help" for help.

postgres=# CREATE USER repuser replication LOGIN CONNECTION LIMIT 3 ENCRYPTED PASSWORD 'repuser';

CREATE ROLE

postgres=# \q

#部署slave数据库

[root@localhost ~]# su - postgres

[postgres@localhost ~]$ rm -rf /app/postgres/data/

[postgres@localhost ~]$ pg_basebackup -D $PGDATA -Fp -Xs -v -P -h master -p 5432 -U repuser

[postgres@localhost ~]$ vim $PGDATA/pg_hba.conf

host replication      repuser      master              md5

#配置master的recovery.done

[postgres@localhost ~]$ cd $PGHOME

[postgres@localhost postgres]$ cp share/recovery.conf.sample data/recovery.done

[postgres@localhost postgres]$ vim data/recovery.done

recovery_target_timeline='latest'

standby_mode=on

primary_conninfo='host=slave port=5432 user=repuser password=repuser'

trigger_file='/app/postgres/data/trigger_file'

#配置slave的recovery.conf

[postgres@localhost ~]$ cd $PGHOME

[postgres@localhost postgres]$ cp share/recovery.conf.sample data/recovery.conf

[postgres@localhost postgres]$ vim data/recovery.conf

recovery_target_timeline='latest'

standby_mode=on

primary_conninfo='host=master port=5432 user=repuser password=repuser'

trigger_file='/app/postgres/data/trigger_file'

#配置master的.pgpass

[postgres@localhost postgres]$ echo 'slave:5432:postgres:repuser:repuser' > /home/postgres/.pgpass;chmod 0600 /home/postgres/.pgpass


#配置slave的.pgpass

[postgres@localhost postgres]$ echo 'master:5432:postgres:repuser:repuser' > /home/postgres/.pgpass;chmod 0600 /home/postgres/.pgpass

四、流复制数据同步测试

分别重启master,slave数据库

#在master插入数据

[postgres@localhost ~]$ psql

Password:

psql (9.6.0)

Type "help" for help.

postgres=# create database test;

CREATE DATABASE

postgres=# \c test

You are now connected to database "test" as user "postgres".

test=# create table tt(id serial not null,name text);

CREATE TABLE

test=# insert into tt(name) values ('china');

INSERT 0 1

test=# \q

#在slave查看master插入的数据是否同步过来

[postgres@localhost ~]$ psql

Password:

psql (9.6.0)

Type "help" for help.

postgres=# \c test

You are now connected to database "test" as user "postgres".

test=# select * from tt;

id | name 

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

  1 | china

(1 row)

test=# \q

五、流复制管理

一般可以通过若干命令查询数据库的主备属性,主数据库是读写的,备数据库是只读的。当主数据库宕机了,可以通过建立触发文件,备数据库将被提升为主数据库,实现一些基本的HA应用。

#查看主备属性

[postgres@localhost ~]$ pg_controldata | grep 'Database cluster state'

主机的cluster state是in production,备机的cluster state是in archive recovery。

#字典表pg_stat_replication

[postgres@localhost ~]$ psql

Password:

psql (9.6.0)

Type "help" for help.

postgres=# select pid,application_name,client_addr,client_port,state,sync_state from pg_stat_replication;

pid  | application_name | client_addr | client_port |  state  | sync_state

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

1401 | walreceiver      | 10.1.83.135 |      48860 | streaming | async

在主机字典表中是能查到记录,备机中是查询不到的。

#进程信息识别

[postgres@localhost ~]$ ps -ef | grep postgres | grep 'wal sender\|wal receiver' | grep -v grep

进程中显示wal sender的是主机,显示wal receiver的是备机

#pg函数

[postgres@localhost ~]$ psql

Password:

psql (9.6.0)

Type "help" for help.

postgres=# select pg_is_in_recovery();

备机是t,主机是f。

#切换主从

1、master关闭

[postgres@localhost ~]$ pg_ctl stop -D $PGDATA

2、slave触发切换流程

[postgres@localhost ~]$ touch /app/postgres/data/trigger_file

[postgres@localhost ~]$ pg_controldata | grep 'Database cluster state'

Database cluster state:              in production

[postgres@localhost ~]$ psql

Password:

psql (9.6.0)

Type "help" for help.

postgres=# \c test

You are now connected to database "test" as user "postgres".

test=# insert into tt(name) values('sdf');

INSERT 0 1

3、master恢复后,重新作为new slave

[postgres@localhost data]$ mv $PGDATA/recovery.done $PGDATA/recovery.conf

#启动pg服务

[postgres@master data]$ pg_ctl start -D $PGDATA

#查看日志,看切换后,是否需要拉取增量数据,如果需要则执行以下步骤,如果不需要则跳过以下步骤

[postgres@master data]$ less /app/postgres/log/postgresql-2020-01-08_154428.log

如果出现如下ERROR日志,则需要拉取增量数据

ERROR: requested starting point 0/6000000 on timeline 1 is not in this server's history

DETAIL: This server's history forked from timeline 1 at 0/4000098.

ERROR: requested starting point 0/6000000 on timeline 1 is not in this server's history

DETAIL: This server's history forked from timeline 1 at 0/4000098.

ERROR: requested starting point 0/6000000 on timeline 1 is not in this server's history  

[postgres@master data]$ pg_ctl stop -D $PGDATA

[postgres@master ~]$ pg_rewind --target-pgdata=/app/postgres/data --source-server='host=slave port=5432 user=postgres dbname=postgres password=postgres'

[postgres@master ~]$ pg_ctl start -D $PGDATA

#查看增量数据,是否已拉取过来

[postgres@master ~]$ psql

Password:

psql (9.6.0)

Type "help" for help.

postgres=# \c test

You are now connected to database "test" as user "postgres".

test=# select * from tt;

id | name 

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

  1 | china

34 | sdf

(2 rows)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容