ClickHouse源码简析

本文详细介绍了ClickHouse的源码流程,从main函数开始,阐述了服务启动、HTTP和TCP接口、内部HTTP接口以及复制接口的实现。深入到server.cpp中的main函数,分析了TCPHandler如何处理客户端连接,特别是TCPHandler::runImpl()中的数据接收和查询执行过程。接着,关注executeQuery()和executeQueryImpl()在查询、插入、ALTER和MERGE操作中的核心逻辑,如数据写入、查询执行、表结构变更和数据合并。

ClickHouse源码流程

入口 main函数在dbms/programs/main.cpp

int main(int argc_, char ** argv_)

{

/// Print a basic help if nothing was matched

MainFunc main_func = printHelp;//这里凭据启动时传入的参数来确定后面执行哪个func,对于server来说,对应的函数为mainEntryClickHouseServer

for (auto & application : clickhouse_applications)

{

if (isClickhouseApp(application.first, argv))

{

main_func = application.second;

break;

}

}

return main_func(static_cast(argv.size()), argv.data());//对于server,这里挪用mainEntryClickHouseServer后,转到dbms/programs/server/server.cpp

}

dbms/programs/server/server.cpp中,提供三类接口,根据源码的形貌,说明如下:

/** Server provides three interfaces:

* 1. HTTP – simple interface for any applications.

适用于任何应用程序的HTTP接口。

* 2. TCP – interface for native clickhouse-client and for server to server internal communications.

用于内陆client和server之间通讯的TCP接口。

* More rich and efficient, but less compatible

厚实高效,但兼容性欠好

* – data is transferred by columns;

数据按列传输

* – data is transferred compressed;

数据压缩后传输

* Allows to get more information in response.

允许在响应新闻中获取更多信息

* 3. Interserver HTTP – for replication.

用于复制的内部HTTP。

*/

dbms/programs/server/server.cpp中的main函数会剖析参数设置,初始化server,启动服务监听端口。

int mainEntryClickHouseServer(int argc, char ** argv)

{

DB::Server app;

try

{

return app.run(argc, argv);//这里挪用run。

}

catch (…)

{

std::cerr << DB::getCurrentExceptionMessage(true) << “\n”;

auto code = DB::getCurrentExceptionCode();

return code ? code : 1;

}

}

clickhouse使用poco这个网络库来处置网络请求,每个client毗邻的处置逻辑在dbms/programs/server//TCPHandler.cpp的run()方式中。

void TCPHandler::run()

{

try

{

runImpl();//这里挪用 runImpl函数。

LOG_INFO(log, “Done processing connection.”);

}

catch (Poco::Exception & e)

{

/// Timeout – not an erro

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值