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依赖这个函数来构建实际使用中生效的配置文件信息,在这其中对配置信息进行一些操作之后才会成为实际使用的配置信息。

posted @   零の守墓人  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示