PostgreSQL Replication之第十章 配置Slony(2)
10.2 理解 Slony如何工作
在我们开始复制我们的第一个数据库之前,我们想深入Slony的架构。理解这是如何工作的是非常重要的,否则,将不可能以一种有用的和合理的方法使用这个软件。与事务日志流不同,Slony使用逻辑复制。这意味着它不使用内部二进制数据(比如XLOG),但逻辑数据(在Slony的情况下,这是文本)代替。使用文本数据代替内置的事务日志有一定的优势,但也有些缺点,这将在本章中详细讨论。
10.2.1 处理逻辑复制
首先,我们要讨论的是,逻辑复制的真正含义:每个Slony设置的基础是所谓的更改日志触发器。这意味着只要Slony复制一个表的内容,它将创建一个触发器。然后,这个触发器将存储对表的所有改变到一个日志中。一个被称为slon的进程将检查此更改日志,并把这些更改复制到消费者。让我们可以下基本的算法:
INSERT INTO table (name, tstamp) VALUES ('hans', now());
trigger fires
('hans', '2013-05-08 13:26:02') as well as some bookkeeping
information will be stored in the log table
COMMIT
一段时间以后:
• slon 守护进程将会到来并读取自从上一次提交以后的所有改变。
• 所有的改变都将在slave上重放。
• 一旦做到这一点,日志就可以被删除了。
下图显示了Slony的整体架构:
请记住,传输协议是纯文本。这里主要的优点是,没有必要在集群中所有的节点上运行相同版本的PostgreSQL,因为Slony将抽象版本号。通过事务日志传送,我们不能做到这一点;因为在基于XLOG 复制的集群中的所有节点必须使用相同主版本号的PostgreSQL。
[更改日志是为特定的表而写的—这也意味着我们不必同时复制所有这些表;复制一个节点上那些表的一个子集是可能的。]
因为Slony是独立于PostgreSQL的版本,它可以很好地用于升级的目的。
10.2.2 slon 守护进程
正如我们已经指出的那样,slon守护进程将负责制成的特殊表的改变或者一组表并传送这些变化到所需的目的地。
为了使这工作,我们必须在我们的集群中的每个数据库都运行一个slon守护进程。
[请注意,我们所讨论的每个数据库一个slon守护进程—不是每个实例。当实际设置时,这是要考虑的重要事情。]
由于每个数据库都会有自己的slon守护进程,这些进程将相互通信以交换和调度数据。独立的slon守护进程也可以有中继功能和简单的数据传送功能。如果您想通过B数据库从A数据库复制数据到C数据库,这是很重要的。这个思想和您可以用流复制和级联复制实现的功能相似。
关于Slony的一件重要的事情是,没有必要复制整个实例或者整个数据库—复制总是和一个表或 一组表相关。尽可能多的数据库期望作为slave为这组特定的表提供服务时,一个数据库将作为master服务为每个表(或对于每一组表)。
可能会发生这种情况:一个数据库是表A与表B的master,另一个数据库将是表C与表D的数据库。换句话说,Slony允许数据来回复制。哪个数据从哪里流向何处将由slon守护进程管理。
slon 守护进程本身由多个服务于不同目的的线程组成,例如清理,时间监听,或者服务器上的应用改变。除此之外,它将会执行同步相关的任务。
要与slon守护进程进行交互,您可以使用一个叫做slonik的命令行工具。它将能够解释脚本并与直接与Slony进行对话。
PostgreSQL Replication之第十章 配置Slony(2)的更多相关文章
- PostgreSQL Replication之第十章 配置Slony(1)
在PostgreSQL领域中,Slony是最广泛的复制解决方案之一.它不仅是最老的复制方案实现的一个,但也是有最多的外部工具支持的一个,例如PgAdmin3等. 在本章中,我们将深入探究Slony并学 ...
- PostgreSQL Replication之第十章 配置Slony(6)
10.6 执行故障切换 一旦您学会了如何复制表并将它们添加到集合中,是时候学习故障转移了.基本上,我们可以在两个两种类型的故障转移之间做出区分: • 计划内故障转移 • 计划外故障转移和崩溃 在本节, ...
- PostgreSQL Replication之第十章 配置Slony(5)
10.5 给复制添加表和管理的问题 一旦我们增加了此表到系统中,我们可以将它添加到复制设置.这样做有点复杂.首先,我们必须创建我们自己的新表集合并把这个和我们已经有的表合并.因此,过一段时间,我们将有 ...
- PostgreSQL Replication之第十章 配置Slony(4)
10.4 部署DDLs 对于生产性的应用程序来说,仅仅复制一个表明显是不够的.此外,通过没有办法保证数据从来不会发生改变.在某些时候,部署变化的数据结构(所谓的DDLs)是必要的. 现在的问题是,Sl ...
- PostgreSQL Replication之第十章 配置Slony(3)
10.3 复制您的第一个数据库 这个小小的介绍之后,我们可以继续前进并复制我们的第一个数据库.要做到这一点,我们可以在一个数据库实例上创建两个数据库.我们想简单地在这两个数据库之间进行复制. [ 您在 ...
- [转]PostgreSQL Replication之扩展与BDR
原文:https://www.cnblogs.com/xmzzp/p/6284300.html postgres 实现master, slave ,且master是多主. -------------- ...
- PostgreSQL Replication之第九章 与pgpool一起工作(7)
9.7 处理故障转移和高可用 可以使用pgpool来解决的一些明显的问题是高可用性和故障转移.一般来讲,有使用pgpool或者不使用pgpool可以用来处理这些问题的各种方法. 9.7.1 使用Pos ...
- 安装Postgresql之后,创建用户 配置rails
登录 sudo su - postgres psql 1 创建Postgresql新用户,devpg是用户名,密码也是devpg, 不是超级管理员,拥有创建数据库权限,登录权限,继承拥有角色权限 cr ...
- PostgreSQL Replication之第四章 设置异步复制(4)
4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...
随机推荐
- HTML标签之间不是可以随便嵌套的
深究:我们先来认识in-line内联元素和block-line块元素,因为HTML里几乎所有元素都属于内联元素或者块元素中的一种. in-line这个词有很多种解释:内嵌.内联.行内.线级等,但是,它 ...
- CentOS安装JAVA后JAVA版本不对的问题
今天用CentOS安装JDK,发觉在安装完成后,输入java命令来验证是否安装成功时,出现 Usage: gij [OPTION] ... CLASS [ARGS] ... to i ...
- 【转】深入浅出 JavaScript 中的 this
Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象.一般在编译期确定下来,或称为编译期绑定.而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的,这 ...
- php 通过exec 创建git分支失败
今天给我们自己的发布系统增加一个新建分支的功能,操作比较简单,但是使用php执行shell命令的时候总是无法push分支到远程,但是登陆服务器执行却是可以的 新建分支命令如下 git fetch -- ...
- 低功耗蓝牙4.0BLE编程-nrf51822开发(10)-描述符
特性中的属性有两种:属性值或描述符. 支持通知或指示的特性中默认有一个描述符:客户端特性配置描述符(Client Characteristic Configuration Descriptor,CCC ...
- install zabbix-agent on CENTOS
in ubuntu--https://www.digitalocean.com/community/tutorials/how-to-install-zabbix-on-ubuntu-configur ...
- linux实现c多进程
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process)中只允许 ...
- 汇编ASCII大小写转换(字符串长度$的用法)
data segment first db "BaSiC" db "iNfOrMaTiOn" len equ $-first ;×Ö·û´®³¤¶È ends ...
- 设计模式:状态模式(State)
定 义:当一个对象内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况, 把状态的判断逻辑转移到表示不同状态的一系列子 ...
- boost.compressed_pair源码剖析
意义 当compressed_pair的某一个模板参数为一个空类的时候将对其进行“空基类优化”,这样可以使得compressed_pair占用的空间比std::pair的更小. 参考如下代码: #in ...