0

我们的商店已经为十几个客户端安装开发了一些 WEB/SMS/DB 解决方案。这些应用程序有一些实时性能要求,并且足以正常运行。问题是客户端(生产服务器的所有者)正在使用相同的服务器/数据库进行自定义,这会导致我们创建和部署的应用程序的性能出现问题。

客户定制的几个例子:

  • 为在查询中转换为其他数据类型的列添加具有许多文本数据类型的大型表
  • 没有主键、索引或 FK 约束
  • 在脚本的循环中使用使用 的外部脚本count(*) from table where id = x来确定稍后如何在同一脚本中构造更多查询。(没有计划者可以优化的批量操作或一次完成所有操作)
  • 服务器上的所有新代码文件均由 root 创建/拥有,具有 0777 权限

客户不接受建议/批评。如果我们继续尝试自己移植/更改脚本,旧代码可能会回来,破坏我们所做的任何更改!或者在对它们的用例了解有限的情况下,我们会在尝试优化它们的更改时破坏功能。

我的问题是:我们如何将资源限制在我们创建和部署的查询/应用程序之外?在这种情况下是否有任何务实的选择?我们以拥有 OSS 解决方案而自豪,但似乎它已成为一种负担。

我们使用在 Linux Distos 上运行的 PG 8.3。客户更喜欢 php,但 shell 脚本、perl、python 和 plpgsql 都以一种或另一种形式在系统上使用。

4

1 回答 1

1

这个问题在第一个客户端被授予对第一台计算机的完全访问权限后大约两分钟开始出现,并且从那以后它就没有消失。每当有人优先考虑快速完成面向业务的工作时,他们都会对此马虎,并为每个人搞砸事情。这就是事情的运作方式,因为正确的设计和实施比廉价的黑客更难。你不会解决这个问题,你所能做的就是弄清楚如何让客户更容易与你合作而不是反对你。如果你做得对,它会看起来像优质的服务而不是唠叨。

首先,数据库方面。现在有一种方法可以控制 PostgreSQL 中的查询资源。主要的困难是像“nice”这样的工具控制 CPU 使用率,但如果数据库不适合 RAM,那么很可能是 I/O 使用率正在扼杀你。请参阅此开发人员消息,在此处总结问题。

现在,如果实际上是客户端正在烧毁的 CPU,您可以使用两种技术来改善这种情况:

  • 安装一个更改进程优先级的 C 函数(示例 1示例 2),并确保每当他们运行某些东西时,它首先被调用(可能将其放入他们的 psql 配置文件中,还有其他方法)。
  • 编写一个脚本,查找由其用户 ID 生成的 postmaster 进程并对其进行修改,使其经常在 cron 中运行或作为守护进程运行。

听起来您的问题不是他们正在运行的特定查询进程,而是他们对更大结构所做的其他修改。只有一种方法可以解决这个问题:您必须像对待入侵者一样对待客户,并使用计算机安全领域的那部分方法来检测他们什么时候搞砸了。严重地!在服务器上安装一个像 Tripwire 这样的入侵检测系统(有更好的工具,这只是典型的例子),当它们接触到任何东西时它会提醒你。新文件是 0777?应该直接跳出正确的 IDS 报告。

在数据库方面,您无法直接检测到正在修改的数据库是否有用。您应该每天将架构的 pg_dump 放入一个文件(pg_dumpall -gpg_dump -s,然后将其与您交付的最后一个文件进行比较,并在更改时再次提醒您。如果您管理得很好,与客户变成“我们注意到你在服务器上发生了变化......你想用它来完成什么?”这让你看起来你真的在关注他们。这可以变成一个销售机会,并且他们可能会停止摆弄东西,就像知道你会立即抓住它一样。

您应该立即开始做的另一件事是在每个客户端上安装尽可能多的版本控制软件。您应该能够登录到每个系统,运行适当的状态/差异工具进行安装,并查看发生了什么变化。也定期将其邮寄给您。同样,如果与将架构作为组件转储到其管理的内容的东西结合使用,效果最好。没有足够多的人对数据库中的代码使用严格的版本控制方法。

这是这里有用的主要技术方法集。剩下的就是一个经典的咨询客户管理问题,它更多的是人的问题,而不是计算机的问题。振作起来,情况可能更糟——如果你给他们 ODBC 访问权限并且他们发现他们可以在 Access 或类似的简单的东西中编写自己的查询,FSM 会帮助你。

于 2009-10-06T05:14:11.350 回答