SlideShare a Scribd company logo
Bucardo:
                            Replication with
                            tiny little goats
                                             Selena Deckelmann
                                            selena@endpoint.com
en
 dp
  oi
     nt
        .c
       om




http://www.flickr.com/photos/kevincollins/
Hi!

             ★   Software Engineer / Postgres Lead
                 http://endpoint.com
             ★   We’re hiring! http://tr.im/EMGj
en
dp
 oi
     nt
        .c
       om
en
dp




       http://www.telegraph.co.uk/science/science-news/4409958/Extinct-ibex-is-
 oi
     nt
        .c




                             resurrected-by-cloning.html
       om
What can it do?
en
dp
 oi
     nt
        .c




     http://www.flickr.com/photos/8602783@N06/2294028540
       om
Master-slave

             • Scaling/Redundancy
             • UPGRADES (8.x -> 8.4)
             • Reporting databases
             • Data warehousing
             • Now handles SEQUENCES!
en
dp
 oi
     nt
        .c
       om
Master-master

             • Write between both databases!
             • Sync type: SWAP
             • Conflict resolution
en
dp
 oi
     nt
        .c
       om
Custom code

             • Respond to change
             • Filter
             • Run arbitrary code!
en
dp
 oi
     nt
        .c
       om
STORY TIME!
                                       item
                                         ski
                                        item
                                          ski
                                          item
                                            ski
                                           item
                                             item
                                             ski
                                               item
                                               ski
             item     onhand
                                                 ski
                                                 item
               skis      10
                                                   ski
                                                   item
                                                     ski
                                                     item
                                                       ski
                                                       item
                                                         ski
               on hand = count(item)
en
dp
 oi
     nt
        .c
       om
prod db
                                                                               reporting db
     new!
             item         NOTIFY bucardo
              ski
                                                         sync B                new!
                                                                                         item
                                                            syn                            ski
                                                                  cC
                                                                                      on hand
                              cA


                                        Y
                                      TIF                                                  +1
                           syn

                                    NO

             custom
              code


                       count(items)
                      and other stuff
en
dp
 oi
     nt
        .c
       om




                                            goat courtesy of: http://www.flickr.com/photos/nuritwilde/394603312
Strengths

             • Drop-in, no changes to Postgres
             • Control daemon/DB can run anywhere
             • EXTREME async
             • No locking of slaves
             • Command-line controls rock!
en
dp
 oi
     nt
        .c
       om
The Fine Print
             • No smooth DDL handling
             • Not for failover (aka high availability)
             • bloat: pg_listener, q, bucardo_delta,
               bucardo_track
             • No locking of slaves
             • No Windows support
             • One developer
en
dp
 oi
     nt
        .c
       om




                                             http://www.flickr.com/photos/ncarey/135901120/
en
dp
 oi
     nt
        .c




     http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling
       om
Bucardo
 Concepts
en
dp
 oi
     nt
        .c
       om




             http://www.flickr.com/photos/kendrick/361173694
Glossary of terms
             • replication: copying data from one place to
               another
             • DDL: Data Definition Language (CREATE/
               DROP/ALTER)
             • DML: Data Manipulation Language (SELECT/
               INSERT/UPDATE/DELETE)
             • triggers: bits of code run before or after DML
en
dp
 oi
     nt
        .c
       om
Glossary of terms

             • goat: a database object (table or sequence)
             • herd: table contains unique name for a group of
               goats
             • syncs: replication events (one herd per sync)
en
dp
 oi
     nt
        .c
       om
flexible architecture
                         bucardo control
                            database




             master DB                     slave DB
en
dp
 oi
     nt
        .c
       om
flexible architecture
             same db
                              bucardo control
              cluster            database




                  master DB                     slave DB
en
dp
 oi
     nt
        .c
       om
flexible architecture
             same db cluster
                 bucardo control
                    database




                   master DB       slave DB
en
dp
 oi
     nt
        .c
       om
flexible architecture
                         same db cluster
                             bucardo control
                                database




             master DB          slave DB
en
dp
 oi
     nt
        .c
       om
Installing
en
dp
 oi
     nt
        .c
       om




                  http://www.flickr.com/photos/kendrick/361173694
Bucardo Requirements
             • Postgres (8.3 or higher recommended)
             • Perl & some packages:
              •   DBD::Pg 2.0

              •   DBI 1.51

              •   DBIx::Safe 1.2.4

              •   ExtUtils::MakeMaker 6.32

             • pl/perlu and pl/pgsql
en
dp
 oi
     nt
        .c
       om
Simple set up


             BUCARDO CONTROL database setup:
             bucardo_ctl install
en
dp
 oi
     nt
        .c
       om
