官网地址

一、Bucardo介绍

Bucardo 是基于表复制的系统

Bucardo 可以实现PostgreSQL数据库的双master/多master的方案

Bucardo的核心是一个Perl守护进程,它侦听通知请求并对其进行操作,方法是连接到远程数据库并来回复制数据。

守护进程需要的所有特定信息都存储在主bucardo数据库中,包括复制所涉及的所有数据库的列表以及如何到达这些数据库、要复制的所有表以及如何复制每个表。

运行Bucardo的第一步是向主Bucardo数据库添加两个或更多数据库。

完成此操作后,将添加关于要复制哪些表的信息以及表的任何分组。然后添加同步。

同步被称为复制操作,将一组特定的表从一台服务器复制到另一台服务器或一组服务器。

一旦设置好Bucardo,触发器就开始存储有关所有相关的表中哪些行被更改的信息。对于多主机。

过程是这样的:
1、对表进行更改并记录在bucardo_delta表中。
2、向主Bucardo守护进程发送通知,让它知道表已经更改。
3、守护进程通知控制器进行同步,然后返回侦听。
4、控制器创建一个“kid”来处理复制,或者通知已经存在的复制。
5、孩子开始一个新的事务,禁用相关表上的触发器和规则。
6、然后,它收集自上次复制以来哪些行发生了更改的列表,然后比较这两个行以确定应该做什么。
7、如果存在冲突,则会运行标准冲突处理程序,或者为每个表设置的自定义处理程序来对内容进行排序。
8、触发器和规则被重新启用,事务被提交。
9、如果事务失败,则运行任何自定义异常处理程序。
10、子程序向控制器发出它已经完成的信号。

二、Bucardo 的安装

2.1、安装依赖包

Bucardo 软件依赖包有如下:

build, test, and install Perl 5           (at least 5.8.3)
build, test, and install Postgres          (at least 8.2)
build, test, and install the DBI module        (at least 1.51)
build, test, and install the DBD::Pg module    (at least 2.0.0)
build, test, and install the DBIx::Safe module (at least 1.2.4)

1、安装 Perl

本次系统linux版本是6.5 Perl是linux系统自带;默认版本是v5.10.1;可行

[root@node3 Bucardo]# perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

2、安装 PostgreSQL软件

在编译的过程需要带上 --with-perl;

3、安装 DBI module

安装DBI 依赖 Test-Simple;

# 安装 Test-Simple
Test-Simple下载地址 https://metacpan.org 搜索 Test-Simple
# 解压Test-Simple源码包
tar -zxvf Test-Simple-1.302183.tar.gz
# 进入Test-Simple目录进行安装
cd Test-Simple-1.302183
perl Makefile.PL
make
make install
# 接下来安装DBI
# 下载地址:http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.630.tar.gz
tar -zxvf DBI-1.630.tar.gz
cd DBI-1.630
perl Makefile.PL
make
make install

4、 安装DBD::Pg module

安装最新的DBD::Pg;需要依赖 Time::HiRes

# 安装 Time::HiRes
下载地址: https://metacpan.org 搜索 Time::HiRes
tar -zxvf Time-HiRes-1.9764.tar.gz 
cd Time-HiRes-1.9764
perl Makefile.PL
make
make install
# 接下来安装DBD::Pg
# 安装DBD::Pg;需要确定已经安装 PostgreSQL 环境;即pg_config输出
# 加载 PostgreSQL 环境变量
tar -zxvf DBD-Pg-3.14.2.tar.gz
cd DBD-Pg-3.14.2
perl Makefile.PL
make
make install

5、安装DBIx::Safe

# 下载地址:https://bucardo.org/DBIx-Safe/
tar -zxvf DBIx-Safe-1.2.5.tar.gz
cd DBIx-Safe-1.2.5
perl Makefile.PL
make
make install

2.2、安装 Bucardo

# 在网站https://bucardo.org/Bucardo/下载
tar -zxvf Bucardo-5.6.0.tar.gz
cd Bucardo-5.6.0
perl Makefile.PL
make
make install
# 查看Bucardo版本
[postgres@node3 ~]$ bucardo --version
bucardo version 5.6.0

