Bucardo使用文档-lottu

摘要:
官方网站地址1:Bucardo描述Bucardo是一个基于表复制的系统。Bucardo可以实现PostgreSQL数据库的双主/多主方案。Bucardo的核心是一个Perl守护程序,它监听通知请求,并通过连接到远程数据库并来回复制数据对其进行操作。运行Bucardo的第一步是向主Bucardo数据库添加两个或更多数据库。设置Bucardo后,触发器开始存储所有相关表中哪些行已更改的信息。

官网地址

一、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)"
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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue生态圈之----Axios学习笔记python datetime模块下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件

出处:http://www.cnblogs.com/lichenwei/p/4145696.html Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件。 1、相关文件 关于Mybatis-Generator的下载可以到这...

Spring框架之jdbc源码完全解析

Spring框架之jdbc源码完全解析        Spring JDBC抽象框架所带来的价值将在以下几个方面得以体现:        1、指定数据库连接参数        2、打开数据库连接        3、声明SQL语句        4、预编译并执行SQL语句        5、遍历查询结果(如果需要的话)        6、处理每一次遍历操作...

大数据和高并发的解决方案总结

现在,软件架构变得越来越复杂了,好多技术层出不穷,令人眼花缭乱,解决这个问题呢,就是要把复杂问题简单化,核心就是要把握本质。 软件刚开始的时候是为了实现功能,随着信息量和用户的增多,大数据和高并发成了软件设计必须考虑的问题,那么大数据和高并发本质是什么呢? 本质很简单,一个是慢,一个是等。两者是相互关联的,因为慢,所以要等,因为等,所以慢,解决了慢,也就...

容器编排系统K8s之包管理器Helm基础使用(二)

前文我们介绍了helm的相关术语和使用helm安装和卸载应用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14305902.html;今天我们来介绍下自定义chart以及打包chart,helm其他命令使用和私有helm仓库搭建相关话题; 继上一篇博客,我们了解了使用helm在k8s上安装应用,卸载应用,以及仓库...

robotframework在3.7下的搭建

网上看了大多安装RIDE都是在python2的环境下,今天试了下python3的安装,成功了,步骤如下: 1.首先是python3的安装,以及pip这些工具,具体的网上一堆,不再啰嗦 2.安装robotframewor,使用下面命令,当然如果pip环境变量配置没问题,下面的pip.exe可以为pip pip.exe install robotframewo...

redis 参数配置总结

redis.conf 配置项说明如下 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程   daemonize no 2. 当Redis以守护进程方式运行时,Redis默认会把pid写入 /var/run/redis.pid 文件,可以通过pidfile指定pidfile /var/run/redis.pi...