如何使用Bucardo5实现PostgreSQL主数据库复制

分类:编程技术 时间:2024-02-20 15:26 浏览:0 评论:0
0
本期小编就来告诉大家如何使用Bucardo5实现PostgreSQL主库复制。文章内容丰富,从专业角度进行了分析和描述。希望您能通过阅读本文有所收获。

为了演示,我使用了 Amazon Web Services (AWS) 提供的快速创建的一次性服务器,这是一个运行 Amazon Linux 的基本 t1.micro 服务器。如果您按照提示操作,它将免费且轻松地为您创建一个服务器实例。实例创建成功后,我们就可以使用ec2-user账户通过SSH协议登录服务器了。这时候我们就可以开始安装PostgreSQL和Bucardo了。

# 总是一个好主意:$ sudo yum update# 这也会安装其他 postgresql 软件包:$ sudo yum install postgresql-plperl# 创建一个新的Postgres集群:$ initdb btest

此时,我们仍然不能指望你的PostgreSQL,因为socket通信此版本的目录使用 /var/run/postgresql 和 /tmp。调整完第一个目录的权限后,我们就可以启动PostgreSQL,然后创建第一个测试数据库:

$ sudo chmod 777 /var/run/postgresql$ pg_ctl -D btest -l logfile start$ createdb shake1


接下来我们可以复制数据库了!为了获取示例数据,我使用了开源莎士比亚项目。它采用易于加载、紧凑、一次性、简单的数据库模式。 github 上的这个小项目包含一个现成的 PostgreSQL 数据库架构,我们现在可以将其加载到新数据库中:

$ sudo yum install git$ git clone -q https://github.com/catherinedevlin/opensourceshakespeare.git$ psql shake1 -q -f opensourceshakespeare/shakespeare.sql# 您可以安全地忽略“角色不存在”错误 
<我们计划创建该数据库的副本,以用作其他数据源。换句话说,这些服务器具有相同的数据并可以写入。实现这一点非常简单:

$createdb shake2 -T shake1$createdb shake3 -T shake1

Bucardo需要安装一些依赖包。如果您安装的操作系统是不同版本发布的,那么您可能需要安装不同的依赖包: 以下是我撰写本文时 Amazon Linux 需要安装的依赖包。 (如果幸运的话,您的发行包可能已经包含 Bucardo。在这种情况下,不需要执行以下执行步骤。您可以只运行“yum install bucard” - 但请确保您使用的是版本 5 或更高版本!(查看通过yum 信息 bucardo))

$ sudo yum install perl-ExtUtils-MakeMaker perl-DBD-Pg \> perl-Encode-Locale perl -Sys-Syslog perl-boolean \> perl-Time-HiRes perl-Test-Simple perl-Pod-Parser$ sudo yum install cpan$ echo y | cpan DBIx::Safe 


Perl 模块 DBIx::Safe 不是我的包含在本系统的yum软件仓库中,因此我们需要通过CPAN安装该模块。成功安装上述所有依赖项后,我们现在就可以安装Bucardo了。我们获取官方压缩包,验证,解压,然后安装:

$ wget -nv http://bucardo.org /Bucardo .tar.gz$ wget -nv http://bucardo.org/Bucardo.tar.gz.asc$ gpg -q --keyserver pgp.mit.edu --recv-key 14964AC8$ gpg --验证布卡多。柏油。 gz.asc$ tar 全局信息文件)进行一些细微的调整。然后运行“bucardo install”。此命令将创建 bucardo 的主数据库,其中包含 Bucardo 服务进程所需的信息:

$ mkdir pid$ echo -e "piddir =pid\nlogdest=。” > .bucardorc$ bucardo install --batch --quietCreating superuser 'bucardo'


现在 Bucardo 已安装,我们准备复制它。此时,我们有三个数据库可以复制互相吃了。下面我们仅使用两条命令将三个数据库相互复制:

 bucardo add dbs s1,s2,s3 dbname=shake1 , shake2,shake3添加了数据库 "s1","s2","s3"$ bucardo addsync bard dbs=s1:source,s2:source,s3:sourcetables=all添加了同步 "bard" 创建了一个名为 "bard" 的新 relgroup 创建了一个名为“bard”的新数据库组 添加了表“public.chapter” 添加了表“public.character” 添加了表“public.character_work” 添加了表“public.paragraph” 添加了表“public.wordform” 添加了表“public.work”

