Elasticsearch是一个实时的分布式搜索分析引擎,其底层构建在Lucene之上。简单的说就是通过扩展Lucene的搜索能力,实现分布式功能。图片来自宝途网ES通常会与另外两个开源组件Logstash(日志收集)和Kibana(仪表盘)一起提供端到端的日志/搜索分析功能,通常简称为ELK。Clickhouse是俄罗斯搜索巨头Yandex开发的面向列的关系数据库。ClickHouse是近两年OLAP领域最火的,并于2016年开源。ES是最流行的大数据日志和搜索解决方案,但近年来其地位受到挑战。许多公司已经开始将他们的日志解决方案从ES迁移到Clickhouse,包括:携程、快手等公司。架构和设计对比ES底层是Lucenc,主要解决搜索的问题。搜索是大数据领域需要解决的一个普遍问题,即如何在海量数据中根据条件找到需要的数据。搜索的核心技术是倒排索引和布隆过滤器。ES通过分布式技术,利用分片和复制机制,直接解决了集群下的搜索性能和高可用问题。ElasticSearch是为分布式设计的,具有很好的可扩展性。在典型的分布式配置中,每个节点(node)都可以配置为不同的角色。如上图所示:ClientNode,负责API和数据访问的节点,不存储/处理数据。DataNode,负责数据的存储和索引。MasterNode,管理节点,负责Cluster中节点的协调,不存储数据。ClickHouse是一个基于MPP架构的分布式ROLAP(关系型OLAP)分析引擎。每个节点平等负责,负责部分数据处理(不共享任何东西)。ClickHouse是一个真正的列式数据库管理系统(DBMS)。在ClickHouse中,数据始终按列存储,包括用于执行过程的向量(向量块或列)。使查询更快最简单有效的方法是减少数据扫描范围和数据传输的大小,而列式存储和数据压缩可以帮助实现以上两点。Clickhouse还利用日志合并树、稀疏索引和CPU功能(如SIMD单指令多数据),充分发挥硬件优势,实现高效计算。Clickhouse使用Zookeeper来协调分布式节点。为了支持搜索,Clickhouse还支持布隆过滤器。查询对比实战为了比较ES和Clickhouse在基本查询能力上的区别,写了一些代码来验证:https://github.com/gangtao/esvsch本次测试的架构如下:架构主要由四部分组成:①ES栈ES栈由一个单节点Elastic容器和一个Kibana容器组成。Elastic是测试的目标之一,Kibana作为验证和辅助工具。部署代码如下:version:'3.7'services:elasticsearch:image:docker.elastic.co/elasticsearch/elasticsearch:7.4.0container_name:elasticsearchenvironment:-xpack.security.enabled=false-discovery.type=single-nodeulimits:memlock:soft:-1hard:-1nofile:soft:65536hard:65536cap_add:-IPC_LOCKvolumes:-elasticsearch-data:/usr/share/elasticsearch/dataports:-9200:9200-9300:9300deploy:resources:limits:cpus:'4'内存:4096Mreservations:内存:4096Mkibana:container_name:kibanaimage:docker.elastic.co/kibana/kibana:7.4.0environment:-ELASTICSEARCH_HOSTS=http://elasticsearch:9200ports:-5601:5601depends_on:-elasticsearchvolumes:elasticver:data:drilocal②ClickhousestackClickhousestack有一个单节点的Clickhouse服务容器和一个TabixUI作为Clickhouse的客户端。部署代码如下:version:"3.7"services:clickhouse:container_name:clickhouseimage:yandex/clickhouse-servervolumes:-./data/config:/var/lib/clickhouseports:-"8123:8123"-"9000:9000"-"9009:9009"-"9004:9004"ulimits:nproc:65535nofile:soft:262144hard:262144healthcheck:test:["CMD","wget","--spider","-q","localhost:8123/ping"]间隔:30stimeout:5sretries:3deploy:resources:limits:cpus:'4'memory:4096Mreservations:memory:4096Mtabixui:container_name:tabixuiimage:spoonest/clickhouse-tabix-web-clientenvironment:-CH_NAME=dev-CH_HOST=127.0.0.1:8123-CH_LOGIN=defaultports:-"18080:80"depends_on:-clickhousedeploy:resources:limits:cpus:'0.1'memory:128Mreservations:memory:128M③数据导入栈数据导入部分使用vector开发vector.dev,这个工具类似于fluentd,都可以实现数据管道式的灵活数据导入。④测试控件堆栈测试控件我使用了Jupyter、ES和Clickhouse的PythonSDK来测试查询。用Dockercompose启动ES和Clickhouse的栈后,我们需要导入数据。我们使用Vector的generator功能生成syslog,同时导入ES和Clickhouse。在此之前,我们需要在Clickhouse上创建表。ES的索引没有固定模式,所以不需要提前创建索引。创建表的代码如下:1);Create创建完表后,我们就可以启动vector,向两个栈中写入数据了。vector的数据流水线的定义如下:[sources.in]type="generator"format="syslog"interval=0.01count=100000[transforms.clone_message]type="add_fields"inputs=["in"]fields.raw="{{message}}"[transforms.parser]#Generaltype="regex_parser"inputs=["clone_message"]field="message"#optional,defaultpatterns=['^<(?P