Simple set up

             MASTER setup:
             bucardo_ctl add db MyDB name=master
             bucardo_ctl add all tables herd=all_tables
             bucardo_ctl add all sequences herd=all_tables

             SLAVE setup:
             bucardo_ctl add db MyDB name=slave port=6543
en
dp
 oi
     nt
        .c
       om
Setting up, cont.
             TEST:
             bucardo_ctl validate all

             REPLICATE:
             bucardo_ctl add sync delta
              type=pushdelta source=all_tables
              targetdb=slave
             bucardo_ctl start

             (installs triggers!)
en
dp
 oi
     nt
        .c
       om
Setting up

             • Initiate a one-time-copy: onetimecopy=[1|2]
             • Set up ongoing syncs: enabled by default
               (can set timeouts)
             • MANY configuration options
en
dp
 oi
     nt
        .c
       om
Admin stuff

             • Can set up defaults in .bucardorc
             • Only need one ‘bucardo’ database
             • Uses the ‘bucardo’ schema in replication
               sets for ease of admin, removal
en
dp
 oi
     nt
        .c
       om
Smooth upgrades!

             bucardo_ctl upgrade
             • Stop bucardo first (bucardo_ctl   stop)

             • applies DDL changes, functions
             • see also UPGRADE file
en
dp
 oi
     nt
        .c
       om
Stuff to watch out for

             • search_path for ‘bucardo’ user
             • PL/Perlu & pl/pgsql must be installed
             • Uses prepared statements, turn off with:
               bucardo_ctl update db MyDB
               server_side_prepares=0
en
dp
 oi
     nt
        .c
       om
LIVE DEMO!


             • http://github.com/selenamarie/
               bucardo_examples
en
dp
 oi
     nt
        .c
       om
Internals
en
dp
 oi
     nt




                  http://www.flickr.com/photos/chelseagirlphotos
        .c
       om
Internals
             bucardo=# d
                                    List of relations
              Schema |               Name             |   Type   | Owner
             ---------+-------------------------------+----------+---------
              bucardo | audit_pid                     | table    | bucardo
              bucardo | audit_pid_id_seq              | sequence | bucardo
              bucardo | bucardo_config                | table    | bucardo
              bucardo | bucardo_custom_trigger        | table    | bucardo
              bucardo | bucardo_custom_trigger_id_seq | sequence | bucardo
              bucardo | bucardo_log_message           | table    | bucardo
              bucardo | bucardo_rate                  | table    | bucardo
              bucardo | customcode                    | table    | bucardo
              bucardo | customcode_id_seq             | sequence | bucardo
              bucardo | customcode_map                | table    | bucardo
              bucardo | db                            | table    | bucardo
              bucardo | db_connlog                    | table    | bucardo
              bucardo | dbgroup                       | table    | bucardo
              bucardo | dbmap                         | table    | bucardo
              bucardo | goat                          | table    | bucardo
              bucardo | goat_id_seq                   | sequence | bucardo
              bucardo | herd                          | table    | bucardo
              bucardo | herdmap                       | table    | bucardo
              bucardo | q                             | table    | bucardo
              bucardo | sync                          | table    | bucardo
              bucardo | upgrade_log                   | table    | bucardo
en




             (21 rows)
dp
 oi
     nt
        .c
       om
goats
         Table "bucardo.goat"
                  Column       |           Type           |
         ----------------------+--------------------------+
          id                   | integer                  |
          db                   | text                     |
          schemaname           | text                     |
          tablename            | text                     |
          reltype              | text                     |
          pkey                 | text                     |
          qpkey                | text                     |
          pkeytype             | text                     |
          has_delta            | boolean                  |
          ping                 | boolean                  |
          ...
en
dp
 oi
     nt
        .c
       om
goats

 # bucardo_ctl list tables
 Table: archive.course_logging        DB:   odw_master   PK:   none
 Table: archive.messages              DB:   odw_master   PK:   none
 Table: archive.student_assignments   DB:   odw_master   PK:   none
 Table: archive.student_courses       DB:   odw_master   PK:   none
 Table: logging.activity              DB:   odw_master   PK:   activity_name (varchar)
 Table: logging.course_logging        DB:   odw_master   PK:   course_logging_id (int4)
 Table: public.ecash_transaction      DB:   odw_master   PK:   trans_id (int4)
 Table: public.feedback               DB:   odw_master   PK:   date (timestamp)
 Table: public.holidays               DB:   odw_master   PK:   customernum|month|day|
 year (int4|int4|int4|int4)
 ...
en
dp
 oi
     nt
        .c
       om
bucardo_ctl list sequences
Sequence     63:   logging.logging_seq
Sequence     64:   public.trans_id_seq
Sequence     65:   public.num_seq
Sequence     66:   public.upload_seq
en
dp
 oi
     nt
        .c
       om
