如何管理程序的配置

更新日期: 2015-12-12 阅读次数: 4361 分类: 运维

我的生活经验使我深信,没有缺点的人往往优点也很少。

  • 林肯

错综复杂的配置参数

通常习惯把程序的配置参数独立到一个 setting 的文件。在个人项目及小规模项目中,足矣。

但是接入了正规的研发流程之后,单单一个 setting 文件已经不能够解决问题。

本地开发环境 -> 联调环境 -> 提测环境 -> 预发布环境 -> 生产环境

当每个环境都有独立的数据库,依赖 web 接口时,配置文件就复杂了。

robots

如果继续使用单个 setting 文件

配置文件就变得异常恶心

if env == "dev":
    db = "1.1.1.2"
    ...
elif env == "dev_test":
    db = "1.1.1.3"
    ...
elif env == "test":
    db = "1.1.1.4"
    ...
elif env == "staging":
    db = "1.1.1.5"
    ...
elif env == "production":
    db = "1.1.1.6"
    ...

采用配置文件按环境分离的方式

setting   # 配置文件 - 存储通用的配置
settings  # 配置目录 - 存储环境独立的配置 
  |- dev          # 本地开发环境配置
  |- dev_test     # 开发人员用于联调的环境配置
  |- test         # 测试人员用于专门测试的环境配置
  |- staging      # 预发布环境的配置
  |_ production   # 生产环境配置

使用环境变量存储生产环境的多机集群配置,及互备配置

如果生产环境是多机集群,且多机互备呢? 这是上面方案所不能解决的问题。

例如,生产环境中,A、B、C、D 四台机器中的 A、B 互备,C、D 互备。 那么总不能专门为这四台机器再增加四个独立的配置文件吧,如果以后扩容到 100 台机器呢?

一种简单有效的方式就是把机器独立的配置写到环境变量中。

只对当前 shell 启动的进程生效的话,只需要

export MY_VAR=1

永久保存环境变量, 需要将 export 配置保存到配置文件中

  • ~/.profile 适用于终端及 GUI 进程
  • ~/.bashrc, ~/.bash_profile, ~/.bash_login 适用于终端

使用环境变量可能遇到的坑

  • 如果有其他人的服务,或者自己另一个正在运行的服务,读取了与当前服务相同的环境变量,那么除非他也重启服务以更新环境变量,否则会一直使用旧的环境变量
  • 如果要 sudo -u otheruser 来执行一个服务时,需要加上 -E 参数才能读到已配置的环境变量,参考: How do sudo environment variables work in linux?

成百上千台机器呢?

虽然至今还没接触过这么大的业务规模,但是设想一下手动更新部署一台机器的配置有多么繁琐就知道, 一定是需要一个配置管理中心的服务。

使用数据库管理所有机器的配置信息,配置变更及扩容都可实现自动化。

爱评论不评论

近期节日

2020年06月05日 世界环境日
2020年06月05日 芒种
2020年06月06日 全国爱眼日
2020年06月11日 中国人口日
2020年06月20日 世界难民日
2020年06月21日 父亲节
2020年06月21日 夏至
2020年06月22日 中国儿童慈善活动日
2020年06月23日 国际奥林匹克日
2020年06月25日 全国土地日
2020年06月25日 端午节
2020年06月26日 国际禁毒日
查看更多节日