postgresql 主从配置_postgresql主从配置

主备切换

假设主库崩溃了,备库如何从只读状态切换为读写状态呢?只要把备库的postgresql.conf中hot_standby修改为off,并且删除recovery.conf,然后重启库就可以提供服务了。

PostgreSQL HOT-Standby 的主备切换 http://francs3.blog.163.com/blog/static/405767272011724103133766/

PostgreSQL的HA(主备切换) http://my.oschina.net/Kenyon/blog/98217

http://blog.csdn.net/feixiangtianshi/article/details/49151911

Postgresql的流复制是异步的,异步的缺点是Standby上的数据落后于主库上的数据,如果使用Hot Standby做读写分离,就会存在数据一致性的问题,对于一些一致性高的应用来说是不可接受的。所以PG从9.1之后提供了同步流复制的架构。同步复制要求在数据写入Standby数据后,事务的commit才返回,所以Standby库出现问题时,会导致主库被Hang住。解决这个问题的方法是启动两个standby数据库,这两个Standby数据库只有有一个是正常的,就不会让主库Hang住。所以在实际应用中,同步流复制,总是有一个主库和2个以上的Standby库。

主从流复制配置过程

环境: Centos 6.8, Postgresql 9.5

前提: 两个服务器都正确安装postgresql数据库.

以下是自己的配置过程:

配置主服务器:192.168.0.55

先创建用来做复制的账户:

1

2

3

psql-Upostgres  #输入密码postgres_20121218 , 然后执行

postgres# CREATE ROLE replica login replication encrypted password 'replica';

postgres# \q 退出

修改配置:

1

vi/var/lib/pgsql/9.5/data/pg_hba.conf

增加对从数据库账户的流访问,同时创建一个账户给从数据库使用, 同时配置对流复制的支持, 有多台从服务器,就创建多条记录.

1

2

3

hostreplicationreplica192.168.0.66/24md5

#host replication replica 192.168.0.77/24 md5

#host replication replica 192.168.0.88/24 md5

1

vi/var/lib/pgsql/9.5/data/postgresql.conf

1

2

3

4

5

6

7

#如果多个就使用逗号隔开 synchronous_standby_names ='standby01,standby02,standby03'

synchronous_standby_names='standby01'

wal_level=hot_standby# 这个是设置主为wal的主机

max_wal_senders=32# 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个

wal_keep_segments=256#设置流复制保留的最多的xlog数目

wal_sender_timeout=60s#设置流复制主机发送数据的超时时间

max_connections=100# 这个设置要注意下,从库的max_connections必须要大于主库的

1

servicepostgresql-9.5restart

配置从服务器:192.168.0.66

===========================================================================

先停止:必须停止,否则很难成功

1

servicepostgresql-9.5stop

清除以前数据库原有的信息和文件: 保证两个服务器的文件已知

1

2

3

4

cd/var/lib/pgsql/9.5/data

rm-rf *

cd/var/lib/pgsql/9.5/tb_spance//如果已经有表空间,先删除

rm-rf *

1

2

3

4

5

6

7

pg_basebackup-Fp--progress-D/var/lib/pgsql/9.5/data-h192.168.0.55-p5432-Ureplica--password

#如果存在跟主一样的表空间,请先删除表空间, 要求输入主数据库配置的密码 replica ,

#如果提示无法链接服务器, 请多重启主服务的postgresql几次

口令:

22490/22490kB(100%),2/2表空间

注意:没有启用WAL归档;您必须确保所有的WAL段已通过其他的方法拷贝,这样才能完成备份

cd/var/lib/pgsql/9.5/data

1

cp/usr/pgsql-9.5/share/recovery.conf.sample/var/lib/pgsql/9.5/data/recovery.conf

1

vi/var/lib/pgsql/9.5/data/recovery.conf

追加访问主数据库的配置

1

2

3

standby_mode=on

primary_conninfo='application_name=standby01 host=192.168.0.55 port=5432 user=replica password=replica'

recovery_target_timeline='latest'

1

vi/var/lib/pgsql/9.5/data/pg_hba.conf

增加, 因为是复制过来,所以需要修改和注释掉没必要的复制信息

————————————————————————

1

2

3

hostallall192.168.0.66/24md5

......

#host replication replica 192.168.0.66/24 md5

1

vi/var/lib/pgsql/9.5/data/postgresql.conf

配置从数据库访问主数据库的一般信息

1

2

3

4

5

6

synchronous_commit=off# 这个参数说明: http://blog.chinaunix.net/uid-20726500-id-5695414.html

max_connections=1000#一般查多于写的应用从库的最大连接数要比较大

hot_standby=on#说明这台机器不仅仅是用于数据归档,也用于数据查询

max_standby_streaming_delay=30s# 数据流备份的最大延迟时间

wal_receiver_status_interval=1s# 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间

hot_standby_feedback=on# 如果有错误的数据复制,是否向主进行反馈

因为复制过来的权限是root, 要改变成postgres的, 否则出现”postgresql.conf: 权限不够”

1

2

3

4

5

6

7

cd/var/lib/pgsql/9.5/data

chown-Rpostgres:postgres./*

cd/var/lib/pgsql/9.5/tb_spance

chown-Rpostgres:postgres./*

servicepostgresql-9.5restart

查看启动日志:

1

tail-f-n5000/var/lib/pgsql/9.5/pgstartup.log

主服务器:

1

2

ps-ef|grepsender|grep-vgrep

postgres14851389019:24?00:00:00postgres:walsenderprocessreplica192.168.0.66(45966)streaming0/748D830

从服务器:

1

2

ps-ef|grepreceiver|grep-vgrep

postgres15451538019:24?00:00:01postgres:walreceiverprocessstreaming0/748D830

主数据库:

1

psql-Upostgres #输入密码 postgres_20121218

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

postgres=# select * from pg_stat_replication;

pid|usesysid|usename|application_name|client_addr|client_hostname|client_port|backend_start|backend_xmin|state|sent_location

|write_location|flush_location|replay_location|sync_priority|sync_state

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

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

1482|16385|replica|standby01|192.168.0.66||38314|2016-08-3120:32:33.884766+08|4027|streaming|0/447BEB0

|0/447BEB0|0/447BEB0|0/447BEB0|1|sync

(1行记录)

或者

postgres=# select usename, application_name, client_addr, state, sync_priority, sync_state from pg_stat_replication;

usename|application_name|client_addr|state|sync_priority|sync_stat

e

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

--

replica|standby01|192.168.0.66|streaming|1|sync

(1行记录)

1

postgres=# \q #退出

测试:

在主数据库创建一个数据库, 或者导入,或者修改数据, 然后在从数据库查看

你可能感兴趣的:(postgresql,主从配置)