上一篇BLOG简单的介绍了一下PostgreSQL广域网的容灾.
http://blog.163.com/digoal@126/blog/static/1638770402013324103828603/
里面介绍的主要是standby搭建好之后的一些注意要点, 本文主要介绍一下广域网搭建standby的注意要点.
广域网对本案影响最大的问题如下 : 
问题1. 带宽
广域网带宽小将致使创建standby的整个数据复制过程变长, 时间越长, 主库在这段时间的变化量也就, xlog文件越多. 
带来的后果是standby基础备份做好后要恢复大量的xlog文件.
如果主库没有对pg_xlog做archive的话, 那么复制可能无效, 因为需要的pg_xlog已经被覆盖了.
解决办法1:
加大主库的wal_keep_segments, 确保基础备份的时间段内pg_xlog不会被覆盖.
解决办法2:
    在主库添加pg_xlog归档. 
解决办法3:
    在备库或其他地方使用pg_receivexlog实时接收主库产生的xlog文件.
以上三种解决办法都是为了保留standby需要的最早的pg_xlog文件开始的所有pg_xlog文件.
问题2. 稳定性
广域网的稳定性也是一个问题, 我这几天在使用pg_basebackup创建standby的过程中发现, 网络会不定期的被断开连接.
断开时在主库看到的日志信息 :

2013-04-27 05:26:14.729 CST,"digoal","",27083,"192.1.1.1:58679",5179c9ad.69cb,4,"sending backup ""pg_basebackup base backup""",2013-04-26 08:26:21 CST,59/0,0,LOG,08006,"could not send data to client: Connection reset by peer",,,,,,,,"internal_flush, pqcomm.c:1253","pg_basebackup"
2013-04-27 05:26:14.729 CST,"digoal","",27083,"192.1.1.1:58679",5179c9ad.69cb,5,"sending backup ""pg_basebackup base backup""",2013-04-26 08:26:21 CST,59/0,0,FATAL,XX000,"base backup could not send data, aborting backup",,,,,,,,"sendFile, basebackup.c:1027","pg_basebackup"
2013-04-27 05:26:14.729 CST,"digoal","",27083,"192.1.1.1:58679",5179c9ad.69cb,6,"sending backup ""pg_basebackup base backup""",2013-04-26 08:26:21 CST,59/0,0,LOG,08006,"could not send data to client: Broken pipe",,,,,,,,"internal_flush, pqcomm.c:1253","pg_basebackup"
2013-04-27 05:26:14.729 CST,"digoal","",27083,"192.1.1.1:58679",5179c9ad.69cb,7,"sending backup ""pg_basebackup base backup""",2013-04-26 08:26:21 CST,59/0,0,FATAL,08006,"connection to client lost",,,,,,,,"ProcessInterrupts, postgres.c:2867","pg_basebackup"
2013-04-27 05:26:14.729 CST,"digoal","",27083,"192.1.1.1:58679",5179c9ad.69cb,8,"sending backup ""pg_basebackup base backup""",2013-04-26 08:26:21 CST,,0,LOG,00000,"disconnection: session time: 20:59:52.949 user=digoal database= host=192.1.1.1 port=58679",,,,,,,,"log_disconnections, postgres.c:4366","pg_basebackup"
原因不明.
尝试了3次使用pg_basebackup做备份, 都断开了, 而且断开时没有明显特点, 传输速率并没有达到最高时断开过, 传输到3%时断开过, 传输到90%时断开过. 
解决办法 : 
使用rsync代替pg_basebackup, 因为pg_basebackup没有断点续传的功能, 每次失败后都要重新来过. 并且pg_basebackup拷贝的文件时间戳不会保留, 所以即使要做断点续传也比较麻烦.
rsync 有几个好处, 1. 它可以保留时间戳, 这样的话如果断掉还可以做断点续传. 因为单个数据文件的大小可以在编译数据库时指定, 默认是1GB. 所以即使断掉, 单个文件最多再多传输1次, 而其他的已经传输完整的文件不需要重传, 即使改变了也不需要重传, 因为可以通过pg_xlog恢复.
需要注意的是rsync如果中途中断, 未传完的临时文件会保留在目的端, 所以全部结束后需要清除这些临时文件. 
临时文件清除参考:
http://blog.163.com/digoal@126/blog/static/163877040201011794210567/
使用rsync注意tcp心跳的设置, 必须要小于经过的所有网络设备的链接超时时间. 否则链接可能被网络设备给关闭掉.
修改客户端 :

