zoukankan      html  css  js  c++  java
  • postgresql数据库异步流复制hot standby环境搭建

    生命不息,test不止。

    最近组里面修改了几个postgresql的bug,要进行回归测试,除了前面提到的WAL的RT测试和Mirroring Controller的RT测试,还要测试下postgresql的hot standby功能。

    要进行该项测试,就要首先搭建hot standby环境。

    本文主要记录下搭建hot standby环境的过程以及其中遇到的问题及解决方法。

    首先介绍下系统环境:

    操作系统:RHEL_6_x64
    postgresql版本:9.5.4
    

    首先至少要有两台机器,其次这两台机器都安装了postgresql(postgresql的编译安装见本人的这篇博客)。当然了,postgres账号也是要的。还有一些基础的软件包也是要安装的,这里不赘述了。

    好的言归正传,进入hot standby环境的搭建。

    我的实例环境如下:

    主服务器:IP(192.168.2.130) 数据目录(/home/postgres/data)

    从服务器:IP(192.168.2.128) 数据目录(/file1/database/data)

    1 建立主数据库

    mkdir -p /home/postgres/data                        #创建放置数据库的文件夹
    initdb –D /home/postgres/data                       #初始化数据库
    

    修改data文件夹下的postgresql.conf文件:

    
    listen_addresses = '0.0.0.0'
    port = 54321                                         #设置监听端口,只要不冲突即可
    wal_level = hot_standby
    max_wal_senders = 30
    

    修改data/pg_hba.conf

    host    replication     postgres             192.168.2.0/24         trust
    

    注意,我这样是允许192.168.2.0/24这个网段的主机都可以连接到本台服务器。

    如果你想指定某个特定用户,用xxx.xxx.xxx.xxx/32即可。


    2 启动主数据库

    输入以下命令启动数据库:

    pg_ctl -D /file1/database/data -l logfile  start
    

    输入命令后应该会显示以下消息:

    我们测试下数据库是否启动成功:

    psql -d postgres
    

    如下图所示

    说明数据库成功启动!


    3 数据备份

    数据备份的话有两种方法,一种是停库备份,即先让数据库进入备份模式再将数据库目录复制过去,另外一种是使用pg_basebackup命令,不用进入备份模式。

    3.1 基础备份方式

    进入psql命令行,执行:

    postgres=# select pg_start_backup('databackup',true);
    

    使用这个命令后,所有请求在写日志之后不会再刷新到磁盘。直到执行pg_stop_backup()这个函数。

    这个时候就把主数据库上的data目录拷贝到从数据库上吧。
    你可以直接拷贝过去,也可以使用scp命令:

    scp -r /home/postgres/data postgres@192.168.2.128:/file1/database/
    


    这里输入192.168.2.128上的postgres用户的密码。

    拷贝过去后,例如拷贝到/file1/database/data目录,那么在从库的data目录下,修改postgresql.conf文件:

    port = 54321       #改成你想要的端口,不一定要和主库一样
    hot_standby = on   #
    

    同时,在从库的目录下增加一个recovery.conf文件,这个文件的模板可以在从库服务器的postgresql的安装目录下找到。修改recovery.conf文件:

    standby_mode = on
    primary_conninfo = 'host=192.168.2.130(就是主数据库的IP) port=54321(主数据库监听端口) user=postgres(登录用户)'
    

    括号里的东西只是提示,不要真的写进文件哦~
    最后,要删除从库目录下的postmaster.pid文件:

    rm -f postmaster.pid
    

    然后切换回主数据库,在psql命令行输入:

    postgres=# select pg_stop_backup();
    

    退出备份模式。

    是不是感觉很麻烦,所以我推荐下面这种方法。

    3.2 使用pg_basebackup命令备份

    pg_basebackup命令是postgresql 9.x之后才有的命令,具体命令的语法和各个参数的意义见用户手册

    在从数据库上的数据库目录(/file1/database/data)下使用pg_basebackup命令备份:

    pg_basebackup -h 192.168.2.130 -U postgres -F p -P -x -R -D /file1/database/data -l backup20161021
    

    拷贝完毕后,修改从库的postgresql.conf文件:

    port = 54321       #改成你想要的端口,不一定要和主库一样
    hot_standby = on   #
    

    因为在pg_basebackup命令中使用了-R参数,所以生成了recovery.conf文件,不需要我们再制作了。

    这就OK了。


    4 启动从数据库

    在从库上使用pg_ctl 命令:

    pg_ctl -D /file1/data  -l logfile start
    

    这样环境就搭好了。

    这里演示的是一台主数据库,一台从数据库的hot standby的环境搭建。你要搭建多个从服务器的话操作也是类似,这里不再赘述。

    5 要注意的问题(坑)

    5.1 环境变量

    环境变量要设置好,例如:

    PGPORT(数据库的监听端口)
    PATH(可执行文件的路径)
    LD_LIBRARY_PATH(链接库的路径)
    PGDATA(数据库文件路径)
    

    不设置好的话,可能会报一些奇怪的错误。

    2016.11.14补充:请记得数据库文件夹的访问权限必须是700,否则服务无法启动!

    5.2 参数设置

    这里主要是指postgresql.conf文件和pg_hba.conf文件。这里面设置了postgresql里面大多数重要的参数。

    一般在修改后要重启数据库或者reload下配置文件:

    pg_ctl reload
    

    5.3 操作顺序

    还是建议严格按照操作顺序进行环境的搭建,尤其是在数据备份操作时尤其要小心,否则会导致很多“奇怪”的错误,尤其是WAL日志和archive的错误,这也是楼主走过的坑,希望大家不要再趟。还有最好使用脚本来进行操作,避免在大量重复的操作中出错,这里也引用一篇相关文章好了:

    PostgreSQL系统级冷备份和archive备份(shell文件)

    6 展望

    本次简单的搭建了postgresql的异步流复制hot standby的环境,实际还有同步流复制,主备份切换等,这个留在后面的博客里面再写吧。

  • 相关阅读:
    解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题
    qemu vm setup network(ssh) with buildroot
    C: 当字符数组首指针转化成char *指针,sizeof(*ptr)不为array的size
    C 利用strtok, feof 截取字符串
    LINUX C: 获取本地指定网卡的IP地址
    C语言比较好的风格梳理
    perf-perf stat用户层代码分析
    内核调试-perf introduction
    内核调试-ftrace introduction
    【原创】VB6.0应用程序安装包的生成(Setup Factory 9.0制作安装包的方法)
  • 原文地址:https://www.cnblogs.com/flying-tiger/p/5969921.html
Copyright © 2011-2022 走看看