zoukankan      html  css  js  c++  java
  • PostgreSQL 集群复制方案之使用pgq和londiste工具包

    关于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的如下应用:

    Image:Read_only_cluster.jpg

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

    票务搜索就是这类应用,还有一些OLTP以及web应用可能也是合适的场合。

  • 相关阅读:
    Code Forces Gym 100886J Sockets(二分)
    CSU 1092 Barricade
    CodeChef Mahesh and his lost array
    CodeChef Gcd Queries
    CodeChef GCD2
    CodeChef Sereja and LCM(矩阵快速幂)
    CodeChef Sereja and GCD
    CodeChef Little Elephant and Balance
    CodeChef Count Substrings
    hdu 4001 To Miss Our Children Time( sort + DP )
  • 原文地址:https://www.cnblogs.com/top5/p/1597156.html
Copyright © 2011-2022 走看看