postgres 异步standby 创建
说明
1、如果要求及时性不是很高(前后几秒钟的差距),那么建议使用postgres的备份数据库可以是异步流复制STANDBY。
2、主节点指的是生产库,standby指的是备份库
3、如无说明,”#”代表root用户,”$”代表osdba用户
问题
1、该测试是在postgres9.3系列完成,已知在postgres9.0系列才开始流复制概念
2、该测试没有测试表空间为自己创建时(默认只有的表空间)的迁移情况,所以迁移时要注意
环境
操作系统:CentOS release 6.5 (Final)
数据库:postgres (9.3.13)
异步standby创建
1、以主节点的相关信息为模板,新建和主节点类似的服务器
略过
2、检查主节点的编译环境
$ pg_config --configure
'--prefix=/usr/local/pgsql' '--with-perl' '--with-python'
3、在standby节点模仿主节点进行编译工作,进行三板斧操作
# ./configure --prefix=/usr/local/pgsql --with-perl --with-python
# make
# make install
4、模仿主节点创建用户名密码,以及.bash_profile环境
略过
5、在主节点创建用户拥有权限replication
$ psql -d postgres
=# create role replica login REPLICATION ENCRYPTED PASSWORD 'replica
6、修改主节点的pg_hba.conf
$ cd $PGDATA
$ vim pg_hba.conf
host replication replica 192.168.1.0/24 md5
7、修改主节点的postgresql.conf
$ cd $PGDATA
$ vim postgresql.conf
listen_addresses = '*'
max_wal_senders = 32
wal_keep_segments = 256
wal_level = hot_standby
hot_standby = on
8、standby节点执行基础备份
$ pg_basebackup -F p -D $PGDATA -R -x -h 192.168.1.36 -p 5432 -U replica
$ ls -ls $PGDATA
9、检查并修改standby节点的recovery.conf
$ vim $PGDATA/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=replica password=replica host=192.168.1.36 port=5432 sslmode=disable sslcompression=1'
如果符合上文中standby执行基础备份的脚本密码,就不需要修改
10、启动standby节点并检查进程
$ pg_ctl start
$ psql
$ ps -ef|grep postgres
11、测试
1、主节点和standby是否同步
在主节点上创建一张表,并插入数据,测试standby是否存在表和数据
[osdba@pg36 data]$ psql
psql (9.3.13)
Type "help" for help.
osdba=# create table t_1(id int,info text);
CREATE TABLE
osdba=# insert into t_1 select generate_series(1,1000),'good';
INSERT 0 1000
[osdba@pg37 data]$ psql
psql (9.3.13)
Type "help" for help.
osdba=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
public | t_1 | table | osdba
(1 row)
osdba=# select count(1) from t_1;
count
-------
1000
(1 row)
2、standby挂掉后,是否影响主节点使用
当备机挂掉时,并不影响主机的正常的使用,等备机重新启动时,自动将数据同步
[osdba@pg37 data]$ pg_ctl stop
waiting for server to shut down.... done
server stopped
[osdba@pg36 data]$ psql
psql (9.3.13)
Type "help" for help.
osdba=# insert into t_1 select generate_series(1,1000),'good';
INSERT 0 1000
osdba=# insert into t_1 select generate_series(1,1000),'good';
INSERT 0 1000
[osdba@pg37 data]$ pg_ctl start
server starting
[osdba@pg37 data]$ psql
psql (9.3.13)
Type "help" for help.
osdba=# select count(1) from t_1;
count
-------
3000
(1 row)
3、主节点挂掉后,是否影响standby节点使用
当主机挂掉时,备机是否可以读取数据,但不允许插入更改数据
[osdba@pg37 data]$ psql
psql (9.3.13)
Type "help" for help.
osdba=# select count(1) from t_1;
count
-------
3000
(1 row)
osdba=# insert into t_1 values(1,'1');
ERROR: cannot execute INSERT in a read-only transaction