12.4 性能优化

Postgres-XC不是一个奇特的PostgreSQL版本,而是一个真正的分布式系统。这意味这,您不能只存储数据,希望事情超出服务器之外的快速,高效。如果您想优化速度,思考数据是如何在幕后存储的,以及查询是如何执行的是非常有益的。

当然,您可以只加载数据,事情也会工作 ,但,如果性能真的是一个问题,您真的应该去想想如何利用您的数据。请记住,如果您的负载较低的话,使用一个分布式数据库系统是没有意义的。因此,如果您是一个Postgres-XC使用者,我们希望您的负载和您的要求非常高。

12.4.1 调度表

最重要的一个问题是数据存储在哪里。Postgres-XC不会知道您打算用您的数据做什么,以及您真正计划执行什么类型的访问模式。要确保,用户获得在哪里存储数据的控制权,CREATE TABLE 提供了一些语法:

[ DISTRIBUTE BY { REPLICATION | ROUND ROBIN

| { [HASH | MODULO ] ( column_name ) } } ]

[ TO { GROUP groupname | NODE nodename [, ... ] } ]

DISTRIBUTE BY 子句允许您指定在那里存储一张表,如果您想告诉Postgres-XC,一张表必须在集群中的每个节点上,我们推荐使用REPLICATION。如果您在创建一个小的查找表或者一些在查询中频繁使用的表,这尤其有用。

如果目标是向外扩展,建议散布一个表到一系列的节点。为什么会有人想拆分表?原因其实很简单。如果您把一个表复制到所有的数据节点上,它实际上意味着您将在每个节点上都有一个写操作。显然,与单节点相比,这不是扩展,因为每个节点都必须承担所有的负载。对于面临严重写的大表来说,把表分裂到多个节点可以说是有益的。Postgres-XC提供了多种方法以做到这一点。

ROUND ROBIN只是或多或少随机地分布,HASH会基于一个哈希键调度数据,MODULO将根据一个特定的键简单均匀地分布数据。

为了使管理变得更轻松,Postgres-XC允许您将节点分成所谓的节点组。如果一个表不应该驻留在集群中所有的节点上,而是只驻留在其中一半的节点上,这就会很方便。

要对节点进行分组,您可以调用 CREATE NODE GROUP:

test=# \h CREATE NODE GROUP

Command: CREATE NODE GROUP

Description: create a group of cluster nodes

Syntax:

CREATE NODE GROUP groupname

WITH nodename [, ... ]

请记住,一个节点组是静态的;您不能在以后往节点组里添加节点。因此,如果您开始整理您的集群,您必须事先考虑您的集群将有哪些区域。

除此之外,一旦数据已经被调度,重组数据是相当困难的。如果一个表分布在四个节点上,您不能只是轻松地添加第五个节点来处理该表。首先,添加第五个节点将需要重新平衡,其次,这些大部分功能仍然在建设当中,对终端用户来说尚不完全可用。

12.4.2 优化连接

如果您想连接数据,巧妙地调度数据是必须的。让我们假设一个包括三个表的简单场景:

• t_person: 此表有我们系统中的一些人组成。

• t_person_payment: 此表由一个人支付的所有款项组成。

• t_postal_code: 此表由您所在区域的邮政编码组成。

让我们假设,我们要经常连接这些数据。在这种情况下,强烈建议由同样的连接键对t_person 和 t_person_payment 进行分区。这样做将使Postgres-XC连接并合并一些数据节点上的本地数据,而不必传输集群内的数据。当然,我们也可以创建t_person表的完整副本,如果该表读的如此频繁,以至于这样做有意义。

t_postal_code 是一个可能被复制到所有节点的一个表的典型的例子。我们可以预期邮政编码是静态的。在现实生活中,邮政编码基本上不会变(至少,每秒1000个邮政编码),该表也将是非常小的,而且它也将会被许多其它的连接所需要。这里,一个完整的副本会非常有意义。

当进行适当的逻辑划分是,我们只是想提醒您一个简单的规则:尝试本地计算,尝试避免带有任何代价的数据移动。

12.4.3 优化仓库

如果您的目标是使用Postgres-XC做商业智能和数据仓库,您必须确保您有很高的扫描速度。这可以通过同时使用尽可能多的硬件来实现。在这里,向外扩展您的实际表到多个主机将会非常有意义。

我们也建议完全复制小的查找表,以便可以在这些节点上执行尽可能多的工作。小在这里意味着什么?让我们想象一下,您正在存储世界各地上百万人的信息。您可能要拆分数据到多个节点上。但是,如果您把潜在的国家的名单分开,这显然是不合理的。这个星球上的国家的数目是有限的,所以,有这些数据的副本在所有的节点上是更加简单可行的。

12.4.4 创建一个 GTM Proxy

来自GTM请求的事务ID是一个相当昂贵的过程。如果您正在运行一个大型的Postgres-XC设置应该处理在线事务处理(OLTP)工作的负载,实际上GMT才是瓶颈所在之处。我们需要的全局事务ID越多,GTM的性能将会越重要。

要解决这个问题,我们可以引入一个GTM Proxy。这个思想是,事务ID被大量地请求。其核心思想是,我们要避免网络通信,尤其是延迟。这个概念和如何在PostgreSQL的工作中分组提交非常类似。

