前言
Elasticsearch(简称ES)是基于Lucene库的分布式架构搜索引擎。它支持水平横向扩展,但是集群节点不能无限增加。因为当集群的meta信息(节点、索引、集群状态)过多时,会使集群更新压力变大,单个可用主节点会成为性能瓶颈,导致整个集群无法正常工作。在早期版本时,为了弥补ES不能无限横向水平扩展的能力,通常会采用多集群的方式,通过部落节点(Tribe Node)实现多集群访问,但是也存在一定的问题,所以现在已经被废弃(Deprecated)了。
随后,ES在5.3及以后的版本中引入了跨集群搜索的功能,可以针对一个或多个远程集群进行单个搜索请求,这也是目前主流的ES跨集群搜索方案。本文主要围绕CCS的基本概念、应用场景以及CCS配置方面进行了简要的梳理。
作者|中电金信云计算实验室 罗艳鹏
一、CCS简单介绍
1. 概念
跨集群搜索(Cross Cluster Search)简称CCS,顾名思义就是可以通过当前ES集群去查询远程ES集群中的数据。它能用来过滤和分析存储在不同数据中心的集群中的数据。
2. 简介
CCS功能允许任何节点在多个集群之间充当联合客户端(Federated Client)。与部落节点(Tribe Node)功能相比,进行CCS的节点将不会加入远程集群,而是以轻量的方式连接到远程集群,以便执行联合搜索(Federated Search)请求。
■ 远程集群(Remote Cluster)
要使用CCS之前需要先了解远程集群(Remote Cluster)。CCS的工作原理是在集群状态中配置一个远程集群,并且仅连接到远程集群中有限数量的节点。每个远程集群中有名称(Name)和种子节点(Seed Nodes)列表以供引用,这些种子节点用于发现远程集群中有资格作为网关节点的节点。
注册远程集群时,会从其中一个种子节点来检查其集群状态,以便在默认情况下选择最多三个有资格的节点作为网关节点(Gateway Nodes), 集群中配置了远程集群的每个节点都连接到一个或多个网关节点,并使用它们将搜索请求发送到远程集群。
如上图所示,当我们的客户端向当前集群发送请求时,它可以搜索自己本身的集群,同时也可以向另外两个集群——远程集群一和远程集群二发送请求。最后的结果由当前ES集群返回给客户端。
二、CCS应用场景
1. 场景一
■ 实际场景
以G市某银行为例,在同城双活的场景下,有一个主机房和一个同城机房,主机房会产生80%的日志,同城机房会产生20%的日志,每个机房都有一套ELK对日志进行分析存储,两个机房共用一个PaaS平台。
■ 场景分析
在该场景下已经明确有两套ES集群和一个管控台,所以现在需要对两套ES集群的数据进行查询汇总,然后在PaaS平台上进行展示分析。由于数据量太大,虽然ES的查询能力很好,但是如果直接把查询到的数据通过日志管理进行汇总排序的话,不仅会增加在PaaS平台的显示耗时,而且也会给日志管理带来很大的内存压力。
■ 解决办法
通过ES的跨集群搜索能力,在主机房配置同城机房的CCS,这样主机房的ES集群就只需要对日志进行查询分析,不用考虑合并日志以及对日志排序的问题,因为这些问题都在主机房的ES集群中处理过了。
2. 场景二
■ 存在场景
假设在原有的系统上经过分析和综合评定以后搭建了5个节点的ES集群,但是随着系统的发展以及数据量的暴增,ES的压力也越来越大,迫切需要对ES进行扩容。
■ 场景分析
随着业务的发展和数据量的增加,需要对ES进行扩容,ES采用分布式架构,支持横向的水平扩容,但由于业务持续发展,数据量也在持续增加,不可能单纯依靠横向增加ES节点的方式进行扩容,因为ES的节点不能无限制的增加,否则会导致整个ES集群不可用。
■ 解决办法
采用多集群的方式,在原有的5节点的ES集群上,根据综合评定再搭建n个节点的另外一套ES集群,随着数据量的增加,可以随之增加ES集群的个数。对于多个ES集群之间的数据查询可以通过配置CCS来实现。
三、CCS装置
可以使用集群设置修改elasticsearch.yml来设置CCS,也可以通过cluster settings API设置CCS,推荐使用API的方式配置CCS(本次以API的方式为例配置CCS)。
假设现在有两个集群Ecas-im,Ecas-re:
现在需要通过Ecas-im集群联合查询Ecas-re集群的数据,CCS配置如下:
注:文中所出现IP地址均为虚假地址,实际操作时可根据实际情况进行IP地址设定。
(部分展示,详情请关注 中电金信 招聘)
验证CCS是否配置成功
(部分展示,详情请关注 中电金信 招聘)
如上图所示,如果看到两个ES集群都提示connected:true,证明CCS配置完成。
四、CCS注意细节
● CCS需要配置es的Transport Port内部通信端口,默认值是9300,如果同一台机器安装多个es节点,注意要修改9300端口,否则端口冲突;
● 两个ES集群之间要保证网络相通;
● 两个ES需要联合查询的数据索引要保持一致,比如Ecas-im集群的索引是ecas-batch,那么Ecas-re集群的索引也应该是ecas-batch,这样才能保证ecas-batch的数据从两个集群下进行联合查询;
● CCS配置时skip_unavailable的值默认是false,推荐改为true(查询的时候跳过不可达的集群)
五、CCS使用
假设Ecas-im集群和Ecas-re集群都有一个索引为ecas-batch,在联合查询的时候可以执行下面的api来联合查询调用链id相关的日志信息。
(部分展示,详情请关注 中电金信 招聘)
如果在查询时把索引改成*:ecas-batch就代表查询所有集群的数据,因为现在就两个集群ecas-im:ecas-batch,ecas-re:ecas-batch和*:ecas-batch查询的结果是一样的,所以上述查询api可以按照下面的方式进行查询。
(部分展示,详情请关注 中电金信 招聘)
写在文末
在金融行业,多数银行在进行应用部署时出于可靠性和安全性考虑,一般都会采用两地三中心或者三地五中心的方式进行部署规划,所以应用可能会在多个地方存活,并输出相应日志。
这些日志数据一般会输出到其所在的数据中心,通过局域网进行内处理,不会跨远程网络,因此一般针对跨数据中心、不在同一个业务域或集群服务内的应用日志输出就会被映射到各自所在的区域。
这个时候ES集群就会出现多个,且每个集群都是一整套管理机制,会对运维管理造成很大的麻烦,也会形成日志数据孤岛,本文主要是针对此类问题分享了一些解决办法和思路,谨供大家参考。