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

[经验分享] PostgreSQL 集群复制方案之使用pgq和londiste工具包

[复制链接]

尚未签到

发表于 2016-11-21 10:55:36 | 显示全部楼层 |阅读模式
关于PostgreSQL集群复制方案
  可以参考25 高可用性,负载均衡和复制这篇文章了解一些常规的复制方案。

关于pgq和londiste工具
  来自于skype的工具包skytools,其中pgq是基于postgresql的通用队列实现。而londiste是基于pgq的复制工具。这 两个工具的组合类似于slony,但相比二者,前者更简单一些。我们可以简单地把这种复制理解成 producer(provider)/consumer(subscriber)类型。master产生数据在队列中,而slave从队列中取数据并且 作用在自己身上。

安装
  简单描述一下安装过程如下(假设两台机器,一台是master,一台是slave,都已经安装了数据库)


  • 安装psycopg2,到这里下载
tar xzvf psycopg2-2.0.7.tar.gz
cd psycopg2-2.0.7
python setup.py build_ext -Rpgsql的安装目录/lib
python setup.py install


  • 安装skytools,到这里下载
tar xzvf skytools-2.1.7.tar.gz
cd skytools-2.1.7
./configure
make
make install
python setup.py install

配置


  • master-pgq
  配置文件名:ticker.ini
[pgqadm]
job_name = ticker
db = dbname=foo host=127.0.0.1 port=5555 user=chry
# how often to run maintenance [minutes]
maint_delay_min = 1
# how often to check for activity [secs]
loop_delay = 0.1
logfile = %(job_name)s.log
pidfile = %(job_name)s.pid
use_skylog = 0


  • master-provider和slave-subscriber
  配置文件名:replica.ini
[londiste]
job_name = lmaster_to_slave
provider_db = dbname=foo host=127.0.0.1 port=5555 user=chry
subscriber_db = dbname=foo host=205.203.*.* port=5555 user=chry
# it will be used as sql ident so no dots/spaces
pgq_queue_name = londiste.write
pidfile = %(job_name)s.pid
logfile = %(job_name)s.log
use_skylog = 0

启动replication daemon


  • master(producer)
pgqadm.py ticker.ini ticker -d (启动pgq管理进程)
londiste.py replica.ini provider install(安装londiste需要的schema)


  • slave(consumer)
londiste.py replica.ini subscriber install(安装londiste需要的schema)
londiste.py replica.ini replay -d(启动数据复制,replica这个文件被部署了两次)
  以上过程需要保证slave可以登录master的数据库。

添加一个复制集


  • 假设你要同步表entry, 其有两个字段:id(sequence, primary key), item text。那么我们还需要同步sequence:entry_id_seq
  master
londiste.py replica.ini provider add entry
londiste.py replica.ini provider add-seq entry_id_seq
  slave
londiste.py replica.ini subscriber add entry
londiste.py replica.ini subscriber add-seq entry_id_seq
  添加完毕。

测试结论


  • 同步的表对象需要有primary key
  • 在master操作insert/update/delete操作,可以正确同步到slave相应的表中。但不支持truncate。
  • 如果slave数据库down掉,在slave重新起来的这段时间内的master的数据变化可以同步到slave相应的表中,而旧数据不会被同步。
  • 如果slave上执行insert/update/delete的表操作,那么master是不会影响到的,与之相反,sequence在slave上的任何改变,在master变化时会重置。
  • 要强制旧数据同步,可以在slave上执行:
londiste.py replica.ini subscriber resync -v --force

应用场合的探索


  • 这个方案可以应用在读写可分离的场合,比如结合plproxy的如下应用:

  一边是feed数据到write集群,一边不仅仅希望读写分开以提高性能,同时可以支持load balance,那么pgq/londiste无疑是比较好的方案。之前可能需要同时写两个节点的数据以保证数据同步,这样不仅性能打折,而且还必须保证 事务,标准的plproxy是不支持事务的。
  票务搜索就是这类应用,还有一些OLTP以及web应用可能也是合适的场合。

运维网声明 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-303393-1-1.html 上篇帖子: 如何知道PostgreSQL数据库下每个数据库所对应的目录 下篇帖子: C#对PostgreSQL的操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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