【问题标题】:Pragmatic way to push configuration changes to servers将配置更改推送到服务器的实用方法
【发布时间】:2013-02-26 13:22:34
【问题描述】:

系统包含一个管理控制台和一个工作服务器集群。应用程序状态存储在数据库中。用户可以从管理控制台添加新作业、监控正在运行的作业等。工作服务器从 db 获取作业并进行处理。

现在,一些配置也存储在数据库中。配置也会加载到每个工作服务器上,并且大部分都被缓存,因为配置不会经常更改。

管理员能够更改配置(从管理控制台)。更改存储在数据库中。将更改推送到工作服务器的最佳方式是什么?

到目前为止我的想法:

  1. 在更新/删除/插入时在配置表上添加触发器并更新某些辅助表中的时间戳。每个工作服务器在访问缓存之前都会检查此辅助表是否有更改。 缺点:仍在访问数据库。

  2. 从管理控制台向所有工作服务器发送请求,配置已更改,下次调用时必须从数据库中读取。 缺点:引入了管理员和服务器之间的 http 通信 - 迄今为止不存在的新层 - 并且它的可靠性值得怀疑。

有这方面的经验吗?

【问题讨论】:

  • 为什么管理控制台无法启动更新?
  • 它安装在单独的计算机实例上,不在工作计算机的集群中。所以基本上想法 #2 是管理控制台启动更新的地方。将澄清我的问题。
  • 使数据库关闭所有连接并告诉服务器在发生这种情况时重新配置。

标签: java database architecture


【解决方案1】:

第一种方法似乎更像是一种快速破解。检查辅助表时间戳几乎无法达到缓存的目的。

第二个选项似乎是一个不错的选择。这可以作为他们任务队列中的一个简单任务来实现,以更新他们自己的配置缓存。

更改多个服务的配置的主要问题是它们的依赖关系。

如果父服务以与其子服务不兼容的配置开始运行,您可能会遇到崩溃或未定义的行为。为避免这种情况,必须实施同步。

一种方法是让父服务更新其配置,然后向子服务发出配置更新命令。更新所有子服务后,父服务将恢复处理。这种方法的优势在于,一个简单的管理控制台可以仅向父服务指示配置更改。

另一种方式是让管理控制台处理依赖服务。它将向父服务发送命令以暂停执行、更新配置并等待恢复命令。同时,它将更新所有儿童服务并指示父母恢复。这种方式服务依赖将更加灵活,并且它们的配置将与其实现分离。这需要更高级的管理工具。

【讨论】:

  • 感谢指出同步问题,我忽略了它。我会再等一会儿,这似乎是我正在寻找的解决方案(同步父->子通知)。恐怕另一种方式(暂停)可能不好,因为它可能很昂贵(从业务角度来看)。
  • @IgorSpasic,如果您并行更新子服务,则暂停应该是几毫秒的问题。除非您正在进行一些实时处理,否则这根本不是问题。如果不等到所有依赖服务都更新,就没有其他方法可以同步。
  • 明白了,只是暂停一个父服务器似乎比暂停工作服务器更便宜,因为它们已经有许多并发工作会话,做一些实时工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多