在第一个命令中,我们告诉 Bucardo 如何连接到三个数据库。我们告诉Bucardo数据库的名称,然后Bucardo把这三个数据库放进去。每个数据库被视为(s1,s2,s3)。也可以指定端口和主机,但本例中默认端口为5432,不需要主机(使用Unix Socket通信机制)。


第二个命令创建一个命名复制系统同步名吟游诗人。 Bucardo 需要知道在哪里以及如何复制,因此我们告诉它使用三个数据库 s1、s2 和 s3。每个数据库都可以用作源数据库,因此我们将这些信息添加到它们中。最后我们需要知道要复制什么。在此示例中,我们需要复制所有表(或更准确地说,复制具有主键或唯一索引的所有数据库)。注意:Bucardo 总是将数据库和表放在命名组中 - 在本例中我们只是将其硬编码为 10,但通常该值是表视图控制器数组的长度。在当前示例中,这一切都是自动完成的,并且 dbgroup 和 relgroup 以sync 命名。

让我们验证复制是否正在运行,即检查更新的行是否复制到同步中包含的所有数据库:

$ bucardo start$ psql shake1 -c \> "更新字符集speechcount=123 where charname='Hamlet'"UPDATE 1$ for i in {1,2,3};执行 psql shake$i -tc "select \> current_database(), voicecount from character \> where charname='Hamlet'"; did | grep s shake1 | 123 shake2 | 123 shake3 | 123

我们还可以检查 Bucardo 的日志文件“log.bucardo”来查看看看是否有复制操作:

$ tail -2 log.bucardo(25181) KID (bard) s1 的增量计数。 public."character": 1(25181) KID (bard) Totals:deletes=2 inserts=2conflict=0


上面有两个删除和两个插入命令,这是因为更新a row表示在另外两个数据库上,先运行delete,然后运行insert(技术上是COPY),接下来我们看看Bucardo是如何处理冲突的,我们会在所有服务器上更新同一行,这样就发生了冲突:

$ for i in {1,2,3}; do psql shake$i -tc \> "更新字符集speechcount= $i$i$i \> where charname='Hamlet'"; didUPDATE 1UPDATE 1UPDATE 1

查看日志发现确实有冲突,解决了冲突湖默认冲突解决方案显示最后更新的数据库是获胜者,现在所有三个数据库都与最后更新的数据库具有相同的行。

$ tail log.bucardo(25181) KID (bard) s1.public."character": 1(25181) KID (bard) s2.public."character": 1(25181) KID ( bard) s3.public."character" 的增量计数:1(25181) KID (bard) public."character": 1(25181) KID (bard) 冲突已解决(25181) KID (bard) 总计:删除=2 插入=2 冲突=1 $ for i in {1,2 ,3}; do psql shake$i -tc \>“从字符中选择 current_database(),speechcount \>,其中 charname='Hamlet'”;完成 | grep 的 shake1 |第333章333 摇动3 | 333

我们开发这个例子时,Bucardo有时跑得很快,所以没有发生冲突。换句话说,因为更新是按顺序执行的。因此,在下次更新之前,有一个时间窗口可以让布卡多完成副本更新。另外,“暂停同步”功能也很方便,只要需要暂时停止运行同步,运行以下命令就足够了:

$ bucardo 暂停 bardSyncs 暂停: bard$ psql shake1 -c "更新字符集语音计数=1234 其中 charname= '哈姆雷特'"更新 1$ psql shake2 -c "更新字符集语音计数=4321 其中 charname='哈姆雷特'“更新 1$ bucardo 简历 bardSyncs 已恢复:bard $ tail log.bucardo(27344) KID (bard) s1 .public 的增量计数。“character”: 1(27344) KID (bard) s2.public 的增量计数。”字符”:1(27344)KID(吟游诗人)公共冲突。“字符”:1(27344)KID(吟游诗人)冲突已解决(27344)KID(吟游诗人)总计:删除=2插入=2冲突=1< /pre>


Bucardo 5 的功能比我们在这里演示的功能多得多。我们将在未来的博客文章中包含其他可以完成的功能,从复制到 Oracle、MySQL 或 MongoDB 等非 PostgreSQL 系统到使用自定义配置法律决议。以及在复制时对运行数据执行转换。如果您有任何疑问,请在下面评论其中的说明,或者写短信到布卡多邮件列表bucardo-general@bucardo.org。

以上是小编分享的与您一起如何使用Bucardo5实现PostgreSQL主库复制。如果你正好有类似的疑惑,不妨参考上面的分析来了解一下。如果您想了解更多相关知识,请关注行业资讯频道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何使用Bucardo5实现PostgreSQL主数据库复制

用户评论