三、创建元数据库bucardo

元数据库存储bucardo复制的配置信息,使用 bucardo install 命令创建;

3.1、创建.bucardorc文件

在系统用户home目录下创建;内容如下:

log_conflict_file         = /home/postgres/bucardo/log/bucardo_conflict.log
piddir                    = /home/postgres/bucardo/run
reason_file               = /home/postgres/bucardo/log/bucardo.restart.reason.log
warning_file              = /home/postgres/bucardo/log/bucardo.warning.log
syslog_facility           = LOG_LOCAL1

3.2、创建所需目录

mkdir -p /home/postgres/bucardo/log
mkdir -p /home/postgres/bucardo/run

3.3、执行 bucardo install 命令

准备工作完成;开始执行 bucardo install 命令创建 元数据库;

# /usr/local/share/bucardo/bucardo.schema
[postgres@node3 ~]$ bucardo install
This will install the bucardo database into an existing Postgres cluster.
Postgres must have been compiled with Perl support,
and you must connect as a superuser
Current connection settings:
1. Host:           <none>
2. Port:           6000
3. User:           bucardo
4. Database:       bucardo
5. PID directory:  /home/postgres/bucardo/run
Enter a number to change it, P to proceed, or Q to quit: 1
-- 推荐使用unix套接字方式连接数据;可以使用dbuser:postgres;dbname:postgres去连接。
Change the host to: /tmp
Changed host to: /tmp
Current connection settings:
1. Host:           /tmp
2. Port:           6000
3. User:           postgres
4. Database:       postgres
5. PID directory:  /home/postgres/bucardo/run
Enter a number to change it, P to proceed, or Q to quit: P
Attempting to create and populate the bucardo database and schema
Database creation is complete
Updated configuration setting "piddir"
Installation is now complete.
If you see errors or need help, please email bucardo-general@bucardo.org
You may want to check over the configuration variables next, by running:
bucardo show all
Change any setting by using: bucardo set foo=bar

四、Bucardo配置同步

本次简单演示下;在同个数据库服务器下不同的实例;

用数据库master、slave来演示

[postgres@node3 ~]$ createdb master
[postgres@node3 ~]$ createdb slave

4.1、Add databases

执行bucardo add db命令;记录同步数据库的连接信息

[postgres@node3 ~]$ bucardo add db db1 host=/tmp dbname=master user=postgres
Added database "db1"
[postgres@node3 ~]$ bucardo add db db2 host=/tmp dbname=slave user=postgres
Added database "db2"
#这里推荐使用unix套接字;若元数据库跟需要复制的数据不是在同一台;则需要使用TCP/IP连接的方式。
bucardo add db db1 host=IP port=PGPORT dbname=PGDB user=PGUSRR password=PGPASSWD

4.2、add dbgroup

添加 dbgroup 数据库组; 在一套复制系统中可以有多个源数据库、目标数据库。指定哪个数据库是源数据库,哪个是目标数据库

[postgres@node3 ~]$ bucardo add dbgroup dbgrp01 db1:source db2:target
Created dbgroup "dbgrp01"
Added database "db1" to dbgroup "dbgrp01" as source
Added database "db2" to dbgroup "dbgrp01" as target

4.3、add relgroup

# 创建复制表tbl_lottu01
[postgres@node3 ~]$ psql master postgres -c "create table tbl_lottu01(id int primary key, info text, reg_time timestamp)"
CREATE TABLE
[postgres@node3 ~]$ psql slave postgres -c "create table tbl_lottu01(id int primary key, info text)"
CREATE TABLE
# 添加 relgroup 复制集;即要复制的表、序列的集合
[postgres@node3 ~]$ bucardo add relgroup relgrp01 tbl_lottu01
Created relgroup "relgrp01"
Added the following tables or sequences:
  public.tbl_lottu01 (DB: db1)
The following tables or sequences are now part of the relgroup "relgrp01":
  public.tbl_lottu01

4.4、Add syncs

添加同步;在创建同步需要指定dbgroup 和relgroup

