主备切换
假设主库崩溃了,备库如何从只读状态切换为读写状态呢?只要把备库的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 #退出
测试:
在主数据库创建一个数据库, 或者导入,或者修改数据, 然后在从数据库查看