Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何限制客户修改对生产系统的影响_Postgresql_Open Source_Production Environment_Resource Management - Fatal编程技术网

Postgresql 如何限制客户修改对生产系统的影响

Postgresql 如何限制客户修改对生产系统的影响,postgresql,open-source,production-environment,resource-management,Postgresql,Open Source,Production Environment,Resource Management,我们的商店已经为十几个客户端安装开发了一些WEB/SMS/DB解决方案。这些应用程序有一些实时性能要求,并且足以正常运行。问题在于,客户机(生产服务器的所有者)使用相同的服务器/数据库进行定制,这会导致我们创建和部署的应用程序的性能出现问题 客户定制的几个示例: 为转换为查询中其他数据类型的列添加包含许多文本数据类型的大型表 没有主键、索引或FK约束 在脚本的循环中使用id=x的表中的count(*)的外部脚本,以确定以后如何在同一脚本中构造更多查询。(计划员不能优化批量操作,也不能一次完成所

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

客户定制的几个示例:

  • 为转换为查询中其他数据类型的列添加包含许多文本数据类型的大型表
  • 没有主键、索引或FK约束
  • 在脚本的循环中使用id=x的表中的
    count(*)的外部脚本,以确定以后如何在同一脚本中构造更多查询。(计划员不能优化批量操作,也不能一次完成所有操作)
  • 服务器上的所有新代码文件都由root创建/拥有,具有0777权限
客户不善于接受建议/批评。如果我们自己继续尝试移植/更改脚本,旧代码可能会回来,破坏我们所做的任何更改!或者,在对他们的用例了解有限的情况下,我们在尝试优化他们的更改时破坏了功能

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


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

这个问题是在第一个客户端被授予对第一台计算机的完全访问权大约两分钟后开始的,此后一直没有消失。任何时候,只要有人的首要任务是迅速完成面向业务的工作,他们就会草率行事,把每个人的事情都搞砸。这就是工作原理,因为正确的设计和实现比廉价的黑客更难。你不可能解决这个问题,你所能做的只是想办法让客户更容易与你合作,而不是与你作对。如果你做得对,它将看起来像是极好的服务,而不是唠叨

首先,数据库方面。现在有了一种在PostgreSQL中控制查询资源的方法。主要的困难是像“nice”这样的工具控制CPU的使用,但是如果数据库不适合RAM,很可能是I/O的使用导致了你的死亡。请参见此处总结的问题

现在,如果事实上客户机消耗的是CPU,那么可以使用两种技术来改善这种情况:

  • 安装一个更改进程优先级(,)的C函数,并确保无论何时运行它都会首先被调用(可能会将其放入psql配置文件中,还有其他方法)
  • 编写一个脚本,查找由其用户ID生成的postmaster进程,并对其进行renice,使其经常在cron中运行或作为守护进程运行
听起来您的问题不是他们正在运行的特定查询进程,而是他们正在对更大的结构进行的其他修改。只有一种方法可以解决这个问题:你必须像对待入侵者一样对待客户机,并使用计算机安全领域这一部分的方法来检测他们什么时候把事情搞砸了。认真地在服务器上安装一个入侵检测系统,比如Tripwire(有更好的工具,这只是一个经典的例子),当他们触碰任何东西时,它会提醒你。新档案是0777吗?应该直接跳出正确的IDS报告

在数据库方面,您不能直接检测到数据库被有效地修改。您应该每天将模式的pg_转储到一个文件中(pg_dumpall-g和pg_dump-s),然后将其与上一个交付的模式进行比较,并在模式发生更改时再次提醒您。如果您处理得很好,与客户机的联系就会变成“我们注意到您在服务器上发生了更改……您试图用它实现什么?”这让你看起来像是真的在关注他们。这可能会变成一个销售机会,他们可能会停止摆弄东西,因为他们知道你会马上抓住它

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

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