PostgreSQL Replication之第十三章 使用PL/Proxy扩展(1)
在这里添加一个slave,真的有一个很好的可扩展性的策略,这基本上足以满足大多数现代应用程序。使用一台服务器的情况下,许多应用程序就会完美地运行,您可能想添加以副本以给基础设施增加一些安全,但在许多情况下,这是许多人想要的。
如果您的应用程序变得越来越大,可以在很多情况下,您可以添加slave和向外扩展读;这也不是什么大问题,并可以很容易地完成。如果您要添加更多的slave,您可能需要级联复制您您的基础设施,但对于98%的应用程序来说,目前为止,这就够了。
其余2%的应用程序由PL/Proxy来解决。PL/Proxy的思想是要能向外扩展写入。请记住,基于事务日志的复制只能向外扩展读,没有办法扩展写入。
[如果您想扩展写入,请使用PL/Proxy。]
13.1 理解基本概念
正如我们以之前所提到的,PL/Proxy背后的思想是像向外扩展读取一样来扩展写入,读取扩展可以使用我们在本书中之前列出的技术很容易地做到。
现在的问题是:您怎么向外扩展写?要做到这一点,我们必须要遵循一个老的罗马原则,它已经被广泛应用于战争:分而治之(英文:Divide and conquer)。一旦您成功地把一个问题拆分成多个小问题,您总是站在胜利的一边。
把该原则应用到数据库的工作意味着我们必须拆分写入并把它们分散到许多不同的服务器上。这里主要的艺术是如何明智地分割数据。
作为一个例子,我们简单地假设我们要拆分用户数据。让我们进一步假设,每个用户有一个用户名来标识他/她自己。
现在,我们 如何拆分数据呢?在这一点上,许多人将建议按字母顺序拆分数据。比方说,从A到M发到服务器1,所有剩下的发到服务器2.这实际上是一个糟糕的想法,因为我们永远不能假设数据是均匀分布的。一些名字可能只是比另外一些名字更相似,所以,如果您按字母来拆分,您永远不会使每个分区的数据的数量大致相同(这是非常期望的)。但是,我们一定要确保每台 服务器都有大致相同的数据量,我们要找到一种方法来扩展集群到更多的服务器。但是,让我们稍后讨论一下有用的分区函数。
13.1.1 考虑全局
在我们看一个真实的设置和如何对数据进行分区之前,我们必须讨论全局处理:从技术上讲,PL/Proxy是一种存储过程语言,它仅仅包括五个命令。这种语言的唯一目的是调度请求到集群内部的服务器。
让我们看看下面的图片:

