#include #include #include #include #pragma once #include #include namespace DB { /// Cluster содержит пулы соединений до каждого из узлов /// С локальными узлами соединение не устанавливается, а выполяется запрос напрямую. /// Поэтому храним только количество локальных узлов /// В конфиге кластер включает в себя узлы или class Cluster { public: Cluster(const Settings & settings, const DataTypeFactory & data_type_factory, const std::string & cluster_name); /// количество узлов clickhouse сервера, расположенных локально /// к локальным узлам обращаемся напрямую size_t getLocalNodesNum() const { return local_nodes_num; } /// Соединения с удалёнными серверами. ConnectionPools pools; /// используеться для выставления ограничения на размер таймаута static Poco::Timespan saturation(const Poco::Timespan & v, const Poco::Timespan & limit); private: struct Address { /** В конфиге адреса либо находятся в узлах : * * example01-01-1 * 9000 * * * ... * либо в узлах , и внутри - * * * example01-01-1 * 9000 * * * */ Poco::Net::SocketAddress host_port; String user; String password; Address(const std::string & config_prefix); Address(const Poco::Net::SocketAddress & host_port_, const String & user_, const String & password_); }; bool isLocal(const Address & address); /// Массив шардов. Каждый шард - адреса одного сервера. typedef std::vector
Addresses; /// Массив шардов. Для каждого шарда - массив адресов реплик (серверов, считающихся идентичными). typedef std::vector AddressesWithFailover; Addresses addresses; AddressesWithFailover addresses_with_failover; size_t local_nodes_num; }; struct Clusters : public std::map { Clusters(const Settings & settings, const DataTypeFactory & data_type_factory, const std::string & config_name = "remote_servers"); }; }