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