ClickHouse/src/Databases/DatabaseReplicated.h

84 lines
2.4 KiB
C++
Raw Normal View History

2020-04-05 12:18:51 +00:00
#pragma once
#include <Databases/DatabaseAtomic.h>
2020-04-05 12:18:51 +00:00
#include <Common/ZooKeeper/ZooKeeper.h>
#include <Core/BackgroundSchedulePool.h>
#include <DataStreams/BlockIO.h>
#include <DataStreams/OneBlockInputStream.h>
#include <Interpreters/Context.h>
2020-04-05 12:18:51 +00:00
2020-06-27 13:39:41 +00:00
2020-04-05 12:18:51 +00:00
namespace DB
{
2020-05-27 15:04:10 +00:00
/** DatabaseReplicated engine
* supports replication of metadata
* via DDL log being written to ZooKeeper
* and executed on all of the replicas
* for a given database.
*
* One Clickhouse server can have multiple
* replicated databases running and updating
* at the same time.
*
* The engine has two parameters ZooKeeper path and
* replica name.
* The same ZooKeeper path corresponds to the same
2020-06-20 15:39:58 +00:00
* database. Replica names MUST be different for all replicas
2020-05-27 15:04:10 +00:00
* of the same database.
*
* Using this engine, creation of Replicated tables
* requires no ZooKeeper path and replica name parameters.
* Table's replica name is the same as database replica name.
2020-06-20 15:39:58 +00:00
* Table's ZooKeeper path is a concatenation of database
2020-05-27 15:04:10 +00:00
* ZooKeeper path, /tables/, and UUID of the table.
2020-04-05 12:18:51 +00:00
*/
class DatabaseReplicated : public DatabaseAtomic
2020-04-05 12:18:51 +00:00
{
public:
DatabaseReplicated(const String & name_, const String & metadata_path_, UUID uuid, const String & zookeeper_path_, const String & replica_name_, Context & context);
2020-06-27 13:39:41 +00:00
2020-06-20 15:39:58 +00:00
void drop(const Context & /*context*/) override;
String getEngineName() const override { return "Replicated"; }
2020-04-05 12:18:51 +00:00
void propose(const ASTPtr & query) override;
2020-04-05 12:18:51 +00:00
BlockIO getFeedback();
String zookeeper_path;
String replica_name;
2020-04-05 12:18:51 +00:00
private:
2020-05-24 17:13:53 +00:00
void createDatabaseZKNodes();
2020-05-11 12:55:17 +00:00
2020-05-24 17:13:53 +00:00
void runBackgroundLogExecutor();
void executeLogName(const String &);
void writeLastExecutedToDiskAndZK();
2020-06-20 15:39:58 +00:00
2020-05-24 17:13:53 +00:00
void loadMetadataFromSnapshot();
2020-06-20 15:39:58 +00:00
void createSnapshot();
2020-10-26 15:12:16 +00:00
void removeOutdatedSnapshotsAndLog();
2020-05-11 12:55:17 +00:00
std::unique_ptr<Context> current_context; // to run executeQuery
2020-06-27 13:39:41 +00:00
std::mutex log_name_mutex;
String log_name_to_exec_with_result;
2020-06-20 15:39:58 +00:00
int snapshot_period;
int feedback_timeout;
2020-05-11 12:55:17 +00:00
String last_executed_log_entry = "";
2020-05-24 17:13:53 +00:00
BackgroundSchedulePool::TaskHolder background_log_executor;
2020-05-11 12:55:17 +00:00
2020-04-05 12:18:51 +00:00
zkutil::ZooKeeperPtr current_zookeeper; /// Use only the methods below.
mutable std::mutex current_zookeeper_mutex; /// To recreate the session in the background thread.
zkutil::ZooKeeperPtr tryGetZooKeeper() const;
zkutil::ZooKeeperPtr getZooKeeper() const;
void setZooKeeper(zkutil::ZooKeeperPtr zookeeper);
};
}