Patroni 流程整理目录-配置文件
Patroni 流程整理目录-配置文件
1. 配置文件
1.1 读取
配置文件的读取时机是Config
类的创建时机。这个创建有两种情况,如下所述:
-
patroni
读取配置文件则是对Config
类进行初始化的过程,在patroni/__main__.py
文件的main
函数中,调用了process_arguments
函数首先进行了配置文件的解析。如果配置了--validate-config
则会在这个函数中创建Config类,尝试加载并验证配置文件。 -
在
patroni/daemon.py
文件的abstract_main
函数中解析配置文件,创建配置类和运行主程序。
创建Config类时调用的__init__
函数则是将配置文件的内容加载到Config类中。
def __init__(self, configfile: str,
validator: Optional[Callable[[Dict[str, Any]], List[str]]] = default_validator) -> None:
self._modify_version = -1
self._dynamic_configuration = {}
self.__environment_configuration = self._build_environment_configuration()
self._config_file = configfile if configfile and os.path.exists(configfile) else None
if self._config_file:
self._local_configuration = self._load_config_file()
else:
config_env = os.environ.pop(self.PATRONI_CONFIG_VARIABLE, None)
self._local_configuration = config_env and yaml.safe_load(config_env) or self.__environment_configuration
if validator:
errors = validator(self._local_configuration)
if errors:
raise ConfigParseError("\n".join(errors))
self.__effective_configuration = self._build_effective_configuration({}, self._local_configuration)
self._data_dir = self.__effective_configuration.get('postgresql', {}).get('data_dir', "")
self._cache_file = os.path.join(self._data_dir, self.__CACHE_FILENAME)
if validator: # patronictl uses validator=None
self._load_cache() # we don't want to load anything from local cache for ctl
self._validate_failover_tags() # irrelevant for ctl
self._cache_needs_saving = False
在这个函数中首先会尝试加载环境变量中的配置,然后如果传入的配置文件参数存在,如果存在就把该文件的配置加载到Config
类中,并且以环境变量中配置优先合并两个配置,如果不存在,就从环境变量中获取配置文件位置,如果存在就加载入内,否则就使用环境变量中加载的配置。之后如果配置了验证参数,就会对配置进行验证,即上述的第一种情况。之后调用_build_effective_configuration
函数根据加载的配置信息来构建实际生效的配置信息,即对其中一下配置进行过滤或者修改之类,这个函数也在主循环中调用了,用来实时更新配置信息。
下面是Config类初始化的流程图:

1.2 更新
从上述所知,程序启动后的配置信息的更新依赖于主循环的重载配置信息reload_local_configuration
函数。在Patroni
类的run
函数中,如果命令行发起了reload
请求,则会修改_received_sighup
的值为True
,此时就会调用reload_local_configuration
函数重新加载配置一次。
在reload_local_configuration
函数中会先加载配置文件中的配置并合并环境变量中配置,之后比较之前创建Config
合并出来的配置与当前合并出来的配置是否相同,如果不相同就会调用_build_effective_configuration
函数在构建一次实际生效的配置信息,并更新合并出来的配置和当前实际生效的配置信息。
下面是更新配置信息的流程图:

从这两个方面可以得知,_build_effective_configuration
函数是一个比较重要的函数,patroni
依赖这个函数来构建实际使用中生效的配置文件信息,在这其中对配置信息进行一些操作之后才会成为实际使用的配置信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统