在这里添加一个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)的更多相关文章

  1. PostgreSQL Replication之第十三章 使用PL/Proxy扩展(3)

    13.3 聪明地扩展与处理集群 建立集群不是您面临的唯一任务.如果所有的事情都做完了并且系统已经运行了,您可能需要到处调整配置. 13.3.1 添加和移动分区 一旦一个集群启动并运行,您可能会发现您的 ...

  2. PostgreSQL Replication之第十三章 使用PL/Proxy扩展(2)

    13.2 设置 PL/Proxy 简短的理论介绍之后,我们可以继续前进并运行一些简单的PL/Proxy设置.要做到这一点,我们只需安装PL/Proxy并看看这是如何被使用的. 安装PL/Proxy是一 ...

  3. PostgreSQL Replication之第六章 监控您的设置(4)

    6.4 处理监控工具 还有几个监控工具可以使您的日常生活更轻松. 其中最流行的监控工具是Nagios.它被广泛地使用,也支持各种软件组件. 要使用 Nagios 来监控您的 PostgreSQL 集群 ...

  4. PostgreSQL Replication之第四章 设置异步复制(4)

    4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...

  5. PostgreSQL Replication之第四章 设置异步复制(2)

    4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...

  6. PostgreSQL Replication之第四章 设置异步复制(1)

    执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...

  7. PostgreSQL Replication之第十一章 使用Skytools(3)

    11.3 管理 pgq-queues Skytools 的一个核心组件是pgq.它提供了一个通用排队接口,它可以让您把消息从一个消息提供者传送到一个任意数目的接收者. 现在的问题是:一般来说,一个队列 ...

  8. PostgreSQL Replication之第十一章 使用Skytools(1)

    向您介绍了 Slony 之后,我们将介绍另外一种流行的复制工作.Skytools 是一个最初有 Skype 开发的软件包,它有多种用途.Skytools 不只是一个单一的程序,而且是一个工具与服务的集 ...

  9. PostgreSQL Replication之第七章 理解Linux高可用(6)

    7.6 PostgreSQL和高可用性 数据库是我们日常数字生活的一部分,并期望它们快速工作. 您浏览网上论坛吗?那个帖子在数据库中.您看医生吗?您的医疗记录在数据库中.您在网上购物吗?那个货物,您的 ...

随机推荐

  1. Python之创建tuple和“可变”的tuple

    Python之创建tuple tuple是另一种有序的列表,中文翻译为" 元组 ".tuple 和 list 非常类似,但是,tuple一旦创建完毕,就不能修改了. 同样是表示班里 ...

  2. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  3. windbg sos版本不匹配问题解决

    dumpheap 时提示: 0:105> !dumpheap -stat The garbage collector data structures are not in a valid sta ...

  4. 【Android测试】【随笔】Bugtags初体验

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5410003.html 前言 早晨接到一个临时任务,就是尝试 ...

  5. 【Java 基础篇】【第九课】继承

    继承就是为了提高代码的复用率. 利用继承,我们可以避免代码的重复.让Woman类继承自Human类,Woman类就自动拥有了Human类中所有public成员的功能.我们用extends关键字表示继承 ...

  6. windows下安装nodejs尝尝鲜

    放Node.js作者镇楼! 1.下载对应的安装文件:http://nodejs.cn/download/ 2.自定义安装到D:\Program Files\nodejs,Add To Path一定要选 ...

  7. POI简易帮助文档系列--给Excel设置样式

    正如Html需要CSS一样,我们的POI生成的Excel同样需要样式才能更完美的表现我们的数据.下面还是从简单的例子出发,学习和了解POI的样式设计. 一.我的位置. package com.myja ...

  8. 比较java与c语言中数字转换成字符的不同

    java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...

  9. ArcGIS API for Silverlight代码中使用Template模板

    原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...

  10. 如何设置启动页 LaunchImage