#pragma once #include #include #include #include #include #include namespace DB { /// Cluster содержит пулы соединений до каждого из узлов /// С локальными узлами соединение не устанавливается, а выполяется запрос напрямую. /// Поэтому храним только количество локальных узлов /// В конфиге кластер включает в себя узлы или class Cluster : private boost::noncopyable { public: Cluster(const Settings & settings, const DataTypeFactory & data_type_factory, const String & cluster_name); /// Построить кластер по именам шардов и реплик, локальные обрабатываются так же как удаленные Cluster(const Settings & settings, const DataTypeFactory & data_type_factory, std::vector< std::vector > names, const String & username, const String & password); /// количество узлов clickhouse сервера, расположенных локально /// к локальным узлам обращаемся напрямую size_t getLocalNodesNum() const { return local_nodes_num; } /// Соединения с удалёнными серверами. ConnectionPools pools; struct ShardInfo { /// contains names of directories for asynchronous write to StorageDistributed std::vector dir_names; int weight; size_t num_local_nodes; }; std::vector shard_info_vec; std::vector slot_to_shard; /// используеться для выставления ограничения на размер таймаута static Poco::Timespan saturate(const Poco::Timespan & v, const Poco::Timespan & limit); struct Address { /** В конфиге адреса либо находятся в узлах : * * example01-01-1 * 9000 * * * ... * либо в узлах , и внутри - * * * example01-01-1 * 9000 * * * */ Poco::Net::SocketAddress host_port; String user; String password; Address(const String & config_prefix); Address(const String & host_port_, const String & user_, const String & password_); }; private: static 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 { typedef std::map Impl; Impl impl; Clusters(const Settings & settings, const DataTypeFactory & data_type_factory, const String & config_name = "remote_servers"); }; }