写缩放postgresql

时间:2013-02-28 09:05:00

标签: postgresql scaling postgresql-9.2 hstore

我有一个非常以写为中心的应用程序,它使用postgres hstore。我的典型工作流程为SELECT,后跟一些UPDATEINSERT s(主要是前者)。这通常发生在每秒500个“任务”上。

所以我的单个postgres实例无法应对。我看到postgres服务器是cpu绑定的,postgres进程始终是UPDATE。磁盘I / O看起来很好,我有足够的内存空间(48个中有44GB)。我已经尝试按照postgres's wiki page和pg_tune进行调整,但我只需要更多的性能。

我的表格遵循以下设计:

   Column   |           Type           |                              Modifiers                              | Storage  | Stats target | Description
------------+--------------------------+---------------------------------------------------------------------+----------+--------------+-------------
 id         | integer                  | not null default nextval('table_id_seq'::regclass) | plain    |              |
 created_at | timestamp with time zone | not null                                                            | plain    |              |
 updated_at | timestamp with time zone | not null                                                            | plain    |              |
 context    | hstore                   | default hstore((ARRAY[]::character varying[])::text[])              | extended |              |
 data       | hstore                   | default hstore((ARRAY[]::character varying[])::text[])              | extended |              |

几乎我所有UPDATE的类型都是:

UPDATE <table> updated_at=<date> WHERE id=<id>
在挖掘之后,我发现了两个声称有助于写作性能的项目:

你会推荐我的(相当简单的)工作流程吗?

(是的,我尝试了mongo,但是,我想念SQL的查询原理图)

1 个答案:

答案 0 :(得分:4)

首先,我认为你需要更加具体。性能调优是以事实为中心的,没有很多细节(解释计划等),硬件上的信息等,我们无法告诉你该怎么做。此外,像Postgres-XC这样的东西增加了很多复杂性,尽管它确实有助于提高写入性能。我认为这会对你的情况有所帮助,但你真的想要优化你拥有的东西(并且可能雇用某人为你优化它)。

然而,你的帖子中有一堆警示标志(这是我认为聘请专业人士可能是一个好主意的另一个原因)。不知道更多我不能告诉你Postgres-XC是否是正确的解决方案。我可以告诉你的是,你将有一个陡峭的学习曲线来实现它。

所以我想通过警告标志,因为它们代表了可能的调整点。

  1. i see that the postgres server is cpu bound and the postgres processes are UPDATEing all the time.这很可能是由信号量和共享内存争用过多引起的。您可能会发现,如果减少最大连接数,您将每秒处理更多。连接池可能会有所帮助。

  2. 所有有趣的数据都在扩展存储上。这意味着存储和检索时需要额外的随机磁盘I / O.除非你在表上进行大量的顺序扫描,否则你应该让PostgreSQL决定要播放什么。

  3. 我称你的大多数陈述都是UPDATE <table> updated_at=<date> WHERE id=<id>,因为当你没有更新数据时,很可能没有理由记录更新的行。还有其他东西可能在这里发生。我的猜测是你有很多查询在扩展存储中更新东西。这可能不是一个很大的性能,因为你不受I / O限制,但它确实会产生CPU和磁盘I / O的开销。

  4. 总的来说,Postgres-XC是一个很棒的项目,我会推荐它。然而,它为数据库增加了很多复杂性,如果你可以使你的单个实例工作,你可能会发现从长远来看运行要便宜很多(简单就是金色)。