postgresql搭建hotstandby环境

之前在master机器上使用源码安装了postgresql, 现在搭建hotstandby环境实现热备, 需要两台以上环境, 所以再在slave1上也同位置安装了postgresql.

standby可以有多台, 与两台的情况没有什么区别

一. postgresql的hotstandby

PostgreSQL数据库从9.x开始提供了standby的功能, standby数据库通过WAL日志(Write-Ahead-Logging)来对master数据库进行流复制(相比拷贝日志的方法有更低的延迟), 实现热备. 与此同时 ,standby数据库是只读形式, 可以实现读写分离.

我的两台机器,hostname一台master, 一台slave1, 都是设置了hosts的, 各位如果想弄需要换成各自的ip或者hostname

master: 192.168.148.131

slave1: 192.168.148.129

二. 开始操作

关闭master和slave1上的原有数据库集簇, 确保5432端口没有被占用.

1
2
3
4
5
[postgres@master data]$ pg_ctl stop -l P G L O G w a i t i n g f o r s e r v e r t o s h u t d o w n . . . . d o n e s e r v e r s t o p p e d [ p o s t g r e s @ m a s t e r d a t a ] PGLOG waiting for server to shut down.... done server stopped [postgres@master data] lsof -i:5432
[postgres@master data]$
master机器上

首先需要创建一个postgres用户的工作环境, 原有的/usr/local/pgsql_10.5/data由于父目录是root的权限, 需要多余的操作, 这个数据库集簇就放在postgres的home目录内.

扫描二维码关注公众号,回复: 5748130 查看本文章

但是postgres用户配置sudo权限还是必要的

1
2
3
4
[postgres@master data]$ cd ~
[postgres@master ~]$ pwd
/home/postgres
[postgres@master ~]$ mkdir data
这个data目录就是我们将要备份的数据库集簇了.配置环境变量

1
2
3
4
5
6
7
8
9

potgres

postgresql

export PG_HOME=/usr/local/pgsql_10.5
export PATH= P A T H : PATH: PG_HOME/bin
export LD_LIBRARY_PATH= L D L I B R A R Y P A T H : LD_LIBRARY_PATH: PG_HOME/lib
export MANPATH= M A N P A T H : MANPATH: PG_HOME/share/man
#export PGDATA= P G H O M E / d a t a e x p o r t P G D A T A = / h o m e / p o s t g r e s / d a t a e x p o r t P G L O G = PG_HOME/data export PGDATA=/home/postgres/data export PGLOG= PGDATA/log
初始化数据库集簇并修改postgresql.conf配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[postgres@master ~]$ pg_ctl -l $PGLOG initdb

Success. You can now start the database server using:

/usr/local/pgsql_10.5/bin/pg_ctl -D /home/postgres/data -l logfile start

[postgres@master ~]$ cd data/
[postgres@master data]$ cp postgresql.conf postgresql.conf.bak
[postgres@master data]$ vim postgresql.conf
[postgres@master data]$ diff postgresql.conf.bak postgresql.conf
59c59
< #listen_addresses = ‘localhost’ # what IP address(es) to listen on;

listen_addresses = ‘*’ # what IP address(es) to listen on;
180c180
< #wal_level = replica # minimal, replica, or logical


wal_level = hot_standby # minimal, replica, or logical
235c235
< #max_wal_senders = 10 # max number of walsender processes


max_wal_senders = 2 # max number of walsender processes
237c237
< #wal_keep_segments = 0 # in logfile segments, 16MB each; 0 disables


wal_keep_segments = 16 # in logfile segments, 16MB each; 0 disables
主要改了四处:

listen_addresses = ‘*’ #这个不必说, 监听来自所有ip的连接请求
wal_level = hot_standby #还有一个配置hot_standby = on, 似乎默认开启, 这里就没设置
max_wal_senders = 2 #允许的standby数据库的个数, 10.5默认是10个, 这里不改也可以
wal_keep_segments = 16 #这个是wal日志的个数, 一个16m, 循环覆盖.
一般设置尽量多, 防止wal还未同步到standby就已经被覆盖, 其存储目录是$PGDATA/pg_wal .

修改pg_hba.conf的相关监听设置

1
2
3
4
5
cp pg_hba.conf pg_hba.conf.bak
cat >> pg_hba.conf << EOF

hotstandby

host replication postgres 192.168.148.129/32 md5
EOF
表示允许standby库可以通过postgres用户来拉取wal日志.

启动master数据库

