postgres主从流复制 http://www.cnblogs.com/yjf512/p/4499547.html
PostgreSQL超详细主从配置-基于流复制 http://sivxy.lofter.com/post/1d21ebb9_7249538
配置主从PostgreSQL数据库 http://wongyouth.github.io/blog/2014/09/05/configure-postgresql-master-slave-replication/
PostgreSQL HOT-Standby 的主备切换 http://francs3.blog.163.com/blog/static/405767272011724103133766/
主备切换
假设主库崩溃了,备库如何从只读状态切换为读写状态呢?只要把备库的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 -U postgres #输入密码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 |
host replication replica 192.168.0.66/24 md5 #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 |
service postgresql-9.5 restart |
配置从服务器:192.168.0.66
===========================================================================
先停止: 必须停止,否则很难成功
1 |
service postgresql-9.5 stop |
清除以前数据库原有的信息和文件: 保证两个服务器的文件已知
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 -F p --progress -D /var/lib/pgsql/9.5/data -h 192.168.0.55 -p 5432 -U replica --password #如果存在跟主一样的表空间,请先删除表空间, 要求输入主数据库配置的密码 replica , #如果提示无法链接服务器, 请多重启主服务的postgresql几次 口令: 22490/22490 kB (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 |
host all all 192.168.0.66/24 md5 ...... #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 -R postgres:postgres ./* cd /var/lib/pgsql/9.5/tb_spance chown -R postgres:postgres ./* service postgresql-9.5 restart |
查看启动日志:
1 |
tail -f -n5000 /var/lib/pgsql/9.5/pgstartup.log |
主服务器:
1 2 |
ps -ef |grep sender|grep -v grep postgres 1485 1389 0 19:24 ? 00:00:00 postgres: wal sender process replica 192.168.0.66(45966) streaming 0/748D830 |
从服务器:
1 2 |
ps -ef |grep receiver|grep -v grep postgres 1545 1538 0 19:24 ? 00:00:01 postgres: wal receiver process streaming 0/748D830 |
主数据库:
1 |
psql -U postgres #输入密码 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-31 20: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 #退出 |
测试:
在主数据库创建一个数据库, 或者导入,或者修改数据, 然后在从数据库查看
恩,还没正式使用,只是先保留着.
感觉很不错的样子!