如何设置一个简单的 GTM Proxy ?首先,我们必须创建一个目录,该目录用于存放配置文件。然后,我们可以做如下调用:

initgtm -D /path_to_gtm_proxy/ -Z gtm_proxy

这将创建一个配置文件样本,我们可以简单轻松地改写它。定义一个节点名之后,我们应该设置gtm_host 和 gtm_port 指向活跃的GTM。然后,我们可以调整工作线程的数量到一个合理的数量,以确保我们可以处理更多的负载。通常,我们用一种 worker_threads 的数量和系统中的节点的数量相匹配的方法来配置GTM Proxy。这已经被证明是一个健壮的配置。

最后,我们可以启动代理基础设施:

gtm_ctl -D /path_to_gtm_proxy/ -Z gtm_proxy start

对我们的系统来说,GTM Proxy 现在是可用的。

PostgreSQL Replication之第十二章 与Postgres-XC一起工作(4)的更多相关文章

  1. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(7)

    12.7 处理故障转移和删除节点 在本节中,我们将看看故障切换如何处理.我们还将看看如何使用安全可靠的方法添加节点到Postgres-XC设置以及如何从Postgres-XC设置删除节点. 12.7. ...

  2. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(3)

    12.3 配置一个简单的集群 在本章中,我们要建立一个由三个数据节点组成的集群.一个协调节点,以及管理集群的全局事务管理节点.对于每个组件,我们必须创建一个目录: hs@vm:~/data$ ls - ...

  3. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(1)

    在本章中,我们希望将我们的注意力集中在写可扩展,多主,同步,对称和PostgreSQL的称为Postgres-XC(PostgreSQL eXtensible Cluster)的透明复制方案.该项目的 ...

  4. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(5)

    12.5 创建表和发送查询 介绍了Postgres-XC以及其底层的思想之后,是时候创建我们的第一个表,看看集群将如何表现.下面的例子演示了一个简单的表.将使用id列的哈希键来分布它: test=# ...

  5. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(2)

    12.2安装 Postgres-XC 可以从 http://postgres-xc.sourceforge.net/下载Postgres-XC.对于本书,我们使用1.0.3版本的Postgres-XC ...

  6. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(6)

    12.6 添加节点 Postgres-XC允许您在那个过程中的任何一个时间点添加新的服务器到计划中.所有您需要做的是按照我们之前演示的设置一个节点,并在 控制器上调用CREATE NODE.然后,该系 ...

  7. PostgreSQL Replication之第十四章 扩展与BDR

    在这一章中,将向您介绍一个全新的技术,成为BDR.双向复制(BDR),在PostgreSQL的世界里,它绝对是一颗冉冉升起的新星.在不久的将来,许多新的东西将会被看到,并且人们可以期待一个蓬勃发展的项 ...

  8. PostgreSQL Replication之第十五章 与Walbouncer 一起工作

    与Walbouncer 一起工作 在本书的最后一章,将引导您通向2014年发布的一个工具,称为walbouncer.本书中的大多数技巧说明了如何复制整个数据库实例,如何分片,等等.在最后一章,是关于w ...

  9. PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)

    主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...

随机推荐

  1. SMS模型格网转换为MIKE21的格网源代码

    program main !sms网格转换成mike21网格 DIMENSION X(),Y(),H(),NDNN(,),ncbd() dimension NBS(),NOBD(,),NSED(,), ...

  2. MVC程序实现Autocomplete功能

    为了加强MVC的功力,加强练习是少不了的事情.Insus.NET这次想实现文本框的autocomplete功能. 在数据创建一张表[PinYin]: 插入一些数据: INSERT INTO [dbo] ...

  3. 【转】如何使php的MD5与C#的MD5一致?

    有c#生成MD5的代码如下: class CreateMD5 { static void Main(string[] args) { string source = "提问指南"; ...

  4. comms.nottingham.ac.uk/learningtechnology

    http://comms.nottingham.ac.uk/learningtechnology/

  5. http协议(转)

    主要还是为了存放状态码··· 剖析 HTTP 协议   目录 HTTP 概述 HTTP 消息结构 HTTP 请求 HTTP 响应 HTTP 状态码 参考 回到顶部 HTTP 概述 HTTP 是什么? ...

  6. ASP.NET一些公共方法commTools

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  7. 如何写出无法维护的代码(JAVA版)

    程序命名(针对那些不能混淆的代码) 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, x,y,z,或者干脆上中文比如(阿隆索肯德基) 有创意地拼写错误.比如:SetPint ...

  8. Sass和Compass制作雪碧图

    1.安装好了sass与compass之后设置一个配置文件 2.新增一个雪碧图文件夹用来存放将要合并的图片例如color文件夹 3.@import命令引用 .Compass看到@import指令的参数为 ...

  9. CodeForce727C. Guess the Array---交互题

    题目链接:http://codeforces.com/contest/727/problem/C 题意:交互题: printf(“? i j\n”); fflush(stdout); 然后scanf( ...

  10. Java学习-040-级联删除目录中的文件、目录

    之前在写应用模块,进行单元测试编码的时候,居然脑洞大开居然创建了一个 N 层的目录,到后来删除测试结果目录的时候,才发现删除不了了,提示目录过长无法删除.网上找了一些方法,也找了一些粉碎机,都没能达到 ...