zoukankan      html  css  js  c++  java
  • 【转载】PostgreSQL Hot Standby 天高地厚

    一、简介

       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

    四、实例分析

       主数据库:

       Standby数据库:

       主数据库的数据目录为:/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

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

       对主数据库做一个基础备份:

       先用select pg_start_backup();命令把数据库切换到备份状态。

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

       查看standby备库目录:

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

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

    hot_standby = on

       把其中的hot_standby设置为on。

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

       删除原先从主库上过来的/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)
    复制代码

       可以看到数据已经同步到了备库,基本上感觉不到延迟。

  • 相关阅读:
    数据增强
    变态跳台阶
    跳台阶
    数据分析--简单回测框架开发
    数据分析--羊驼交易法则(选股)
    数据分析--动量策略vs反转策略(选股)
    数据分析--PEG策略(选股)
    数据分析--布林带策略(择时)
    数据分析--均值回归策略(选股)
    数据分析--单因子选股策略、多因子选股策略(选股)
  • 原文地址:https://www.cnblogs.com/net2012/p/2901511.html
Copyright © 2011-2022 走看看