[postgres@node3 ~]$ bucardo add sync sync01 relgroup=relgrp01 dbgroup=dbgrp01 conflict_strategy=bucardo_latest
2020-11-03 17:08:51.494 CST [6988] LOG:  Starting validate_sync for sync01
2020-11-03 17:08:51.494 CST [6988] CONTEXT:  PL/Perl function "validate_sync"
SQL statement "SELECT validate_sync('sync01')"
PL/Perl function "validate_sync"
2020-11-03 17:08:51.494 CST [6988] STATEMENT:  INSERT INTO bucardo.sync (herd,name,dbs,conflict_strategy) VALUES ($1,$2,$3,$4)
2020-11-03 17:08:51.619 CST [6988] LOG:  Ending validate_sync for sync01
2020-11-03 17:08:51.619 CST [6988] CONTEXT:  PL/Perl function "validate_sync"
SQL statement "SELECT validate_sync('sync01')"
PL/Perl function "validate_sync"
2020-11-03 17:08:51.619 CST [6988] STATEMENT:  INSERT INTO bucardo.sync (herd,name,dbs,conflict_strategy) VALUES ($1,$2,$3,$4)
Added sync "sync01"

由于bucardo是解决PostgreSQL双主/多主的方案。可能会存在主键/唯一约束的冲突

    "conflict_strategy"
        The conflict resolution strategy to use in the sync. Supported
        values:
        "bucardo_source"
            The rows on the "source" database always "win". In other words,
            in a conflict, Bucardo copies rows from source to target.
        "bucardo_target"
            The rows on the "target" database always win.
        "bucardo_skip"
            Any conflicting rows are simply not replicated. Not recommended
            for most cases.
        "bucardo_random"
            Each database has an equal chance of winning each time. This is
            the default.
        "bucardo_latest"
            The row that was most recently changed wins.
        "bucardo_abort"
            The sync is aborted on a conflict.

4.5、test sync

启动bucardo服务

[postgres@node3 ~]$ bucardo start
Checking for existing processes
Starting Bucardo
[postgres@node3 ~]$ 2020-11-03 17:21:07.440 CST [7178] LOG:  Starting validate_sync for sync01
2020-11-03 17:21:07.440 CST [7178] CONTEXT:  PL/Perl function "validate_sync"
2020-11-03 17:21:07.440 CST [7178] STATEMENT:  SELECT validate_sync('sync01')
2020-11-03 17:21:07.494 CST [7178] LOG:  Ending validate_sync for sync01
2020-11-03 17:21:07.494 CST [7178] CONTEXT:  PL/Perl function "validate_sync"
2020-11-03 17:21:07.494 CST [7178] STATEMENT:  SELECT validate_sync('sync01')
[postgres@node3 ~]$ ps -ef | grep bucardo
postgres   7178   6376  0 17:21 ?        00:00:00 postgres: bucardo bucardo [local] idle
postgres   7184   6376  0 17:21 ?        00:00:00 postgres: bucardo bucardo [local] idle
postgres   7187   6376  0 17:21 ?        00:00:00 postgres: bucardo bucardo [local] idle
postgres   7191   6376  0 17:21 ?        00:00:00 postgres: bucardo bucardo [local] idle
postgres   7196   7066  0 17:21 pts/1    00:00:00 grep bucardo

在源库插入记录

[postgres@node3 ~]$ psql master postgres
psql (12.2)
Type "help" for help.
master=# insert into tbl_lottu01 values (1, 'lottu01');
INSERT 0 1                                         
master=# insert into tbl_lottu01 values (2, 'lottu02');
INSERT 0 1
master=# \q
在目标库查看记录
[postgres@node3 ~]$ psql slave postgres
psql (12.2)
Type "help" for help.
slave=# select * from tbl_lottu01;
 id |  info   
----+---------
  1 | lottu01
  2 | lottu02
(2 rows)

五、Bucardo应用场景

5.1、双master架构

Bucardo 可以实现PostgreSQL数据库的双master/多master的方案;

