开篇先提出ES生产环境部署需要考虑五个问题,进而一步步展开阐述ES集群规划、节点类型规划、脑裂问题避免、分片和副本设置推荐设置,最后以一个日志采集生产环境实战例子,应用ES索引生命周期策略、索引模板实现索引的动态管理过程。 ES为了处理大型数据集,实现容错和高可用性,ES可运行多服务器组成分布式环境下也称为集群;集群内的节点的cluster.name相同,形成集群的每个服务器称为节点。ES 为分配不同的任务,定义了以下几个节点角色:Master,Data Node,Coordinating Node,Ingest Node:
主节点(Master Node):主要职责是负责集群层面的相关操作,管理集群变更,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。
# 设置如下,后续所有节点设置可以通过这三个切换配置node.master: truenode.data: falsenode.ingest: false数据节点(Data Node):主要是存储索引数据的节点,执行数据相关操作:CRUD、搜索,聚合操作等。
预处理节点(Ingest Node):预处理操作运行在索引文档之前,即写入数据之前,通过事先定义好的一系列processors(处理器)和pipeline(管道),对数据进行某种转换。
协调节点(Coordinating Node):作为处理客户端请求的节点,只作为接收请求、转发请求到其他节点、汇总各个节点返回数据等功能的节点;客户端请求可以发送到集群的任何节点(每个节点都知道任意文档的位置),节点转发请求并收集数据返回给客户端。
一个节点可以充当一个或多个角色,默认三个角色都有。
所谓脑裂问题,就是同一个集群中的不同节点,对于集群的状态有了不一样的理解,比如集群中存在两个master,正常情况下我们集群中只能有一个master节点。如果因为网络的故障,导致一个集群被划分成了两片,每片都有多个node,以及一个master,那么集群中就出现了两个master了。但是因为master是集群中非常重要的一个角色,主宰了集群状态的维护,以及shard的分配,因此如果有两个master,可能会导致数据异常
分片数指定后不可变,除非重索引,分片对应的存储实体是索引,分片并不是越多越好,分片多浪费存储空间、占用资源、影响性能。
副本数是可以随时调整的,副本的作用是备份数据保证高可用数据不丢失,高并发的时候参与数据查询。
这里我们部署一个3个节点组成的ES集群,因此也不单独分节点类型部署,三台服务器分别为192.168.5.52 es-node-01、192.168.5.53 es-node-02、192.168.12.27 es-node-03,操作系统版本为CentOS 7.8。
官网支持二进制部署,也支持使用Docker和K8S部署方式,这里我们使用二进制部署方式,使用最新版本8.2.3
# 官方下载wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.2.3-linux-x86_64.tar.gz# 三台服务器都准备好安装包,进行解压tar -xvf elasticsearch-8.2.3-linux-x86_64.tar.gz# 进入ES目录,ES安装包已自带的JDK17,无需单独下载安装JDK
在每一台服务器上先做下面环境设置
# 创建es用户useradd es# 授权es用户chown -R es:es elasticsearch-8.2.3vim /etc/security/limits.conf# 直接末尾添加限制es soft nofile 65536es hard nofile 65536echo vm.max_map_count=262144>> /etc/sysctl.confsysctl -psystemctl stop firewalldsystemctl disable firewalldcat > /etc/hosts << EOF192.168.5.52 es-node-01192.168.5.53 es-node-02192.168.12.27 es-node-03EOF先创建logs和data目录;ES的集群名称配置一样es-cluster,三台ES节点的node.name分别为 es-node-01、es-node-02、es-node-03,network.host配置为各自本机的IP地址。修改配置文件信息为如下vi config/elasticsearch.yml
cluster.name: es-clusternode.name: es-node-01node.attr.rack: r1path.data: /home/commons/elasticsearch-8.2.3/datapath.logs: /home/commons/elasticsearch-8.2.3/logsnetwork.host: 192.168.5.52discovery.seed_hosts: ["192.168.5.52", "192.168.5.53", "192.168.12.27"]cluster.initial_master_nodes: ["192.168.5.52", "192.168.5.53","192.168.12.27"]xpack.security.enabled: falsexpack.security.transport.ssl.enabled: falsehttp.cors.enabled: truehttp.cors.allow-origin: "*"http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length# 依次启动三台服务器的ES服务./bin/elasticsearch -d访问3台服务器9200端口,http://192.168.5.52:9200/ ,如果都看到如下信息则代表ES启动成功

再次查看集群的健康状态,http://192.168.5.52:9200/_cat/health

Kibana的版本与ES版本保持一致,也是使用最新的8.2.3。我们在192.168.5.52上部署
# Kibana下载wget https://artifacts.elastic.co/downloads/kibana/kibana-8.2.3-linux-x86_64.tar.gz# 解压文件tar -xvf kibana-8.2.3-linux-x86_64.tar.gz # 授权chown -R es:es kibana-8.2.3# 进入Kibana的目录cd kibana-8.2.3vim config/kibana.yml
# 直接再末尾添加以下配置# 服务器地址server.host: "0.0.0.0"# ES服务IPelasticsearch.hosts: ["http://192.168.5.52:9200/"]# 设置中文i18n.locale: "zh-CN"# 后台启动kibananohup ./bin/kibana > logs/kibana.log 2>&1 &访问Kibana控制台页面,http://192.168.5.52:5601/