我们拿到PL/Proxy并把它安装到一个服务器,这将作为我们的系统代理。每当我们做一个查询,我们要求代理给我们提供数据。代理将询问它的规则并找出查询要重定向到哪台服务器。基本上,PL/Proxy是一种分片的数据库实例。
[向代理请求数据的方法是调用了一个存储过程。由于写这本书的时候,没有办法真正创建一个虚拟的 表分发到多台服务器。您必须要使用过程调用。]
所以,如果您发出一个查询,PL/Proxy将尝试隐藏大量的复杂性,并只是为您提供数据,无论是来自哪里。
13.1.2 分区数据
正如我们刚才看到的,基本上,PL/Proxy就是一种分发数据到多个节点的方法。现在核心的问题是:我们如何以一种明智的,合乎情理的方法来拆分并分区数据?在本书中,我们已经解释过,按字母拆分可能不是所有想法中最好的一种,因为数据 不会被均匀分布。
当然,有很多方法来拆分数据。在本节中,我们将看一个简单而有效的方法,它可以适用于许多不同的场景。让我们假设,在这个例子中,我们要拆分数据并将其存储到16台服务器的阵列中。16是一个不错的数字,因为16是2的幂。在计算机科学中,2的幂通常是很好的数字,同样也适用于PL/Proxy。
均匀分配的数据的关键取决于第一次把您的文本值转换为一个整数:
test=# SELECT 'www.postgresql-support.de';
?column?
---------------------------
www.postgresql-support.de
(1 row)
test=# SELECT hashtext('www.postgresql-support.de');
hashtext
-------------
-1865729388
(1 row)
我们可以使用一个PostgreSQL内置的函数(不涉及PL/Proxy)来对文本进行哈希。它会给我们一个均匀分布的数字。因此,如果我们哈希一百万条数据,我们将看到均匀分布的哈希键。这是很重要的,我们可以把数据拆分成类似的块。
现在,我们可以拿到这个整数值,并只保留低四位 :
test=# SELECT hashtext('www.postgresql-support.de')::bit(4);
hashtext
----------
0100
(1 row)
test=# SELECT hashtext('www.postgresql-support.de')::bit(4)::int4;
hashtext
----------
4
(1 row)
最后四位是0100,它被转换回为整数。这回意味着该行应该存储到第五个节点上(如果我们从0开始计数)
使用哈希键是迄今为止最简单的拆分数据的方法。它有一些很不错的优点:如果您想增大您的集群的大小,您可以很容易地只再添加一位,而无需在集群中重新平衡数据。
当然,您总是可以拿出更复杂和精密的规则来分发数据。
PostgreSQL Replication之第十三章 使用PL/Proxy扩展(1)的更多相关文章
- PostgreSQL Replication之第十三章 使用PL/Proxy扩展(3)
13.3 聪明地扩展与处理集群 建立集群不是您面临的唯一任务.如果所有的事情都做完了并且系统已经运行了,您可能需要到处调整配置. 13.3.1 添加和移动分区 一旦一个集群启动并运行,您可能会发现您的 ...
- PostgreSQL Replication之第十三章 使用PL/Proxy扩展(2)
13.2 设置 PL/Proxy 简短的理论介绍之后,我们可以继续前进并运行一些简单的PL/Proxy设置.要做到这一点,我们只需安装PL/Proxy并看看这是如何被使用的. 安装PL/Proxy是一 ...
- PostgreSQL Replication之第六章 监控您的设置(4)
6.4 处理监控工具 还有几个监控工具可以使您的日常生活更轻松. 其中最流行的监控工具是Nagios.它被广泛地使用,也支持各种软件组件. 要使用 Nagios 来监控您的 PostgreSQL 集群 ...
- PostgreSQL Replication之第四章 设置异步复制(4)
4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...
- PostgreSQL Replication之第四章 设置异步复制(2)
4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...
- PostgreSQL Replication之第四章 设置异步复制(1)
执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...
- PostgreSQL Replication之第十一章 使用Skytools(3)
11.3 管理 pgq-queues Skytools 的一个核心组件是pgq.它提供了一个通用排队接口,它可以让您把消息从一个消息提供者传送到一个任意数目的接收者. 现在的问题是:一般来说,一个队列 ...
- PostgreSQL Replication之第十一章 使用Skytools(1)
向您介绍了 Slony 之后,我们将介绍另外一种流行的复制工作.Skytools 是一个最初有 Skype 开发的软件包,它有多种用途.Skytools 不只是一个单一的程序,而且是一个工具与服务的集 ...
- PostgreSQL Replication之第七章 理解Linux高可用(6)
7.6 PostgreSQL和高可用性 数据库是我们日常数字生活的一部分,并期望它们快速工作. 您浏览网上论坛吗?那个帖子在数据库中.您看医生吗?您的医疗记录在数据库中.您在网上购物吗?那个货物,您的 ...
随机推荐
- MySQL线程独享[转]
一.前言在 MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量。 二.线 ...
- mysqli_query($link,'SET group_concat_max_len=8192');
mysqli_query($link,'SET group_concat_max_len=8192'); $sql = 'SELECT GROUP_CONCAT(w) FROM ---'; mysql ...
- ArcMap 标注、注记、图形文本
标注.注记.图形文本 2016年8月10日10:29 ArcMap中怎样向地图添加文本,其中标注与注记是重点内容,此处对此进行总结. 参考链接: ①地图文本基本词汇: 什么是文本? ArcGIS 提供 ...
- nginx proxy_pass
在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理 ...
- Java ArrayListSerialise
import java.io.*; import java.util.*; //ArrayListSerialise public class A { public static void main( ...
- java event
What is an Event? Change in the state of an object is known as event i.e. event describes the change ...
- WeakHashMap 理解笔记
An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. M ...
- Mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业平台性无关的基础组件
http://www.oschina.net/p/wechat-mars http://www.oschina.net/news/80453/wewechat-open-source-plan
- C++ 实现 发送HTTP Get/Post请求 good
1.简述 最近简单看了一下关于HTTP请求方面的知识,之前一直用Qt来实现,有专门HTTP请求的QNetworkAccessManager类来处理,实现也比较简单,这里主要讲解一下用C++代码来实现H ...
- Prism&MEF构建开发框架 (一)
Shell框架XECA shell.xaml主要起到是一个容器或壳的作用 <Window x:Class="XECA.Shell" xmlns="http ...