共计 5312 个字符,预计需要花费 14 分钟才能阅读完成。
这期内容当中丸趣 TV 小编将会给大家带来有关使用 Bucardo5 怎么实现 PostgreSQL 主数据库复制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
为了演示方便,我使用了亚马逊 Web 服务(AWS)提供的可快速创建、随意使用的服务器,即运行 Amazon Linux 的基本 t1.micro 服务器。如果你按照提示继续的话,它将免费而且简单地给你创建一个服务器实例。一旦实例创建成功,我们就可以使用 ec2-user 账户通过 SSH 协议登陆到服务器,这时就可以开始安装 PostgreSQL 和 Bucardo 了。
# Always a good idea:
$ sudo yum update
# This also installs other postgresql packages:
$ sudo yum install postgresql-plperl
# Create a new Postgres cluster:
$ initdb btest
此时,我们仍然不能期待哦你个 PostgreSQL,因为这个发布版的 socket 通信目录使用的是 /var/run/postgresql 和 /tmp。我们调整了第一个目录的权限后就可以启动 PostgreSQL 了,然后创建第一个测试数据库:
$ sudo chmod 777 /var/run/postgresql
$ pg_ctl -D btest -l logfile start
$ createdb shake1
接下来我们就可以进行数据库复制了!为了得到样例数据,我使用了开放源代码的 Shakespeare 项目。它有一个易于装载的小型的、可任意使用的、简单的数据库模式。github 上的这个小型项目就包含了一个现成的 PostgreSQL 数据库模式,现在我们将可以把它装载到新的数据库了:
$ sudo yum install git
$ git clone -q https://github.com/catherinedevlin/opensourceshakespeare.git
$ psql shake1 -q -f opensourceshakespeare/shakespeare.sql
# You can safely ignore the role does not exist errors
我们打算创建这个数据库的副本,这些副本可被当作其他数据源。换个说法,这些服务器拥有相同的数据而且可以写入。实现这些非常简单:
$ createdb shake2 -T shake1
$ createdb shake3 -T shake1
Bucardo 需要安装一些依赖包。如果你安装的操作系统发布不同,那么你可能要安装的依赖包就不同:下面是我写这篇文章的时候 Amazon Linux 需要安装的依赖包。(如果幸运的话,你的发布包可能已经包含了 Bucardo,在这种情况下,下面的执行步骤就不需要执行了,你只要运行 yum install bucard 就可以了 - 不过要确定一下你使用的是版本 5 或者更好的版本!(通过 yum info 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
在这个系统的 yum 软件仓库里不包含 Perl 模块 DBIx::Safe,因此我们需要通过 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 --verify Bucardo.tar.gz.asc
$ tar xfz Bucardo.tar.gz $ ln -s Bucardo-5.0.0 bucardo
$ cd bucardo
$ perl Makefile.PL
$ make
$ sudo make install
我们对 bucardorc 文件 (设置某些全局信息的文件)进行某些小的调整。然后运行 bucardo install , 这条命令将创建 bucardo 的主数据库,其中包含 Bucardo 服务进程所需的信息:
$ mkdir pid
$ echo -e piddir=pid\nlogdest=. .bucardorc
$ bucardo install --batch --quiet
Creating superuser bucardo
现在已经安装好 Bucardo, 接下来就准备复制了。此时,我们有了三个可以彼此复制的数据库。下面我们只使用了两条命令就可以实现三数据库彼此复制:
bucardo add dbs s1,s2,s3 dbname=shake1,shake2,shake3
Added databases s1 , s2 , s3
$ bucardo add sync bard dbs=s1:source,s2:source,s3:source tables=all
Added sync bard
Created a new relgroup named bard
Created a new dbgroup named bard
Added table public.chapter
Added table public.character
Added table public.character_work
Added table public.paragraph
Added table public.wordform
Added table public.work
第一条命令,我们告诉 Bucardo 如何连接到三个数据库,我们告诉 Bucardo 数据库的名字,然后 Bucardo 把这三个数据库看作 (s1,s2,s3)。你还可以指定端口和主机,不过在这个例子里,默认的端口为 5432,而且不需要主机(采用的是 Unix Socket 通信机制)。
第二条命令创建了一个已命名的复制系统,其 sync 名称为 bard。Bucardo 需要知道复制到哪儿和如何复制,因此我们告诉它使用三个数据库 s1,s2 和 s3。每一个数据库都可以作为源数据库,因此我们给它们添加了这样的信息。最后我们需要知道要复制什么。在这个例子里,我们需要复制的是所有表(或者更精确点,复制具有主键或者唯一索引的所有数据库)。注意: Bucardo 总是把数据库和表放在命名组里 - 在这个例子里我们只是硬编码其为 10,然而通常这个值是表格视图控制器数组的长度。现在例子里,这一切都是自动进行的,dbgroup 和 relgroup 都是以 sync 的名字命名的。
我们验证一下复制是否运行,即检查一下更新行是否复制到 sync 里包含的所有数据库了:
$ bucardo start
$ psql shake1 -c \
update character set speechcount=123 where charname= Hamlet
UPDATE 1
$ for i in {1,2,3}; do psql shake$i -tc select \
current_database(), speechcount from character \
where charname= Hamlet done | grep s
shake1 | 123
shake2 | 123
shake3 | 123
我们还可以查看 Bucardo 的日志文件 log.bucardo , 看看是否有复制操作:
$ tail -2 log.bucardo
(25181) KID (bard) Delta count for s1.public. character : 1
(25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=0
上面出现了两条 delete 和两条 insert 命令,这是因为更新一行意味着在其他两个数据库上首先运行的是 delete,然后才运行 insert(技术上采用的 COPY)。接下来我们看看 Bucardo 是怎么处理冲突的。我们将对所有服务器上的同一行进行更新,这样就会产生冲突:
$ for i in {1,2,3}; do psql shake$i -tc \
update character set speechcount=$i$i$i \
where charname= Hamlet done
UPDATE 1
UPDATE 1
UPDATE 1
查看日志表明确实存在冲突,而且也很好的解决了冲突。默认的冲突解决方案表明:最后一个更新的数据库是获胜者,现在所有三个数据库具有与最后一个更新数据库相同的行。
$ tail log.bucardo
(25181) KID (bard) Delta count for s1.public. character : 1
(25181) KID (bard) Delta count for s2.public. character : 1
(25181) KID (bard) Delta count for s3.public. character : 1
(25181) KID (bard) Conflicts for public. character : 1
(25181) KID (bard) Conflicts have been resolved
(25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=1
$ for i in {1,2,3}; do psql shake$i -tc \
select current_database(), speechcount \
from character where charname= Hamlet done | grep s
shake1 | 333
shake2 | 333
shake3 | 333
我们开发这个示例的时候,Bucardo 有时运行的非常快,所以没有发生冲突。也就是说,因为更新时顺序执行的。所以在下一个更新之前,存在一个时间窗口可以让 Bucardo 完成更新的复制。另外,“暂停 sync 功能也非常方便,只要在你需要暂时停止运行 sync 的情况下,运行下面命令即可:
$ bucardo pause bard
Syncs paused: bard
$ psql shake1 -c update character set speechcount=1234 where charname= Hamlet
UPDATE 1
$ psql shake2 -c update character set speechcount=4321 where charname= Hamlet
UPDATE 1
$ bucardo resume bard
Syncs resumed: bard
$ tail log.bucardo
(27344) KID (bard) Delta count for s1.public. character : 1
(27344) KID (bard) Delta count for s2.public. character : 1
(27344) KID (bard) Conflicts for public. character : 1
(27344) KID (bard) Conflicts have been resolved
(27344) KID (bard) Totals: deletes=2 inserts=2 conflicts=1
Bucardo 5 比我们在这儿演示的功能多很多。以后的博客文章里我们将包含它可以完成的其他功能,从复制到比如 Oracle、Mysql 或者 MongoDB 等非 PostgreSQL 系统到使用自定义的冲突解决方案。以及复制时对正在运行的数据实行转换。如果你有任何问题,请在下面的评论里说明,或者写一封短信给 Bucardo 邮件列表 bucardo-general@bucardo.org。
上述就是丸趣 TV 小编为大家分享的使用 Bucardo5 怎么实现 PostgreSQL 主数据库复制了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。