/etc/sysctl.conf
net.ipv4.tcp_keepalive_time=90
sysctl -p
建立连接后检查 : 
netstat -anpo|grep ssh
tcp        0      0 127.0.0.1:29568             127.0.0.1:22212             ESTABLISHED 18653/ssh           keepalive (23.06/0/0)
tcp        0      0 127.0.0.1:29571             127.0.0.1:22212             ESTABLISHED 18726/ssh           keepalive (37.48/0/0)
tcp        0      0 127.0.0.1:29570             127.0.0.1:22212             ESTABLISHED 18724/ssh           keepalive (18.71/0/0)
tcp        0      0 127.0.0.1:29573             127.0.0.1:22212             ESTABLISHED 18730/ssh           keepalive (69.39/0/0)
tcp        0      0 127.0.0.1:29572             127.0.0.1:22212             ESTABLISHED 18728/ssh           keepalive (73.43/0/0)
【rsync创建standby举例】
1. 在standby节点创建表空间目录以及$PGDATA目录,pg_xlog等等目录. 修改权限
在主库上获得需要的目录:

postgres@db-192-1-1-5-> cd $PGDATA
postgres@db-192-1-1-5-> pwd
/data02/pg_root
postgres@db-192-1-1-5-> ll|grep pg_xlog
lrwxrwxrwx 1 postgres postgres   27 Dec 13 18:54 pg_xlog -> /data01/pg_xlog
postgres@db-192-1-1-5-> cd $PGDATA/pg_tblspc
postgres@db-192-1-1-5-> ll
lrwxrwxrwx 1 postgres postgres 24 Feb 20 14:22 16387 -> /data09/digoal
lrwxrwxrwx 1 postgres postgres 31 Mar  6 11:11 16388 -> /data06/tbs_digoal_old
lrwxrwxrwx 1 postgres postgres 28 Dec 13 18:55 16381 -> /data03/tbs_digoal
lrwxrwxrwx 1 postgres postgres 32 Dec 13 18:55 16382 -> /data04/tbs_digoal_idx
lrwxrwxrwx 1 postgres postgres 29 Dec 13 18:56 16389 -> /data05/tbs_digoal1
postgres@db-192-1-1-5-> cat $PGDATA/postgresql.conf|grep log_directory
log_directory = '/var/applog/pg_log'               # directory where log files are written,

在standby服务器上创建这些目录:

mkdir -p /data02/pg_root
mkdir -p /data01/pg_xlog
mkdir -p /data09/digoal
mkdir -p /data06/tbs_digoal_old
mkdir -p /data03/tbs_digoal
mkdir -p /data04/tbs_digoal_idx
mkdir -p /data05/tbs_digoal1
mkdir -p /var/applog/pg_log

# 修改为数据库启动用户权限

chown -R postgres:postgres /data02/pg_root
chown -R postgres:postgres /data01/pg_xlog
chown -R postgres:postgres /data09/digoal
chown -R postgres:postgres /data06/tbs_digoal_old
chown -R postgres:postgres /data03/tbs_digoal
chown -R postgres:postgres /data04/tbs_digoal_idx
chown -R postgres:postgres /data05/tbs_digoal1
chown -R postgres:postgres /var/applog/pg_log

# 修改为700

chmod -R 700  /data02/pg_root
chmod -R 700  /data01/pg_xlog
chmod -R 700  /data09/digoal
chmod -R 700  /data06/tbs_digoal_old
chmod -R 700  /data03/tbs_digoal
chmod -R 700  /data04/tbs_digoal_idx
chmod -R 700  /data05/tbs_digoal1
chmod -R 700  /var/applog/pg_log

2. 在standby 节点创建秘钥

