问题是,如何更新一个常量?这听起来像是一个愚蠢的问题,但让我们看看我的问题的背景:
背景
我管理一个服务器网络,其中包括一个 MySQL 服务器、多个 HTTP 服务器和一个 Minecraft 服务器(安装了 Minecraft 的玩家可以连接到并一起玩的自托管服务器)。所有的用户端服务(HTTP服务器、Minecraft服务器、用户应用程序)都直接或间接与MySQL服务器相关。 MySQL数据库为每个玩家账户存储不同的数据,例如玩家的在线/离线状态等。
在编程中,常量用于创建对在运行时不会改变的值的一般引用。特别是对于软件内部标识符,例如数据标志、位掩码等。就我而言,我还使用常量来存储特定数据,例如 MySQL 服务器的地址和其他凭据。所以当我想改变服务器地址时,我只需要从一点修改它们,例如服务器内部的一个constants.php
。
问题
- 当我将 MySQL 数据库迁移到另一台主机或更改密码时,我必须更新每台服务器上的详细信息。不可能创建一个提供服务器地址的中心化数据提供者,因为MySQL服务器本身就是中心化数据提供者。这意味着,每次更改该值时,我都必须更新所有服务器。我还必须维护一个非常私密和本地的所有这些地方的列表(可能必须写在备忘录上并将其粘贴在我的计算机上!),因为很难找到所有这些引用资料。所以,我的问题是,是否有更好的管理方式可以让我从一个地方改变值(value)观?请注意,服务器位于不同的主机上,因此不可能将其放入本地文件中,并且创建一个集中式数据提供程序(称为密码提供程序)来提供数据听起来并不合理也可以访问真正的集中式数据提供商(MySQL),因为如果我需要更改 MySQL 数据库详细信息,我也同样需要更改密码提供商详细信息。
- 这不是一个问题。但由于这是一个类似的问题,我也将其放在这里。我使用整数位掩码来存储玩家排名。例如,如果玩家是 VIP,则他有一个
0x01
标志,如果玩家是主持人,他有一个0x10
标志,以及0x11
如果同时是 VIP 和版主,反之亦然。我也想重构位掩码值,但这会很麻烦,因为我需要关闭所有服务器并更新MySQL值,更新每台服务器上的常量,然后重新启动所有服务器,以避免期间潜在的安全漏洞的更新。有更方便的方法吗?
这也是一个网络管理问题,但我认为它更多地与编程相关。
最佳答案
我们正在谈论部署系统。例如我们可以使用 卡皮斯特拉诺:https://github.com/capistrano/capistrano 。我们需要 将constants.php保存到git并在capistrano中创建任务以进行部署 将此文件发送到每个服务器。我使用此工具来部署项目,这些项目是俄罗斯互联网部分最繁忙的 50 个站点之一:)
我们正在谈论数据迁移。所以有几种方法。其中有些会停机,有些则不会(有时取决于具体情况)。
无需停机即可进行数据迁移:
- 修改您的应用程序,使其能够理解旧版本的玩家位掩码 和新的
- 部署修改后的应用
- 将位掩码更新到您的数据库
- 修改您的应用,使其仅理解新的位掩码变体
- 部署修改后的应用
关于mysql - 多个服务器上的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666263/