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. 【转】NGUI创建UIRoot后报NullReferenceException的解决办法

    本文参考自 http://forum.china.unity3d.com/thread-1099-1-1.html 使用NGUI版本3.7.5. 在创建了一个UIRoot后,有时会报NullRefer ...

  2. CentOS 6.5 源码安装MySQL5.6.26

    1:下载安装cmake (mysql5.5以后是通过cmake来编译的) 2:创建mysql的安装目录及数据库存放目录 #mkdir /usr/mysql                 //安装my ...

  3. OAuth的机制原理讲解及开发流程

    本想前段时间就把自己通过QQ OAuth1.0.OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oaut ...

  4. 更新Delphi中SVN客户端版本的方法

    Delphi从XE以后集成里SVN客户端, 安装完Delphi以后, 在bin\subversion下, 存放的就是SVN客户端文件, 可惜版本有点低(好像是1.7的) 如果想更新成高版本的客户端文件 ...

  5. FTS抓包看蓝牙验证的过程

    1.概述    在进行蓝牙设备的连接时,为了保护个人隐私和数据保密的需要,需要进行验证.   2.一些Frame Frame74:本地发送Authentication requset command ...

  6. php练习:给指定商品添加特殊效果

    老板说: 我只要在文本框填1|3 ,那第1和第3个商品都要标注! 思考过程: 有了重要信息1和3,而循环商品时$key按顺序自动递增,那么只要key和信息匹配的话,就判断商品添加标注,这个可以把位置信 ...

  7. 默认的app.js

    我们通过npm start 默认入口是app.js,如果想默认入口改为main.js,可以修改项目下的/bin/www文件把app修改main var app = require('../app');

  8. [LeetCode] Combinations (bfs bad、dfs 递归 accept)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  9. [LeetCode]题解(python):088 Merge Sorted Array

    题目来源 https://leetcode.com/problems/merge-sorted-array/ Given two sorted integer arrays nums1 and num ...

  10. office-002-onenote、word、outlook取消首字母大小写图文详解

    此文主要讲述如何取消微软办公软件 onenote.work.outlook 中首字母大写等的自动更正项,其他 office 办公软件相关设置的操作,可参考此文进行相应的设置.希望能对亲有所帮助,若有错 ...