1
2
3
4
5
6
7
[postgres@master data]$ pg_ctl start -l P G L O G w a i t i n g f o r s e r v e r t o s t a r t . . . . d o n e s e r v e r s t a r t e d [ p o s t g r e s @ m a s t e r d a t a ] PGLOG waiting for server to start.... done server started [postgres@master data] lsof -i:5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 19552 postgres 3u IPv4 100314 0t0 TCP *:postgres (LISTEN)
postgres 19552 postgres 4u IPv6 100315 0t0 TCP *:postgres (LISTEN)
slave1机器上

配置好环境变量

1
2
3
4
5
6
7
8
9

potgres

postgresql

export PG_HOME=/usr/local/pgsql_10.5
export PATH= P A T H : PATH: PG_HOME/bin
export LD_LIBRARY_PATH= L D L I B R A R Y P A T H : LD_LIBRARY_PATH: PG_HOME/lib
export MANPATH= M A N P A T H : MANPATH: PG_HOME/share/man
#export PGDATA= P G H O M E / d a t a e x p o r t P G D A T A = / h o m e / p o s t g r e s / d a t a e x p o r t P G L O G = PG_HOME/data export PGDATA=/home/postgres/data export PGLOG= PGDATA/log
确保数据库集簇不存在, 然后通过命令从主库进行拷贝

1
2
3
4
5
[postgres@slave1 ~]$ rm -rf P G D A T A [ p o s t g r e s @ s l a v e 1   ] PGDATA [postgres@slave1 ~] pg_basebackup -h master -p 5432 -U postgres -D $PGDATA -l P G L O G P a s s w o r d : [ p o s t g r e s @ s l a v e 1   ] PGLOG Password: [postgres@slave1 ~] ls
data
这里按道理会有拷贝的进度的, 不知道什么原因, 拷贝成功是成功了, 但是没有进度显示, 很尴尬.

创建一个recovery.conf, 用于与master进行连接

1
2
3
4
cat > $PGDATA/recovery.conf << EOF
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.148.131 port=5432 user=postgres password=postgres’
EOF
启动standby数据库

1
[postgres@slave1 ~]$ pg_ctl start -l $PGLOG
查看连接状态

master机器上, 在从库还没有启动standby的时候, 其端口进程显示如下

1
2
3
4
[postgres@master data]$ lsof -i:5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 19552 postgres 3u IPv4 100314 0t0 TCP *:postgres (LISTEN)
postgres 19552 postgres 4u IPv6 100315 0t0 TCP *:postgres (LISTEN)
在从库启动起来后, 其端口进程显示如下

1
2
3
4
5
[postgres@master data]$ lsof -i:5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 19552 postgres 3u IPv4 100314 0t0 TCP *:postgres (LISTEN)
postgres 19552 postgres 4u IPv6 100315 0t0 TCP *:postgres (LISTEN)
postgres 19837 postgres 9u IPv4 103430 0t0 TCP master:postgres->slave1:35400 (ESTABLISHED)
从表象来看, 我们的hotstandby环境应该是搭建好了.

不是很放心, 再查看从库slave1上的相关进程, 的确是基于流式的hotstandby环境

1
2
3
4
5
6
7
8
9
[postgres@slave1 ~]$ ps -ef | grep postgres

postgres 47771 1 0 18:15 pts/0 00:00:00 /usr/local/pgsql_10.5/bin/postgres
postgres 47772 47771 0 18:15 ? 00:00:00 postgres: startup process recovering 000000010000000000000003
postgres 47773 47771 0 18:15 ? 00:00:00 postgres: checkpointer process
postgres 47774 47771 0 18:15 ? 00:00:00 postgres: writer process
postgres 47775 47771 0 18:15 ? 00:00:00 postgres: stats collector process
postgres 47776 47771 0 18:15 ? 00:00:00 postgres: wal receiver process streaming 0/3000140

三. 流复制, 读写检验

在master上创建数据库, 创建表, 并插入数据.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[postgres@master data]$ psql
psql (10.5)
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 standbytest(tid integer not null);
CREATE TABLE
test=# insert into standbytest values(1);
INSERT 0 1
test=# select * from standbytest;
tid

1
(1 row)

test=#
这时候看slave1的standby库, 是否流复制过来了, 是否可以进行插入.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[postgres@slave1 ~]$ psql
psql (10.5)
Type “help” for help.

postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------±---------±---------±------------±------------±----------------------
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
test | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
(4 rows)

postgres=# \c test
You are now connected to database “test” as user “postgres”.
test=# select * from standbytest;
tid

1
(1 row)

test=# insert into standbytest values(2);
ERROR: cannot execute INSERT in a read-only transaction
test=#
emmm , 很完美, postgresql yes!

  大连妇科检查多少钱 http://mobile.0411bh.com/

  大连哪家医院的男科好 http://mobile.lnbohaink.com/

  大连那里治男科好 http://mobile.0411nk.cn/

猜你喜欢

转载自blog.csdn.net/qq_42894764/article/details/88970202