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. JAVA中的throws和throw的区别

    Java     一直对java中的throws和throw不太理解.最近一直在查这两个方面的资料,算是能明白一点吧.如果我下面的观点哪有不对,希望指出来,我加以改进.         throw:( ...

  2. Java Map遍历方式的选择

    [原文] 1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keyS ...

  3. java ObjectOutputStream

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  4. 处理PHP字符串的10个简单方法;mysql出现乱码:character_set_server=utf8

    PHP处理字符串的能力非常强大,方法也是多种多样,但有的时候你需要选择一种最简单且理想的解决方法.文章列举了10个PHP中常见的字符串处理案例,并提供了相对应的最理想的处理方法. 1.确定一个字符串的 ...

  5. iOS简单排序--字母排序、NSDictionary排序

    // 数组用系统方法compare做字母的简单排序 NSArray *oldArray = @[@"bac",@"bzd",@"azc",@ ...

  6. VS下如何调试多线程

    四步即可 1.打开多线程窗口,找到当前线程 此时,出现窗口如下: 2.右击任意位置,选中全部线程 3.停止全部线程 此时,线程状态如下: 4.单独启动当前线程:先单击当前线程,在点击启动按钮,如下红色 ...

  7. Qt StyleSheet皮肤(黑色,比较好看,而且很全)

    使用方式如下 //设置皮肤样式 static void SetStyle(const QString &styleName) { QFile file(QString(":/imag ...

  8. angularJS推荐显示注入写法

    使用js压缩工具时发现压缩之后的控制器注入参数由原来的$scope变成了a,b...这样的字母而导致js失效,那么我们推荐使用完整的显示注入方式来解决此问题! //隐式注入的写法 angular.mo ...

  9. 常用yum命令

    yum list 查询所有可用软件包 yum search 关键字 查询和关键字相关的包 yum -y install 包名 加上-y自动回答yes yum -y update 包名 升级  yum ...

  10. 使用Areas分离ASP.NET MVC项目

    为什么需要分离? 我们知道MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等.但是在实际 ...