postgres@db-192-1-1-1-> ssh-keygen -t rsa

3. 将公钥拷贝到master节点

su - postgres
chmod 700 ~
cd ~/.ssh
vi authorized_keys
#standby节点上~/.ssh/id_rsa.pub内容拷贝到这里
chmod 700 ~/.ssh
chmod 400 ~/.ssh/authorized_keys

# 确保master节点允许公钥验证.

[root@db-192-1-1-5 ~]# cat /etc/ssh/sshd_config |grep Pub
PubkeyAuthentication yes

# 如果如果有超时关闭连接的设备, 建议建立隧道.

ssh -o ServerAliveInterval=90 -o ServerAliveCountMax=60 -o CompressionLevel=9 -p remote_direct_ip_ssh_port -CqTfnN -L *:10022:remote_dest_ip:remote_dest_ssh_port postgres@remote_direct_ip

4. 在standby 节点执行pg_receivexlog (早于pg_start_backup开始, 可以拿到所有需要的pg_xlog文件)

pg_receivexlog -D $PGDATA/pg_xlog -v -h 192.1.1.5 -p 5432 -s 60 -U replica

5. 在master节点执行开始备份

psql
psql (9.2.4)
Type "help" for help.
postgres=# select pg_start_backup(now()::text);

6. master节点执行完pg_start_backup后, 在standby节点执行rsync.

nohup rsync -acvz --progress --rsh='ssh -p 10022' --delete --exclude=pg_xlog* --exclude=*.pid postgres@192.1.1.5:/data02/pg_root/ /data02/pg_root >>/home/postgres/pg_root.log 2>&1 &
nohup rsync -acvz --progress --rsh='ssh -p 10022' --delete postgres@192.1.1.5:/data09/digoal/ /data09/digoal >>/home/postgres/digoal.log 2>&1 &
nohup rsync -acvz --progress --rsh='ssh -p 10022' --delete postgres@192.1.1.5:/data03/tbs_digoal/ /data03/tbs_digoal >>/home/postgres/tbs_digoal.log 2>&1 &
nohup rsync -acvz --progress --rsh='ssh -p 10022' --delete postgres@192.1.1.5:/data05/tbs_digoal1/ /data05/tbs_digoal1 >>/home/postgres/tbs_digoal1.log 2>&1 &
nohup rsync -acvz --progress --rsh='ssh -p 10022' --delete postgres@192.1.1.5:/data04/tbs_digoal_idx/ /data04/tbs_digoal_idx >>/home/postgres/tbs_digoal_idx.log 2>&1 &
nohup rsync -acvz --progress --rsh='ssh -p 10022' --delete postgres@192.1.1.5:/data06/tbs_digoal_old/ /data06/tbs_digoal_old >>/home/postgres/tbs_digoal_old.log 2>&1 &
7. standby收尾
检查pg_xlog软链接是否正常
修改postgresql.conf, 监听端口不要与其他端口冲突, standby相关参数等等.
修改recovery.conf
停掉pg_receivexlog
主节点数据库执行pg_stop_backup();


8. 启动standby
【其他】
1. http://repmgr.org/
这个管理软件可以用于管理PostgreSQL standby环境, 也可以调用rsync做数据同步.
有兴趣的朋友可以研究一下, instagram也是用的这个管理软件.

【参考】

1. http://www.blog.163.com/digoal@126/blog/static/163877040201162541727318/
2. http://blog.163.com/digoal@126/blog/static/163877040201182885211344/
3. http://blog.163.com/digoal@126/blog/static/1638770402013324103828603/
4. http://blog.163.com/digoal@126/blog/static/16387704020115294425540/
5. http://blog.163.com/digoal@126/blog/static/163877040201152753352356/
6. http://blog.163.com/digoal@126/blog/static/16387704020132279020755/
7. http://blog.163.com/digoal@126/blog/static/163877040201011794210567/

8.