bucardo database
             bucardo=# d
                                    List of relations
              Schema |               Name             |   Type   | Owner
             ---------+-------------------------------+----------+---------
             ...
              bucardo | db                            | table    | bucardo
              bucardo | db_connlog                    | table    | bucardo
              bucardo | dbgroup                       | table    | bucardo
              bucardo | dbmap                         | table    | bucardo
              bucardo | goat                          | table    | bucardo
              bucardo | goat_id_seq                   | sequence | bucardo
              bucardo | herd                          | table    | bucardo
              bucardo | herdmap                       | table    | bucardo
              bucardo | q                             | table    | bucardo
              bucardo | sync                          | table    | bucardo
              bucardo | upgrade_log                   | table    | bucardo
             (21 rows)
en
dp
 oi
     nt
        .c
       om
Status

      # bucardo_ctl status
      Days back: 3 User: bucardo Database: bucardo Port: 8000
        PID of Bucardo MCP: 6876
      Name     Type State PID Last_good Time I/U/D Last_bad Time
      ========+=====+=====+====+=========+=====+=====+========+====
      a_delta | P   |idle |6886|1m4s     |0s   |0/0/0|unknown |
      b_delta | P   |idle |6885|1m4s     |0s   |0/0/0|9h32m47s|0s
      c_delta | P   |idle |6887|1m4s     |0s   |0/0/0|unknown |
      d_delta | P   |idle |6888|54s      |0s   |0/0/0|2m6s    |3s
      e_delta | P   |idle |6890|1m4s     |0s   |0/0/0|9h32m47s|0s
      f_delta | P   |idle |6889|1m4s     |0s   |0/0/0|9h32m47s|0s
en
dp
 oi
     nt
        .c
       om
# bucardo_ctl status a_delta
             Days back: 3 User: bucardo Database: bucardo Port: 8000
             ======================================================================
             Sync name:            a_delta
             Current state:        idle (PID = 6888)
             Type:                 pushdelta
             Source herd/database: all_a / a_master
             Target database:      a_slave
             Tables in sync:       26
             Last good:            3m 34s (time to run: 0s)
             Last good time:       Oct 16, 2009 17:52:20 Target: a_slave
             Ins/Upd/Del:          20 / 0 / 50
             Last bad:             4m 47s (time to run: 3s)
             Last bad time:        Oct 16, 2009 17:51:08 Target: a_slave
             Latest bad reason: ?
             PID file:             /var/run/bucardo/bucardo.ctl.sync.a_delta.pid
             PID file created:     Fri Oct 16 17:52:09 2009
             Status:               active
             Limitdbs:             0
             Priority:             0
             Checktime:            none
             Overdue time:         00:00:00
             Expired time:         00:00:00
             Stayalive:            yes       Kidsalive: yes
             Rebuild index:        0         Do_listen: yes
             Ping:                 yes       Makedelta: no
en
dp




             Onetimecopy:          0
 oi
     nt
        .c
       om
How Bucardo replicates
en
dp
 oi
     nt
        .c
       om
Triggers
 INSERT, UPDATE, DELETE


                          bucardo_add_delta
                                 IN
                                   SE
                                      RT


                                           bucardo_delta


                          bucardo_triggerkick_[sync]



                                                 NOTIFY!
en
dp
 oi
     nt
        .c    om
NOTIFY / LISTEN
             • Simple interprocess communication
               psql# LISTEN scotch;
               psql# NOTIFY scotch;
               Asynchronous notification "scotch"
               received from server process with PID
               1337.
             • Any Postgres process can listen in
en
dp
 oi
     nt
        .c
       om
Actual Triggers!
              Table "public.test"
  Column |          Type          | Modifiers
 --------+-----------------------+-----------
  test    | character varying(15) | not null
 Indexes:
     "test_pkey" PRIMARY KEY, btree ("test")
 Triggers:
     bucardo_add_delta AFTER INSERT OR DELETE OR
 UPDATE ON test FOR EACH ROW EXECUTE PROCEDURE
 bucardo_add_delta_role()
     bucardo_triggerkick_a_delta AFTER INSERT OR
 DELETE OR UPDATE ON test FOR EACH STATEMENT
 EXECUTE PROCEDURE bucardo_triggerkick_a_delta()
en
dp
 oi
     nt
        .c
       om
Bucardo

                             NOTIFY         NOTIFY
             NOTIFY    MCP            CTL              KID
TRIGGER


                      INSERT INTO “q”

                                  SELECT from “q”
                                    UPDATE “q”


             Flow of control                         REPLICATION
en




                                                        EVENT!
