• 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应用可能也是合适的场合。

  • 相关阅读:
    10年后我又来看看我自己!
    KubernetesKuboard
    VSCode SSH 免密登录
    Windows Terminal 使用 PuTTY 连接 COM 串口
    PuTTY SSH 免密登录
    FastDDS 安装过程的坑🕳坑🕳坑🕳坑🕳坑🕳坑🕳
    Samba 安装、配置、共享 home 目录、创建用户、设置密码、映射盘符
    Win10 恢复快捷方式小箭头
    CSAPP 并发编程读书笔记
    修改 VSCode 终端配色
  • 原文地址:https://www.cnblogs.com/top5/p/1597156.html
Copyright © 2020-2023  润新知