默认分词器是不支持中文分词,我们可以安装IK分词器实现中文的分词
# IK分词器在GitHub上,下载最新版本8.2.0wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip# 解压到elasticsearch目录下的plugins/ik目录unzip elasticsearch-analysis-ik-8.2.0.zip -d ./plugins/ik由于ik的版本与ES版本不一致,修改解压目录到ik下的 plugin-descriptor.properties 文件中的
elasticsearch.version=8.2.3
如果版本一致也可以直接在线安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip转化行为(Action)。下面我们看下几个常用的Action:别名控制写入的索引是谁。它可用于Hot阶段。Warm阶段。需要注意的是当shink完成后索引名会由原来的<origin-index-name>变为shrink-<origin-index-name>.Warm阶段。warm, cold阶段。设置索引生命周期策略和索引模板即可以通过Kibana可视化界面设置也可以通过ES提供的Rest API接口进行设置,我们先通过Kibaba页面来配置,首先通过点击左侧菜单的Management-Stack Management,然后左侧菜单再点击索引生命周期策略
点击索引生命周期策略页面的右上角创建策略

这里如果是测试可以将存在时间设置为分钟级别,便于观察,创建完毕后查看刚创建的demo-log-policy

也可以通过ES提供的Rest API接口进行设置,通过Kibana点击左侧菜单的Management-开发工具进入控制台tab页,然后输入如下生命周期设置策略,返回结果

PUT _ilm/policy/demo-log-policy{ "policy": { "phases": { "hot": { "min_age": "0ms", "actions": { "rollover": { "max_size": "200gb", "max_primary_shard_size": "50gb", "max_age": "7d" }, "set_priority": { "priority": 100 } } }, "warm": { "min_age": "15d", "actions": { "set_priority": { "priority": 50 } } }, "cold": { "min_age": "30d", "actions": { "set_priority": { "priority": 0 } } }, "delete": { "min_age": "60d", "actions": { "delete": { "delete_searchable_snapshot": true } } } } }}点击索引管理-索引模板,创建模板

验证模板后提交查看已创建的模板,创建完成后可以通过在索引声明周期绑定模板,也可以直接在模板里增加绑定语句设置

当然也可以通过ES提供的Rest API接口进行设置
PUT _index_template/demo-log-template{ "version": 1, "priority": 10, "template": { "settings": { "index": { "lifecycle": { "name": "demo-log-policy", "rollover_alias": "demo-log" }, "number_of_shards": "2", "number_of_replicas": "1" } }, "mappings": { "_source": { "excludes": [], "includes": [], "enabled": true }, "_routing": { "required": false }, "dynamic": true, "numeric_detection": false, "date_detection": true, "dynamic_date_formats": [ "strict_date_optional_time", "yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z" ], "dynamic_templates": [] } }, "index_patterns": [ "demo-log-*" ], "_meta": { "description": "测试索引模板" }}先创建初始索引
PUT demo-log-000001{ "aliases": { "demo-log": { "is_write_index": true } }}
如果前面索引生命周期模板的各个周期保留时间设置较短如为分钟,手动提交日志到索引和查看,需要实时查看其效果则可以增加如下设置和演示操作
PUT /_cluster/settings{ "transient": { "indices.lifecycle.poll_interval": "10s" }}POST /demo-log/_doc{ "message":"world2"}GET /demo-log/_search{ "query": { "match_all": {} }}修改配置和启动,vi config/logstash.conf
input { beats { port => 5044 }}output { elasticsearch { hosts => ["http://192.168.5.52:9200","http://192.168.5.53:9200","http://192.168.12.27:9200"] index => "%{app_id}" }}FileBeat和Logstash部署和配置可以详细查看前面的文章《数仓选型必列入考虑的OLAP列式数据库ClickHouse(中)》,修改配置和启动, parsers.multiline实现多行合并一行配置,比如Java异常堆栈日志打印合并在一行。
vi filebeat.yml
filebeat.inputs:- type: filestream id: demo-log enabled: true paths: # Filebeat处理文件的绝对路径 - /home/itxs/demo/logs/*.log # 使用 fields 模块添加字段 fields: app_id: demo-log # 将新增的字段放在顶级 fields_under_root: true parsers: - multiline: type: pattern pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' negate: true match: afterprocessors:- drop_fields: fields: ["log","input","agent","ecs"]output.logstash: hosts: ["192.168.12.28:5044"]采集/home/itxs/demo/logs/目录的数据,由App产生日志,然后通过Kibana的数据视图-创建数据视图,匹配我们前面创建的索引和别名

最后通过Kibana左侧菜单的Analytics-Discover选择demo视图然后可以搜索日志,最后日志查询结果如下

**本人博客网站 **IT小神 www.itxiaoshen.com