设为首页 收藏本站
查看: 919|回复: 0

[经验分享] PostgreSQL Hot Standby

[复制链接]

尚未签到

发表于 2016-11-21 08:21:06 | 显示全部楼层 |阅读模式
  一、简介

     PostgreSQL数据库提供了类似Oracle的standby数据库的功能。PostgreSQL9.0 standby数据库在应用WAL日志的同时,也可以提供只读服务,这是PostgreSQL9.0中最激动人心的功能,这个功能在oracle数据库中也只是最新版本11g中才有的新功能。这个功能在oracle中叫active dataguard,在PostgreSQL中称为hot standby。在利用日志恢复数据的同时可以用只读的方式打开数据库,用户可以在备用数据库上进行查询、报表等操作,也可用做读写分离。在PostgreSQL9.0之前,也可以搭建standby数据库,但standby数据库只能处于恢复状态中,不能打开,也不支持只读打开。而这种情况在9.0之后彻底改变了。
     PostgreSQL 9.0中日志传送的方法有两种:
     基于文件(base-file)的传送方式,这种方式是PostgreSQL9.0之前就提供的方法。也就是服务器写完一个WAL日志文件后,才把WAL日志文件拷贝到standby数据库上去应用。
     流复制(streaming replication)的方法,这是PostgreSQL9.0才提供的新方法。这个方法就是事务提交后,就会把生成的日志异步的传送到standby数据库上应用,这比基本文件的日志传送方法有更低的数据延迟。
  二、设置步骤

     基于文件(base-file)的传送方式在PostgreSQL8.X中就有的方式,这里不就介绍了,这里主要介绍流复制的standby的搭建方法,设置步骤如下:
     对主数据库做一个基础备份,然后把基础备份拷贝到standby机器,把基础备份恢复到standby机器上。
     1、在主库上设置wal_level = hot_standby。
     2、在主数据库上设置wal_keep_segments为一个足够大的值,以防止主库生成WAL日志太快,日志还没有来得及传送到standby,就会循环覆盖了;
     3、在主数据库上设置max_wal_sender参数,这个参数是控制主库可以最多有多少个并发的standby数据库;
     4、在主数据库上建一个超级用户,standby数据库会使用这个用户连接到主库上拖WAL日志。
     5、在主数据库上的pg_hba.conf中设置listen_addresses和连接验证选项,允许standby数据库连接到主库上来拖WAL日志数据,如下所示:



   # TYPE DATABASE USER CIDR-ADDRESS METHOD
host    replication     postgres        10.0.0.136/8              md5
     其中数据库名必须填“replication”, 这是一个为standby连接使用了一个虚拟的数据库名称。用户postgres就是步骤4上给standby连接使用的在主库上建的一个超级用户。10.0.0.136就是standby数据库的IP地址。
     6、在备份上建一个recovery.conf,设置以下几项:



standby_mode = 'on'
primary_conninfo = 'host=127.0.0.1 port=5432 user=postgres password=123456'
trigger_file = '/opt/pgstb/trigger_standby'
     standby_mode设置为'on',表明数据库恢复完成后,不会被断开,仍然处理等待日志的模式。
     primary_conninfo上standby连接到主数据库所需要的连接串。
     7. 启动standby数据库,这样standby数据库就算搭建好了。
  三、系统环境

     系统平台:Suse 11.4
     PostgreSQL版本:9.0.3
  四、实例分析
     主数据库:


DSC0000.jpg

     Standby数据库:


DSC0001.jpg

     主数据库的数据目录为:/var/lib/pgsql/data,standby数据库的数据目录为/var/lib/pgsql/data。
     在主数据库的/var/lib/pgsql/data/postgresql.conf文件中设置如下配置项:



wal_level = hot_standby
max_wal_senders = 2
wal_keep_segments = 32
     在主数据库中的/var/lib/pgsql/data/pg_hba.conf中添加如下配置:



host    replication     postgres        10.0.0.136/8              md5
     在数据库中建一个postgres用户用于给standby连接主库使用:



#psql -d postgres

postgres=# create user postgres superuser password '123456';

CREATE ROLE
     重新启动主数据库,让配置生效:


DSC0002.jpg

     对主数据库做一个基础备份:
     先用select pg_start_backup();命令把数据库切换到备份状态。


DSC0003.jpg

     把主数据库目录拷贝到备库目录就可以了:


DSC0004.jpg

DSC0005.jpg

     查看standby备库目录:


DSC0006.jpg

     拷贝完成后,结束主库的备份状态:


DSC0007.jpg

     修改备库的配置文件/var/lib/pgsql/data/postgresql.conf文件中的相关项为如下内容:



hot_standby = on
     把其中的hot_standby设置为on。
     拷贝示例文件/usr/share/postgresql/recovery.conf.sample到/var/lib/pgsql/data目录下,然后改名成recovery.conf,修改相关的配置项为如下内容:




DSC0008.jpg

     删除原先从主库上过来的/var/lib/pgsql/data/postmaster.pid文件,然后启动备库:



   linux-david:/var/lib/pgsql/data # rm postmaster.pid
linux-david:/var/lib/pgsql/data # export PGDATA=/var/lib/pgsql/data
linux-david:/var/lib/pgsql/data # echo $PGDATA
/var/lib/pgsql/data
linux-david:/var/lib/pgsql/data # service postgresql start
server starting
linux-david:/var/lib/pgsql/data # LOG: database system was interrupted; last known up at 2010-08-21 22:43:04 CST
LOG: entering standby mode
LOG: redo starts at 0/1000020
LOG: record with zero length at 0/10000B0
LOG: streaming replication successfully connected to primary
LOG: consistent recovery state reached at 0/2000000
LOG: database system is ready to accept read only connections
     这时可以看到备库已经可以接受只读连接了。
  
     在主库上做一些操作:



   linux-david:/var/lib/pgsql/data # psql -p 5432 -d postgres
psql (9.0beta4)
Type "help" for help.

postgres=# create table t (id int primary key,name varchar(20));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_pkey" for table "t"
CREATE TABLE

postgres=# insert into t values (1,'xxxxxxx');
INSERT 0 1
postgres=# insert into t values (2,'xxxxxxx');
INSERT 0 1
postgres=#
  
     然后在备库上看是否同步到了备库:



   linux-david:/var/lib/pgsql/data # psql -p 5432 -d postgres
psql (9.0beta4)
Type "help" for help.
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
public | t | table | osdba
(1 row)

postgres=# select * from t;
id | name
----+---------
1 | xxxxxxx
2 | xxxxxxx
(2 rows)
      可以看到数据已经同步到了备库,基本上感觉不到延迟。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303162-1-1.html 上篇帖子: PostgreSQL+PostGIS的使用 下篇帖子: PostgreSQL学习手册(函数和操作符<三>)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表