其实逻辑复制可以设计双主架构;在原生逻辑流复制针对冲突检查需要手动处理;但是在pglogical有对冲突处理。bucardo也有冲突处理。

以上面为例

#  添加数据库组;指定db2是源数据库,db1是目标数据库
bucardo add dbgroup dbgrp02 db2:source db1:target
# 添加同步
bucardo add sync sync02 relgroup=relgrp01 dbgroup=dbgrp02 conflict_strategy=bucardo_latest
这样可以完成双主架构
master=# insert into tbl_lottu01 values (3, 'lottu03');
INSERT 0 1
slave=# insert into tbl_lottu01 values (4, 'lottu04');
INSERT 0 1
查看master/slave结果是
=# select * from tbl_lottu01;
 id |  info   
----+---------
  1 | lottu01
  2 | lottu02
  4 | lottu04
  3 | lottu03
(4 rows)

5.2、测试数据同步

在生产环境数据库;都应有测试环境;有时需要在测试环境需要最新的数据验证新加的代码正确性。

# 关闭bucardo服务
bucardo stop
# 更新同步为增量同步;
bucardo update sync sync01 onetimecopy=2
    "onetimecopy"
        0: 关闭
        1: fullcopy;采用delete/copy的方式
        2: 增量copy;
# 启动bucardo服务
bucardo start

六、bucardo日常维护

参考《PostgreSQL修炼之道》第二版

Bucardo使用文档-lottu的更多相关文章

  1. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  2. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  3. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  4. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  5. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  6. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

  7. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

  8. ABP文档 - 后台作业和工作者

    文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...

  9. ABP文档 - Javascript Api

    文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...

随机推荐

  1. Go 数组&切片

    数组相关 在Go语言中,数组是一种容器相关的数据类型,用于存放多种相同类型的数据. 数组定义 在定义数组时,必须定义数组的类型以及长度,数组一经定义不可进行改变. 同时,数组的长度是按照元素个数进行统 ...

  2. helm部署mysql

    如果您的kubernetes已有了helm,那么部署mysql的步骤可以进一步简化,那些原先需要自己动手配置的deployment和service都已集成在chart中,今天就来实战通过helm部署m ...

  3. 开源后台系统*mee-admin*

    mee-admin开源后台系统 Preface 这是一个开放的时代,我们不能总是把东西揣在口袋里面自己乐呵. 也正如名言所说的"如果你有两块面包,你当用其中一块去换一朵水仙花" 所 ...

  4. 基于COCA词频表的文本词汇分布测试工具v0.1

    美国语言协会对美国人日常使用的英语单词做了一份详细的统计,按照日常使用的频率做成了一张表,称为COCA词频表.排名越低的单词使用频率越高,该表可以用来统计词汇量. 如果你的词汇量约为6000,那么这张 ...

  5. Inno Setup 5打包exe遇到的坑,做一个学习记录

    ; 脚本由 Inno Setup 脚本向导 生成!; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "人员管理系统"#de ...

  6. vue-integer-plusminus

    下载 vue-integer-plusminusvue-integer-plusminus 带有递增和递减按钮的整数输入 现场演示 该组件适合作为自旋按钮,允许键盘功能(向上/向下箭头或页面向上/向下 ...

  7. S3C6410 LCD驱动分析(转)

    一. 理论分析1. 几个概念:FIMC :    Fully Interactive Mobile Camera (完全交互式移动摄像机)FIMD:     Fully Interactive Mob ...

  8. 多测师讲解selenium_输入性弹框定位_高级讲师肖sir

    #输入性弹框from selenium import webdriverfrom time import sleepdrvier=webdriver.Chrome()url='file:///F:\d ...

  9. Rust之路(4)——所有权

    [未经书面同意,严禁转载] -- 2020-10-14 -- 所有权是Rust的重中之重(这口气咋像高中数学老师 WTF......). 所有权是指的对内存实际存储的数据的访问权(包括读取和修改),在 ...

  10. git commit 代码提交规范

    格式 type: description 1. type 类型 type 是 commit 的类别,只允许如下几种标识: fix: 修复bug add: 新功能 update: 更新 refactor ...