ClickHouse/dbms/include/DB/Interpreters/Cluster.h

141 lines
4.5 KiB
C
Raw Normal View History

2014-02-22 18:53:42 +00:00
#pragma once
2013-12-07 16:51:29 +00:00
#include <map>
#include <DB/Interpreters/Settings.h>
#include <DB/Client/ConnectionPool.h>
#include <DB/Client/ConnectionPoolWithFailover.h>
#include <Poco/Net/SocketAddress.h>
namespace DB
{
2015-05-28 21:41:28 +00:00
2013-12-07 16:51:29 +00:00
/// Cluster содержит пулы соединений до каждого из узлов
/// С локальными узлами соединение не устанавливается, а выполяется запрос напрямую.
/// Поэтому храним только количество локальных узлов
/// В конфиге кластер включает в себя узлы <node> или <shard>
class Cluster
2013-12-07 16:51:29 +00:00
{
public:
Cluster(const Settings & settings, const String & cluster_name);
2013-12-07 16:51:29 +00:00
2015-01-13 00:56:43 +00:00
/// Построить кластер по именам шардов и реплик. Локальные обрабатываются так же как удаленные.
Cluster(const Settings & settings, std::vector<std::vector<String>> names,
const String & username, const String & password);
Cluster(const Cluster &) = delete;
Cluster & operator=(const Cluster &) = delete;
2013-12-07 16:51:29 +00:00
2015-04-30 12:43:16 +00:00
/// используеться для выставления ограничения на размер таймаута
static Poco::Timespan saturate(const Poco::Timespan & v, const Poco::Timespan & limit);
public:
2013-12-07 16:51:29 +00:00
struct Address
{
/** В конфиге адреса либо находятся в узлах <node>:
* <node>
* <host>example01-01-1</host>
* <port>9000</port>
* <!-- <user>, <password>, если нужны -->
* </node>
* ...
* либо в узлах <shard>, и внутри - <replica>
* <shard>
* <replica>
* <host>example01-01-1</host>
* <port>9000</port>
* <!-- <user>, <password>, если нужны -->
2013-12-10 09:35:30 +00:00
* </replica>
2013-12-07 16:51:29 +00:00
* </shard>
*/
2015-05-28 21:41:28 +00:00
Poco::Net::SocketAddress resolved_address;
String host_name;
2015-05-28 21:41:28 +00:00
UInt16 port;
2013-12-07 16:51:29 +00:00
String user;
String password;
2015-04-30 12:43:16 +00:00
UInt32 replica_num;
2013-12-07 16:51:29 +00:00
Address(const String & config_prefix);
Address(const String & host_port_, const String & user_, const String & password_);
2013-12-07 16:51:29 +00:00
};
using Addresses = std::vector<Address>;
using AddressesWithFailover = std::vector<Addresses>;
struct ShardInfo
{
public:
bool isLocal() const { return !local_addresses.empty(); }
bool hasRemoteConnections() const { return !pool.isNull(); }
size_t getLocalNodeCount() const { return local_addresses.size(); }
public:
/// contains names of directories for asynchronous write to StorageDistributed
std::vector<std::string> dir_names;
UInt32 shard_num;
int weight;
Addresses local_addresses;
mutable ConnectionPoolPtr pool;
};
using ShardsInfo = std::vector<ShardInfo>;
2013-12-07 16:51:29 +00:00
2015-04-30 12:43:16 +00:00
public:
2016-03-01 17:47:53 +00:00
String getName() const { return name; }
const ShardsInfo & getShardsInfo() const { return shards_info; }
const Addresses & getShardsAddresses() const { return addresses; }
const AddressesWithFailover & getShardsWithFailoverAddresses() const { return addresses_with_failover; }
2013-12-07 16:51:29 +00:00
const ShardInfo * getAnyRemoteShardInfo() const { return any_remote_shard_info; }
/// Количество удалённых шардов.
size_t getRemoteShardCount() const { return remote_shard_count; }
2013-12-07 16:51:29 +00:00
/// Количество узлов clickhouse сервера, расположенных локально
/// к локальным узлам обращаемся напрямую.
size_t getLocalShardCount() const { return local_shard_count; }
public:
std::vector<size_t> slot_to_shard;
2015-04-30 12:43:16 +00:00
private:
void initMisc();
/// Create a unique name based on the list of addresses and ports.
/// We need it in order to be able to perform resharding requests
/// on tables that have the distributed engine.
void assignName();
private:
/// Название кластера.
2016-03-01 17:47:53 +00:00
String name;
/// Описание шардов кластера.
ShardsInfo shards_info;
/// Любой удалённый шард.
ShardInfo * any_remote_shard_info = nullptr;
/// Массив шардов. Каждый шард - адреса одного сервера.
2013-12-07 16:51:29 +00:00
Addresses addresses;
/// Массив шардов. Для каждого шарда - массив адресов реплик (серверов, считающихся идентичными).
2013-12-07 16:51:29 +00:00
AddressesWithFailover addresses_with_failover;
size_t remote_shard_count = 0;
size_t local_shard_count = 0;
2013-12-07 16:51:29 +00:00
};
2016-03-04 02:40:48 +00:00
2016-03-01 17:47:53 +00:00
class Clusters
2013-12-07 16:51:29 +00:00
{
2016-03-01 17:47:53 +00:00
public:
Clusters(const Settings & settings, const String & config_name = "remote_servers");
2016-03-01 17:47:53 +00:00
Clusters(const Clusters &) = delete;
Clusters & operator=(const Clusters &) = delete;
public:
using Impl = std::map<String, Cluster>;
public:
Impl impl;
2013-12-07 16:51:29 +00:00
};
2013-12-07 16:51:29 +00:00
}