pg173212@db-192-168-20-4-> pg_receivexlog --help
pg_receivexlog receives PostgreSQL streaming transaction logs.Usage:pg_receivexlog [OPTION]...Options:-D, --directory=DIR    receive transaction log files into this directory-n, --no-loop          do not loop on connection lost-v, --verbose          output verbose messages-V, --version          output version information, then exit-?, --help             show this help, then exitConnection options:-h, --host=HOSTNAME    database server host or socket directory-p, --port=PORT        database server port number-s, --status-interval=INTERVALtime between status packets sent to server (in seconds)-U, --username=NAME    connect as specified database user-w, --no-password      never prompt for password-W, --password         force password prompt (should happen automatically)
Report bugs to <pgsql-bugs@postgresql.org>.

mongoDB VS PostgreSQL dml performance use python (pymongo py-postgresql)相关推荐

  1. 【Python pymongo】零基础也能轻松掌握的学习路线与参考资料

    Python pymongo是一款基于Python的MongoDB数据库的驱动程序,它提供了操作MongoDB数据库的接口和方法.学习Python pymongo可以帮助开发者更好地使用MongoDB ...

  2. python psycopg2_Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决)

    Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决) 2012/06/27 by Crazyant    3条评论 Django支持以下四种数据库Pos ...

  3. 再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署...

    再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署 前言 在MySQL被收购之后,虽然有其替代品为: MariaDB,但是总感觉心里有点膈应.大家发现了另一款开源的数据库: P ...

  4. 解决 win10 pycurl安装出错 Command python setup.py egg_info failed with error code 10 编译安装包 安装万金油...

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yexiaohhjk/article/d ...

  5. Python 运行 Python hello.py 出错,提示: File stdin , line 1

    写了一个hello.py,仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>" , li ...

  6. Python setup.py开发与安装

    本文翻译自:Python setup.py develop vs install Two options in setup.py develop and install are confusing m ...

  7. ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full comm

    目录 问题 解决方法 问题 Python3.7环境下安装PySide pip install PySide Collecting PySideUsing cached PySide-1.2.4.tar ...

  8. python pip 报错 Command “python setup.py egg_info“ failed with error code 1 解决方法

    在执行 pip3 install scrapy 时遇到错误: Command "python setup.py egg_info" failed with error code 1 ...

  9. python setup.py install 安装的包 卸载方法

    增加 –record 参数重新安装软件包,执行命令: python ./setup.py install --record install.txt 删除安装文件,执行命令: cat install.t ...

  10. python导入其他py文件-Python中py文件引用另一个py文件变量的方法

    最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requests r = requests.get(&quo ...

最新文章

  1. 能量平衡_巴夏:平衡自己的能量,疗愈自己,疗愈世界
  2. 你想要什么样的财富自由
  3. 全球十大AI领军人物
  4. Java实现大数乘法_java实现大数加法、乘法(BigDecimal)
  5. libusb usb设备访问接口库
  6. 视频质量评价方法简介
  7. 每天学点Linux命令:倒叙打印文件第二行的前100个大写字母
  8. MaxCompute Console 实用小命令
  9. 走进Windows Server 2008服务器核心(Serve Core)
  10. linwei_211 SVN错误:Attempted to lock an already-locked dir
  11. 面试题46. 把数字翻译成字符串
  12. 无线信号拓展与覆盖的解决方案
  13. select、autocomplete标签下拉框
  14. 汇编语言及应用——程序设计
  15. oracle考试试题及其答案,Oracle期末考试试题及答案-
  16. web前端课程设计:猫咪领养网站 HTML+CSS+JavaScript
  17. OpenGL日常-GLAD
  18. Android的序列化(Serializable和Parcelable)
  19. kaggle——泰坦尼克数据集
  20. wazuh官方安装指南(中文译版本)

热门文章

  1. css案例学习之父子块的margin
  2. Charles proxy tools 移动开发调试
  3. 2.C#2.0之泛型(完成)
  4. c3p0,dbcp与druid 三大连接池的区别[转]
  5. 归纳整理一些工作学习中发现的不错的网站、博客地址等(转载)
  6. 吃易消化吸收的东西利于长寿
  7. Android Alertdialog之多选对话框
  8. Jmail组件在C#中发送邮件代码:
  9. 精选 | 2018年1月R新包推荐
  10. leetcode : Rotate List