zoukankan      html  css  js  c++  java
  • pg_basebackup 配置 stream replication 异步/同步

    os :oel 6.8
    postgresql: 9.6.3

    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数据库上去应用。类似于oracle dg 的 arch 方式

    流复制(streaming replication)的方法,这是PostgreSQL9.0才提供的新方法。
    这个方法就是事务提交后,就会把生成的日志异步的传送到standby数据库上应用,
    这比基本文件的日志传送方法有更低的数据延迟。类似于oracle dg 的 lgwr sync/async 方式

    master 库创建复制用户

    master库参数调整

    $ vi postgresql.conf
    
    alter system set listen_addresses = '0.0.0.0';
    alter system set port = '5432';
    
    alter system set wal_level = 'logical';
    alter system set fsync = on;
    alter system set synchronous_commit = on;
    alter system set wal_sync_method = fdatasync;
    alter system set full_page_writes = on;
    alter system set wal_log_hints = on;
    
    alter system set wal_keep_segments = '100';
    alter system set max_wal_senders = '10';
    
    alter system set hot_standby = 'on';
    
    alter system set archive_mode = 'on';
    alter system set archive_command = 'cp %p /mnt/pgarchive/%f < /dev/null';
    alter system set archive_timeout = '300';
    

    listen_addresses = ‘*’ 表示在所有的ipv4、ipv6地址上添加监听
    listen_addresses = ‘0.0.0.0’ 表示在所有的ipv4地址上添加监听

    master库重启

    $ pg_ctl stop -m fast -D /var/lib/pgsql/9.6/main/
    $ pg_ctl start -D /var/lib/pgsql/9.6/main/
    

    master机器上,创建 replicator 用户:

    $ psql
    CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'pass0rd';
    
    

    master库修改 pg_hba.conf 文件

    $ vi pg_hba.conf
    host     replication     replicator        192.168.56.0/24         md5
    
    
    $ psql -c "select pg_reload_conf();"
    

    说明允许用户postgres 从192.168.56.0/24 网络上发起到本地数据库的流复制,使用md5

    master切换日志

    $ psql -c "select pg_switch_xlog();"
    

    slave库参数调整

    postgresql停止的前提下,删除data目录的内容:

    $ rm -rf /var/lib/pgsql/9.6/main/
    

    slave库修改参数

    $ vi postgresql.conf
    
    wal_level = 'logical'
    fsync = on
    synchronous_commit = on
    wal_sync_method = fdatasync
    full_page_writes = on
    wal_log_hints = on
    
    wal_keep_segments = '100'
    max_wal_senders = '10'
    hot_standby = 'on'
    

    slave库执行 pg_basebackup 拉取文件

    $ pg_basebackup -h 192.168.56.201 -D /var/lib/pgsql/9.6/main/ -U replicator -v -P -R
    
    -D, --pgdata=DIRECTORY receive base backup into directory
    -v, --verbose          output verbose messages
    -P, --progress         show progress information
    -R, --write-recovery-conf  write recovery.conf for replication
    

    slave库ecovery.conf文件

    $ vi /var/lib/pgsql/9.6/main/recovery.conf
    
    #restore_command = ''
    #archive_cleanup_command = ''
    standby_mode = 'on'
    recovery_target_timeline = 'latest'
    primary_conninfo='host=192.168.56.201 port=5432 user=replicator password=pass0rd'
    trigger_file = '/tmp/postgresql.trigger'
    
    

    slave启动服务

    $ pg_ctl start -D /var/lib/pgsql/9.6/main/
    

    数据验证

    master端查看replication状态

    select * from pg_stat_replication ;
    select client_addr,
               pg_xlog_location_diff(sent_location, write_location) as write_delay,
               pg_xlog_location_diff(sent_location, flush_location) as flush_delay,
               pg_xlog_location_diff(sent_location, replay_location) as replay_delay 
      from pg_stat_replication;
    

    同步复制

    alter system set synchronous_commit = 'on';
    alter system set synchronous_standby_names = '*';    
    
    pg_ctl restart -D /var/lib/pgsql/9.6/main/
    
    pg_ctl reload -D /var/lib/pgsql/9.6/main/
    select pg_reload_conf();
    

    slave端也要修改 recovery.conf

    primary_conninfo = 'host=192.168.56.201 port=5432 user=replicator password=pass0rd application_name=node2'
    

    增加了 application_name=node2
    不过采用同步的方式最好配置多台slave,防止单台slave宕机导致master上无法执行事务

    alter system set synchronous_standby_names = 'node2,node3'; 
    或者
    alter system set synchronous_standby_names = '*'; 
    
  • 相关阅读:
    推荐一个SAM文件中flag含义解释工具--转载
    字节码技术
    Jconsole工具检测堆内存变化的使用
    观察者模式
    装饰器模式(IO流案例)
    JVM垃圾收集器
    内存溢出与内存泄漏区别
    栈溢出
    内存溢出
    JVM参数调优
  • 原文地址:https://www.cnblogs.com/ctypyb2002/p/9792901.html
Copyright © 2011-2022 走看看