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和高可用性 数据库是我们日常数字生活的一部分,并期望它们快速工作. 您浏览网上论坛吗?那个帖子在数据库中.您看医生吗?您的医疗记录在数据库中.您在网上购物吗?那个货物,您的 ...
随机推荐
- Delphi指针的用法
DELPHI指针的使用 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是C语言的灵魂,一点都不为过.同时,这种说法也让很多人产生误解,似乎只有C语言的指针才 ...
- JS获取Cookie值
function GetLoginCookie() { var userCookie = getCookie("mycookie"); var loginname = userCo ...
- 智能手机,医疗诊断,云会议(gotomeeting/citrix)
在诊断领域已出现很多大有希望的创新,它们可能会起到真正的变革作用. 例如,有一种新技术可以让健康护理工作者用一部智能手机拍摄高质量的视网膜图像.这些数码照片像素很高,足以帮助检测白内障.黄斑退化.糖尿 ...
- QT中的SOCKET编程(QT-2.3.2)
转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...
- 【Android开发学习笔记】【第八课】五大布局-下
概念 五大布局上一篇文章已经介绍了 LinearLayout RelativeLayout 这一篇我们介绍剩下的三种布局 FrameLayout 五种布局中最佳单的一种布局.在这个布局在整个界面被当成 ...
- TP自带的缓存机制
原文章出处: http://blog.163.com/liwei1987821@126/blog/static/172664928201422133218356/ 动态缓存 Cache缓存类 vie ...
- 20145211 《Java程序设计》第7周学习总结——沧海横流
教材学习内容总结 Lambda Arrays的sort()方法可以用来排序,在使用sort()时,需要操作java.util.Comparator来进行说明,这样一来,语法就显得有些冗长.在JDK8中 ...
- windows 访问 ubuntu虚拟机 django服务器 失败
配置ubuntu配置成桥接,在ubuntu虚拟机中运行django.py开发服务器.windows访问django失败. 虚拟机运行: python manage.py runserver 0.0.0 ...
- visual studio2013 添加 dll库
在visual studio2013中添加C#的dll库.记录如下: 在solution explorer处右键,选择reference--> add References 选择Browser. ...
- Java 实现网站当前在线用户统计
1. import java.util.HashSet; import javax.servlet.ServletContext; import javax.servlet.http.HttpSess ...