dp
 oi
     nt
        .c
       om
How Syncs happen

             • NOTIFY vs. timeout vs. kick
              • NOTIFY - from master db to MCP
              • timeout - controller detects
              • kick - manual/from MCP to controller
en
dp
 oi
     nt
        .c
       om
Processes!
             • MCP, CTL, KID
              • MCP: master control process
              • CTL: controller (track, kick off/kill KIDs)
              • KID: sync processes
en
dp
 oi
     nt
        .c
       om
Administrativa

             • Totally ok to kill KIDs
             • CTL cleans up after you
             • May need to kill open database handles (for
               unfinished COPYs, etc)
en
dp
 oi
     nt
        .c
       om
Other interesting tables

              On your master DB:
              • bucardo_delta table has: ID, txn_time
              • bucardo_track table: who’s done what?
en
dp
 oi
     nt
        .c
       om
Sync types

             • Fullcopy. Timeout/kick. TRUNCATE or
               DELETE, then COPY
             • Pushdelta. Trigger. One way master-slave.
             • Swap. Trigger. Two-way. Conflict resolution.
en
dp
 oi
     nt
        .c
       om
Note about triggers:
             • canonical way to disable triggers:
               ALTER TABLE DISABLE TRIGGER ALL;
               :(
             • pre 8.3 way: UPDATE pg_class..
             • SET session_replication_role = ‘replica’;
              • Applies to just the current session
              • Thanks, Jan!
en
dp
 oi
     nt
        .c
       om
Dealing with failure

             • Troubleshooting
             • Backing up Bucardo itself
             • What happens when you lose the
               Bucardodb?
en
dp
 oi
     nt
        .c
       om
Bucardo hooks

             • LIVE DATA CHANGES!
             • pass in a hashref (ROW or ROWINFO)
             • Returned value - bitmapped (a/b or both!)
             • Affect the replication event, side effects
             • Example: cache invalidation
en
dp
 oi
     nt
        .c
       om
Bucardo Hooks

             • customcode & customcode_map
              • Conflict handlers (SWAP syncs)
              • Pure Perl
              • Exception - fix and try again
              • Pre and post trigger
en
dp
 oi
     nt
        .c
       om
Development

             • bucardo.org
             • mailing lists: http://bucardo.org/wiki/
               Bucardo_mailing_list
             • Release early, often.
             • Please submit patches! bug reports! tests!
en
dp
 oi
     nt
        .c
       om
Questions?
                          .com
                       nt
                  oi
               dp
             en
Thanks!

             http://www.slideshare.net/selenamarie/bucardo
             selena@endpoint.com
             @selenamarie on Twitter
             rss: http://www.chesnok.com/daily
en
dp
 oi
     nt
        .c
       om

More Related Content

PDF
Amazon S3 Best Practice and Tuning for Hadoop/Spark in the Cloud
PPTX
Optimizing Apache Spark SQL Joins
PPTX
The Columnar Era: Leveraging Parquet, Arrow and Kudu for High-Performance Ana...
PPTX
Introduction to Apache Spark Developer Training
PDF
Building a SIMD Supported Vectorized Native Engine for Spark SQL
PDF
Inside vacuum - 第一回PostgreSQLプレ勉強会
PDF
Apache Iceberg - A Table Format for Hige Analytic Datasets
Amazon S3 Best Practice and Tuning for Hadoop/Spark in the Cloud
Optimizing Apache Spark SQL Joins
The Columnar Era: Leveraging Parquet, Arrow and Kudu for High-Performance Ana...
Introduction to Apache Spark Developer Training
Building a SIMD Supported Vectorized Native Engine for Spark SQL
Inside vacuum - 第一回PostgreSQLプレ勉強会
Apache Iceberg - A Table Format for Hige Analytic Datasets

What's hot (20)

PDF
2022-06-23 Apache Arrow and DataFusion_ Changing the Game for implementing Da...
PDF
Streaming Data Lakes using Kafka Connect + Apache Hudi | Vinoth Chandar, Apac...
PPTX
Introduction to Storm
PPTX
Kafka Tutorial - Introduction to Apache Kafka (Part 1)
PDF
Optimizing Delta/Parquet Data Lakes for Apache Spark
PDF
End to end Machine Learning using Kubeflow - Build, Train, Deploy and Manage
PDF
Enabling Vectorized Engine in Apache Spark
PDF
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...
PDF
Airflow Best Practises & Roadmap to Airflow 2.0
PDF
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PDF
Apache Kuduは何がそんなに「速い」DBなのか? #dbts2017
PDF
Data Engineer's Lunch #83: Strategies for Migration to Apache Iceberg
PDF
Presto Summit 2018 - 09 - Netflix Iceberg
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PDF
Linux tuning to improve PostgreSQL performance
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
PDF
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
PPTX
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
PDF
Apache Hadoop YARNとマルチテナントにおけるリソース管理
PPTX
Hadoop -NameNode HAの仕組み-
2022-06-23 Apache Arrow and DataFusion_ Changing the Game for implementing Da...
Streaming Data Lakes using Kafka Connect + Apache Hudi | Vinoth Chandar, Apac...
Introduction to Storm
Kafka Tutorial - Introduction to Apache Kafka (Part 1)
Optimizing Delta/Parquet Data Lakes for Apache Spark
End to end Machine Learning using Kubeflow - Build, Train, Deploy and Manage
Enabling Vectorized Engine in Apache Spark
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...
Airflow Best Practises & Roadmap to Airflow 2.0
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
Apache Kuduは何がそんなに「速い」DBなのか? #dbts2017
Data Engineer's Lunch #83: Strategies for Migration to Apache Iceberg
Presto Summit 2018 - 09 - Netflix Iceberg
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Linux tuning to improve PostgreSQL performance
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Hadoop -NameNode HAの仕組み-
Ad

Viewers also liked (14)

PDF
Phyto-oils
PDF
Principi di grafica
PPS
Un lindo mensaje
PPT
我行·你行·大家行03
PPT
我行·你行·大家行02
PPTX
Process Groups
PPS
Cand...
PPT
Generations atworkmodernsamplefinal
PPT
Powerpoint LiveWIRE 2009
PPS
Zambetul
PPS
PDF
Letters from the open source trenches - Postgres community
PPT
Foldervisie
PPTX
Retrospectiva
Phyto-oils
Principi di grafica
Un lindo mensaje
我行·你行·大家行03
我行·你行·大家行02
Process Groups
Cand...
Generations atworkmodernsamplefinal
Powerpoint LiveWIRE 2009
Zambetul
Letters from the open source trenches - Postgres community
Foldervisie
Retrospectiva
Ad

Similar to Bucardo (11)

PPTX
Introduction to NoSQL
PDF
Introduction to NoSQL and Couchbase
PDF
DBArtisan® vs Quest Toad with DB Admin Module
PDF
Seaside Status Message
PDF
Seaside News
PDF
92 grand prix_2013
DOC
Acronimos En Informatica
PDF
Embedded Database Technology | Interbase From Embarcadero Technologies
PDF
Go simple-fast-elastic-with-couchbase-server-borkar
PDF
Nate tech deck
PDF
Acunu & OCaml: Experience Report, CUFP
Introduction to NoSQL
Introduction to NoSQL and Couchbase
DBArtisan® vs Quest Toad with DB Admin Module
Seaside Status Message
Seaside News
92 grand prix_2013
Acronimos En Informatica
Embedded Database Technology | Interbase From Embarcadero Technologies
Go simple-fast-elastic-with-couchbase-server-borkar
Nate tech deck
Acunu & OCaml: Experience Report, CUFP

More from Selena Deckelmann (20)

PDF
While we're here, let's fix computer science education
KEY
Algorithms are Recipes
PDF
Hire the right way
PDF
Mistakes were made - LCA 2012
PDF
Pg92 HA, LCA 2012, Ballarat
PDF
Managing terabytes
PDF
Mistakes were made
PDF
Postgres needs an aircraft carrier
PDF
Mistakes were made
PDF
Harder, better, faster, stronger: PostgreSQL 9.1
PDF
How to ask for money
PDF
Own it: working with a changing open source community
PDF
Managing terabytes: When Postgres gets big
PDF
Managing terabytes: When PostgreSQL gets big
PDF
Pdxpugday2010 pg90
PDF
Making Software Communities
PDF
Illustrated buffer cache
PDF
How a bunch of normal people Used Technology To Repair a Rigged Election
PDF
Open Source Bridge Opening Day
PDF
What Assumptions Make: Filesystem I/O from a database perspective
While we're here, let's fix computer science education
Algorithms are Recipes
Hire the right way
Mistakes were made - LCA 2012
Pg92 HA, LCA 2012, Ballarat
Managing terabytes
Mistakes were made
Postgres needs an aircraft carrier
Mistakes were made
Harder, better, faster, stronger: PostgreSQL 9.1
How to ask for money
Own it: working with a changing open source community
Managing terabytes: When Postgres gets big
Managing terabytes: When PostgreSQL gets big
Pdxpugday2010 pg90
Making Software Communities
Illustrated buffer cache
How a bunch of normal people Used Technology To Repair a Rigged Election
Open Source Bridge Opening Day
What Assumptions Make: Filesystem I/O from a database perspective

Recently uploaded (20)

PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
KodekX | Application Modernization Development
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Approach and Philosophy of On baking technology
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Electronic commerce courselecture one. Pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
KodekX | Application Modernization Development
NewMind AI Weekly Chronicles - August'25 Week I
Review of recent advances in non-invasive hemoglobin estimation
Dropbox Q2 2025 Financial Results & Investor Presentation
Spectral efficient network and resource selection model in 5G networks
Approach and Philosophy of On baking technology
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Electronic commerce courselecture one. Pdf
Encapsulation_ Review paper, used for researhc scholars
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Unlocking AI with Model Context Protocol (MCP)
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
NewMind AI Monthly Chronicles - July 2025
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing

Bucardo

  • 1. Bucardo: Replication with tiny little goats Selena Deckelmann selena@endpoint.com en dp oi nt .c om http://www.flickr.com/photos/kevincollins/
  • 2. Hi! ★ Software Engineer / Postgres Lead http://endpoint.com ★ We’re hiring! http://tr.im/EMGj en dp oi nt .c om
  • 3. en dp http://www.telegraph.co.uk/science/science-news/4409958/Extinct-ibex-is- oi nt .c resurrected-by-cloning.html om
  • 4. What can it do? en dp oi nt .c http://www.flickr.com/photos/8602783@N06/2294028540 om
  • 5. Master-slave • Scaling/Redundancy • UPGRADES (8.x -> 8.4) • Reporting databases • Data warehousing • Now handles SEQUENCES! en dp oi nt .c om
  • 6. Master-master • Write between both databases! • Sync type: SWAP • Conflict resolution en dp oi nt .c om
  • 7. Custom code • Respond to change • Filter • Run arbitrary code! en dp oi nt .c om
  • 8. STORY TIME! item ski item ski item ski item item ski item ski item onhand ski item skis 10 ski item ski item ski item ski on hand = count(item) en dp oi nt .c om
  • 9. prod db reporting db new! item NOTIFY bucardo ski sync B new! item syn ski cC on hand cA Y TIF +1 syn NO custom code count(items) and other stuff en dp oi nt .c om goat courtesy of: http://www.flickr.com/photos/nuritwilde/394603312
  • 10. Strengths • Drop-in, no changes to Postgres • Control daemon/DB can run anywhere • EXTREME async • No locking of slaves • Command-line controls rock! en dp oi nt .c om
  • 11. The Fine Print • No smooth DDL handling • Not for failover (aka high availability) • bloat: pg_listener, q, bucardo_delta, bucardo_track • No locking of slaves • No Windows support • One developer en dp oi nt .c om http://www.flickr.com/photos/ncarey/135901120/
  • 12. en dp oi nt .c http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling om
  • 13. Bucardo Concepts en dp oi nt .c om http://www.flickr.com/photos/kendrick/361173694
  • 14. Glossary of terms • replication: copying data from one place to another • DDL: Data Definition Language (CREATE/ DROP/ALTER) • DML: Data Manipulation Language (SELECT/ INSERT/UPDATE/DELETE) • triggers: bits of code run before or after DML en dp oi nt .c om
  • 15. Glossary of terms • goat: a database object (table or sequence) • herd: table contains unique name for a group of goats • syncs: replication events (one herd per sync) en dp oi nt .c om
  • 16. flexible architecture bucardo control database master DB slave DB en dp oi nt .c om
  • 17. flexible architecture same db bucardo control cluster database master DB slave DB en dp oi nt .c om
  • 18. flexible architecture same db cluster bucardo control database master DB slave DB en dp oi nt .c om
  • 19. flexible architecture same db cluster bucardo control database master DB slave DB en dp oi nt .c om
  • 20. Installing en dp oi nt .c om http://www.flickr.com/photos/kendrick/361173694
  • 21. Bucardo Requirements • Postgres (8.3 or higher recommended) • Perl & some packages: • DBD::Pg 2.0 • DBI 1.51 • DBIx::Safe 1.2.4 • ExtUtils::MakeMaker 6.32 • pl/perlu and pl/pgsql en dp oi nt .c om
  • 22. Simple set up BUCARDO CONTROL database setup: bucardo_ctl install en dp oi nt .c om
  • 23. Simple set up MASTER setup: bucardo_ctl add db MyDB name=master bucardo_ctl add all tables herd=all_tables bucardo_ctl add all sequences herd=all_tables SLAVE setup: bucardo_ctl add db MyDB name=slave port=6543 en dp oi nt .c om
  • 24. Setting up, cont. TEST: bucardo_ctl validate all REPLICATE: bucardo_ctl add sync delta type=pushdelta source=all_tables targetdb=slave bucardo_ctl start (installs triggers!) en dp oi nt .c om
  • 25. Setting up • Initiate a one-time-copy: onetimecopy=[1|2] • Set up ongoing syncs: enabled by default (can set timeouts) • MANY configuration options en dp oi nt .c om
  • 26. Admin stuff • Can set up defaults in .bucardorc • Only need one ‘bucardo’ database • Uses the ‘bucardo’ schema in replication sets for ease of admin, removal en dp oi nt .c om
  • 27. Smooth upgrades! bucardo_ctl upgrade • Stop bucardo first (bucardo_ctl stop) • applies DDL changes, functions • see also UPGRADE file en dp oi nt .c om
  • 28. Stuff to watch out for • search_path for ‘bucardo’ user • PL/Perlu & pl/pgsql must be installed • Uses prepared statements, turn off with: bucardo_ctl update db MyDB server_side_prepares=0 en dp oi nt .c om
  • 29. LIVE DEMO! • http://github.com/selenamarie/ bucardo_examples en dp oi nt .c om
  • 30. Internals en dp oi nt http://www.flickr.com/photos/chelseagirlphotos .c om
  • 31. Internals bucardo=# d List of relations Schema | Name | Type | Owner ---------+-------------------------------+----------+--------- bucardo | audit_pid | table | bucardo bucardo | audit_pid_id_seq | sequence | bucardo bucardo | bucardo_config | table | bucardo bucardo | bucardo_custom_trigger | table | bucardo bucardo | bucardo_custom_trigger_id_seq | sequence | bucardo bucardo | bucardo_log_message | table | bucardo bucardo | bucardo_rate | table | bucardo bucardo | customcode | table | bucardo bucardo | customcode_id_seq | sequence | bucardo bucardo | customcode_map | table | bucardo bucardo | db | table | bucardo bucardo | db_connlog | table | bucardo bucardo | dbgroup | table | bucardo bucardo | dbmap | table | bucardo bucardo | goat | table | bucardo bucardo | goat_id_seq | sequence | bucardo bucardo | herd | table | bucardo bucardo | herdmap | table | bucardo bucardo | q | table | bucardo bucardo | sync | table | bucardo bucardo | upgrade_log | table | bucardo en (21 rows) dp oi nt .c om
  • 32. goats Table "bucardo.goat" Column | Type | ----------------------+--------------------------+ id | integer | db | text | schemaname | text | tablename | text | reltype | text | pkey | text | qpkey | text | pkeytype | text | has_delta | boolean | ping | boolean | ... en dp oi nt .c om
  • 33. goats # bucardo_ctl list tables Table: archive.course_logging DB: odw_master PK: none Table: archive.messages DB: odw_master PK: none Table: archive.student_assignments DB: odw_master PK: none Table: archive.student_courses DB: odw_master PK: none Table: logging.activity DB: odw_master PK: activity_name (varchar) Table: logging.course_logging DB: odw_master PK: course_logging_id (int4) Table: public.ecash_transaction DB: odw_master PK: trans_id (int4) Table: public.feedback DB: odw_master PK: date (timestamp) Table: public.holidays DB: odw_master PK: customernum|month|day| year (int4|int4|int4|int4) ... en dp oi nt .c om
  • 34. bucardo_ctl list sequences Sequence 63: logging.logging_seq Sequence 64: public.trans_id_seq Sequence 65: public.num_seq Sequence 66: public.upload_seq en dp oi nt .c om
  • 35. bucardo database bucardo=# d List of relations Schema | Name | Type | Owner ---------+-------------------------------+----------+--------- ... bucardo | db | table | bucardo bucardo | db_connlog | table | bucardo bucardo | dbgroup | table | bucardo bucardo | dbmap | table | bucardo bucardo | goat | table | bucardo bucardo | goat_id_seq | sequence | bucardo bucardo | herd | table | bucardo bucardo | herdmap | table | bucardo bucardo | q | table | bucardo bucardo | sync | table | bucardo bucardo | upgrade_log | table | bucardo (21 rows) en dp oi nt .c om
  • 36. Status # bucardo_ctl status Days back: 3 User: bucardo Database: bucardo Port: 8000 PID of Bucardo MCP: 6876 Name Type State PID Last_good Time I/U/D Last_bad Time ========+=====+=====+====+=========+=====+=====+========+==== a_delta | P |idle |6886|1m4s |0s |0/0/0|unknown | b_delta | P |idle |6885|1m4s |0s |0/0/0|9h32m47s|0s c_delta | P |idle |6887|1m4s |0s |0/0/0|unknown | d_delta | P |idle |6888|54s |0s |0/0/0|2m6s |3s e_delta | P |idle |6890|1m4s |0s |0/0/0|9h32m47s|0s f_delta | P |idle |6889|1m4s |0s |0/0/0|9h32m47s|0s en dp oi nt .c om
  • 37. # bucardo_ctl status a_delta Days back: 3 User: bucardo Database: bucardo Port: 8000 ====================================================================== Sync name: a_delta Current state: idle (PID = 6888) Type: pushdelta Source herd/database: all_a / a_master Target database: a_slave Tables in sync: 26 Last good: 3m 34s (time to run: 0s) Last good time: Oct 16, 2009 17:52:20 Target: a_slave Ins/Upd/Del: 20 / 0 / 50 Last bad: 4m 47s (time to run: 3s) Last bad time: Oct 16, 2009 17:51:08 Target: a_slave Latest bad reason: ? PID file: /var/run/bucardo/bucardo.ctl.sync.a_delta.pid PID file created: Fri Oct 16 17:52:09 2009 Status: active Limitdbs: 0 Priority: 0 Checktime: none Overdue time: 00:00:00 Expired time: 00:00:00 Stayalive: yes Kidsalive: yes Rebuild index: 0 Do_listen: yes Ping: yes Makedelta: no en dp Onetimecopy: 0 oi nt .c om
  • 39. Triggers INSERT, UPDATE, DELETE bucardo_add_delta IN SE RT bucardo_delta bucardo_triggerkick_[sync] NOTIFY! en dp oi nt .c om
  • 40. NOTIFY / LISTEN • Simple interprocess communication psql# LISTEN scotch; psql# NOTIFY scotch; Asynchronous notification "scotch" received from server process with PID 1337. • Any Postgres process can listen in en dp oi nt .c om
  • 41. Actual Triggers! Table "public.test" Column | Type | Modifiers --------+-----------------------+----------- test | character varying(15) | not null Indexes: "test_pkey" PRIMARY KEY, btree ("test") Triggers: bucardo_add_delta AFTER INSERT OR DELETE OR UPDATE ON test FOR EACH ROW EXECUTE PROCEDURE bucardo_add_delta_role() bucardo_triggerkick_a_delta AFTER INSERT OR DELETE OR UPDATE ON test FOR EACH STATEMENT EXECUTE PROCEDURE bucardo_triggerkick_a_delta() en dp oi nt .c om
  • 42. Bucardo NOTIFY NOTIFY NOTIFY MCP CTL KID TRIGGER INSERT INTO “q” SELECT from “q” UPDATE “q” Flow of control REPLICATION en EVENT! dp oi nt .c om
  • 43. How Syncs happen • NOTIFY vs. timeout vs. kick • NOTIFY - from master db to MCP • timeout - controller detects • kick - manual/from MCP to controller en dp oi nt .c om
  • 44. Processes! • MCP, CTL, KID • MCP: master control process • CTL: controller (track, kick off/kill KIDs) • KID: sync processes en dp oi nt .c om
  • 45. Administrativa • Totally ok to kill KIDs • CTL cleans up after you • May need to kill open database handles (for unfinished COPYs, etc) en dp oi nt .c om
  • 46. Other interesting tables On your master DB: • bucardo_delta table has: ID, txn_time • bucardo_track table: who’s done what? en dp oi nt .c om
  • 47. Sync types • Fullcopy. Timeout/kick. TRUNCATE or DELETE, then COPY • Pushdelta. Trigger. One way master-slave. • Swap. Trigger. Two-way. Conflict resolution. en dp oi nt .c om
  • 48. Note about triggers: • canonical way to disable triggers: ALTER TABLE DISABLE TRIGGER ALL; :( • pre 8.3 way: UPDATE pg_class.. • SET session_replication_role = ‘replica’; • Applies to just the current session • Thanks, Jan! en dp oi nt .c om
  • 49. Dealing with failure • Troubleshooting • Backing up Bucardo itself • What happens when you lose the Bucardodb? en dp oi nt .c om
  • 50. Bucardo hooks • LIVE DATA CHANGES! • pass in a hashref (ROW or ROWINFO) • Returned value - bitmapped (a/b or both!) • Affect the replication event, side effects • Example: cache invalidation en dp oi nt .c om
  • 51. Bucardo Hooks • customcode & customcode_map • Conflict handlers (SWAP syncs) • Pure Perl • Exception - fix and try again • Pre and post trigger en dp oi nt .c om
  • 52. Development • bucardo.org • mailing lists: http://bucardo.org/wiki/ Bucardo_mailing_list • Release early, often. • Please submit patches! bug reports! tests! en dp oi nt .c om
  • 53. Questions? .com nt oi dp en
  • 54. Thanks! http://www.slideshare.net/selenamarie/bucardo selena@endpoint.com @selenamarie on Twitter rss: http://www.chesnok.com/daily en dp oi nt .c om