Slony-I 是 PostgreSQL 领域中最广泛的复制解决方案之一。它不仅是最古老的复制实现之一,也是一个拥有最广泛的外部工具支持的工具,比如pgAdmin3。
Slony-I 是一个“主到多个从属”复制系统,用于支持级联的 PostgreSQL
同步和故障切换。
Slony-I 使用逻辑复制;Slony-I 一般要求表有主键,或者唯一键;Slony-I 的工作不是基于 PostgreSQL 事务日志的,而是基于触发器的,基于逻辑复制高可用性。
Slony-I 功能及特点如下:
● Slony-I支持级联复制,一个节点为订阅者的同时,也可以作为下一级的数据提供者,数据的原始生产者对数据的修改,会在各级订阅者之间传播。
● Slony-I可以在PostgreSQL的主要版本之间同步数据。
● Slony-I可以在不同的硬件或操作系统之间同步数据。
● Slony-I支持仅允许将部分表的数据同步到从数据库。
● Slony-I支持将主数据库的一些表复制到一个从数据库,将其他表复制到另一个从数据库。
● Slony-I集群中的各节点上都需要有slon守护进程,以处理复制中的事 件,例如,配置事件、同步事件。
● Slony-I可以通过slonik工具进行管理和配置,其具备处理脚本的能力。
Slony-I 架构图如图 6-7 所示。
相关处理线程说明如下:
● 同步线程:同步线程维护一个到本地数据库的连接。在一个可配置间隔周期内,同步线程检查数据变更,然后通过调用CreateEvent()函数生成一个同步事件,同步线程不会和其他线程发生交互。
● 清理线程:清理线程维护一个到本地数据库的连接。在一个可配置的时间间隔内,它调用Cleanup()存储过程,该过程将删除旧的confirm、event和日志数据。在另一个时间间隔中,它清空confirm、event和log 表。清理线程不会和其他线程发生交互。
● 本地侦听线程:本地侦听线程维护一个到本地数据库的连接。它等待“事件”通知并扫描源自本地节点的事件。当接收到由管理程序调用存储过程以更改群集配置引起的新配置事件时,它将相应地修改复制引擎的内存中的配置。
● 远程侦听线程:每个远程节点都有一个远程侦听线程,侦听本地节点
(事件提供程序)接收事件。不管集群中有多少节点,一个典型的叶子节点只有一个远程侦听线程,因为它通过同一个提供程序接收来自所有来源的事件。远程侦听线程维护一个到其事件提供程序的数据库连接。在接收到事件或确认的通知后,它从相应的表中选择新的信息,并将它们提供给工作线程的相应内部消息队列。引擎为每个远程节点启动一个特定远程节点的工作线程(见下文)。消息在内部消息队列上转发到此节点特定的工作进程以进行处理和确认。
● 远程工作线程:每个远程节点都有一个远程工作线程。远程工作线程维护一个本地数据库连接,以执行实际的复制数据应用程序、事件存储和确认。工作线程处理的远程节点上的每个集合都有一个数据提供程序。在这些集合上,工作线程通过不同的数据提供程序维护一个数据库连接以执行实际的复制数据选择。远程工作线程在其内部消息队列上等待远程侦听线程转发的事件。然后,它处理这些事件,包括数据选择和应用程序,以及确认。这还包括维护引擎内存中的配置信息。
● Slony-I使用约束:Slony-I具备强大逻辑复制功能,但也有些限制,例如,大对象的复制、DDL复制、用户权限复制等。
Slony-I 只能同步以下内容:
● 表数据(不能同步DDL,表必须含有主键或者唯一键)。
● 序列。
Slony-I 不能自动同步以下内容:
● 对大对象(BLOBS)的变更。
● 对DDL(数据定义语句)的变更。
● 对用户和角色的变更。