之前在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
lsof -i:5432
[postgres@master data]$
master机器上
首先需要创建一个postgres用户的工作环境, 原有的/usr/local/pgsql_10.5/data由于父目录是root的权限, 需要多余的操作, 这个数据库集簇就放在postgres的home目录内.
但是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=
PG_HOME/bin
export LD_LIBRARY_PATH=
PG_HOME/lib
export MANPATH=
PG_HOME/share/man
#export PGDATA=
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
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=
PG_HOME/bin
export LD_LIBRARY_PATH=
PG_HOME/lib
export MANPATH=
PG_HOME/share/man
#export PGDATA=
PGDATA/log
确保数据库集簇不存在, 然后通过命令从主库进行拷贝
1
2
3
4
5
[postgres@slave1 ~]$ rm -rf
pg_basebackup -h master -p 5432 -U postgres -D $PGDATA -l
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/