企业级Elasticsearch集群架构方案
Posted 我的紫霞辣辣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了企业级Elasticsearch集群架构方案相关的知识,希望对你有一定的参考价值。
什么是ELK
通俗来讲, ELK是由Elasticsearch、 Logstash、Kibana三个开源软件的组成的一个组合体,ELK是elastic公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功,ELK又称为ELK stack,官方域名为elastic.co, ELK stack的主要优点有如下几个:
- 处理方式灵活: elasticsearch是实时全文索引,具有强大的搜索功能
- 配置相对简单: elasticsearch的API全部使用JSON接口, logstash使用模块配置,kibana的配置文件部分更简单。
- 检索性能高效: 基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
- 集群线性扩展: elasticsearch和logstash都可以灵活线性扩展
- 前端操作绚丽: kibana的前端设计比较绚丽,而且操作简单
什么是Elasticsearch
Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎
,它可实现数据的实时全文搜索搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。
Elasticsearch使用Java语言开发,是建立在全文搜索引擎Apache Lucene基础之上的搜索引擎。
Elasticsearch的特点
实时搜索、实时分析
分布式架构、实时文件存储
文档导向,所有对象都是文档
高可用,易扩展,支持集群,分片与复制
接口友好,支持json
什么是Logstash
Logstash是一个具有实时传输能力的数据收集引擎
,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通log、自定义json格式的日志解析,最终把经过处理的日志发送给elasticsearch。
什么是kibana
Kibana为elasticsearch提供一个查看数据的web界面
,其主要是通过elasticsearch的API接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。
为什么使用ELK
ELK组件在海量日志系统的运维中,可用于解决以下主要问题:
- 分布式日志数据统一收集,实现集中式查询和管理
- 故障排查
- 安全信息和事件管理
- 报表功能
ELK的好处:
ELK组件在大数据运维系统中,主要可解决的问题如下
- 日志查询,问题排查,故障恢复,故障自愈
- 应用日志分析,错误报警
- 性能分析,用户行为分析
ELK使用场景
部署Elasticsearch集群
基础环境
主机名 | ip |
---|---|
es-node01 | 192.168.15.25 |
es-node02 | 192.168.15.26 |
es-node03 | 192.168.15.27 |
logstash-to-es01 | 192.168.15.28 |
logstash-to-redis01 | 192.168.15.29 |
redis01 | 192.168.15.30 |
注意:elasticsearch、kibana、logstash三个工具存在版本兼容性问题,生产环境尽量使用同一个版本的工具!!!
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.1-x86_64.rpm
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.15.1-x86_64.rpm
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.15.1-x86_64.rpm
环境初始化
三台es主机配置一样
# 配置基础环境
vim /etc/security/limits.conf
...
elasticsearch soft core unlimited
elasticsearch hard core unlimited
elasticsearch soft nproc 1000000
elasticsearch hard nproc 1000000
elasticsearch soft nofile 1000000
elasticsearch hard nofile 1000000
elasticsearch soft memlock 32000
elasticsearch hard memlock 32000
elasticsearch soft msgqueue 8192000
elasticsearch hard msgqueue 8192000
# 关机
poweroff
# 磁盘格式化
mkfs.xfs /dev/sdb
mkdir -p /data/esdata
# 挂载磁盘
echo "/dev/sdb /data/esdata xfs defaults 0 0" >> /etc/fstab
mount -a
df -h
...
# /dev/sdb 100G 33M 100G 1% /data/esdata
# 各服务器配置域名解析
vim /etc/hosts
...
es-node01 192.168.15.25
es-node02 192.168.15.26
es-node03 192.168.15.27
logstash-to-es01 192.168.15.28
logstash-to-redis01 192.168.15.29
redis01 192.168.15.30
安装elasticsearch集群
三台es主机只有node.name名称不一样,其他配置都一样
# elasticsearsh的7版本及以上版本安装包默认配置了JDK环境,直接下载即可
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.1-x86_64.rpm
yum -y install elasticsearch-7.15.1-x86_64.rpm
# 修改elasticsearch主配置文件
vim /etc/elasticsearch/elasticsearch.yml
cluster.name: ES-nana # 集群名称,名称相同即属于同一个集群
node.name: es-node01 # 当前节点在集群中的node名称,名称不能重复
path.data: /data/esdata/data # 后端服务器存放的日志数据的路径
path.logs: /data/esdata/logs # es本身的服务日志,启动日志等等
# bootstrap.memory_lock: true # 服务启动的时候锁定足够的内存,防止数据写入swap分区
network.host: 0.0.0.0 # 监听客户端的ip
http.port: 9200 # 监听客户端的端口
discovery.seed_hosts: ["172.16.1.25","172.16.1.26","172.16.1.27"] # 集群在node节点发现列表
cluster.initial_master_nodes: ["172.16.1.25","172.16.1.26","172.16.1.27"] # 集群初始化哪些节点可以被选举为master
gateway.recover_after_nodes: 2 # 一个集群中N个节点启动后,才允许进行数据恢复处理,默认是1(生产环境一般设置为node节点的一半以上)
# 设置是否可以通过正则或者_all删除或者关闭索引库,默认true表示必须显式指定索引库名称,生产环境建议设置为true,删除索引库的时候必须指定,否则可能会误删索引库中的索引库。
action.destructive_requires_name: true
# 服务启动的时候锁定的内存大小,官方文档建议最大30G以内。
vim /etc/elasticsearch/jvm.options
## -Xms4g
## -Xmx4g
# 启动es服务
chown -R elasticsearch:elasticsearch /data/esdata/
systemctl restart elasticsearch
systemctl enable elasticsearch
# 如果服务出现报错,可以查看es应用日志
tail -f /data/esdata/logs/ES-nana.log
监控elasticsearch集群状态
elasticsearch插件之head,图形界面管理ES节点
安装docker
# 安装docker,使用阿里云镜像站进行安装
vim docker.sh
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# 执行安装脚本
bash docker.sh
# 运行head容器
docker run -d -p 9100:9100 mobz/elasticsearch-head:5
# 需要在ES节点配置好之后才可以被head插件管理
vim /etc/elasticsearch/elasticsearch.yml
...
# head插件
http.cors.enabled: true # 开启支持跨域访问
http.cors.allow-origin: "*" # 指定允许访问范围
systemctl restart elasticsearch
Master与Slave的区别
Master节点:统计node节点状态信息、集群状态信息统计、索引的创建和删除、索引分配的管理、关闭node节点等 Slave节点:从Master同步数据、等待机会成为Master
elasticsearch插件之Cerebro,图形界面管理ES节点
新开源的 elasticsearch 集群web管理程序,cerebrov0.9.4版本 需要 Java 11 或更高版本才能运行。Cerebro代码网址
链接:jdk-11.0.5的JDK环境
提取码:1234
安装java
# 安装java JDK环境
rz -E jdk-11.0.5_linux-x64_bin.tar.gz
tar -xvf jdk-11.0.5_linux-x64_bin.tar.gz -C /usr/local/
vim /etc/profile
...
#set java environment
JAVA_HOME=/usr/local/jdk-11.0.5
CLASSPATH=.:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
source /etc/profile
java -version
# java version "11.0.5" 2019-10-15 LTS
# Java(TM) SE Runtime Environment 18.9 (build 11.0.5+10-LTS)
# Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.5+10-LTS, mixed mode
# 需要在ES节点配置好之后才可以被head插件管理
vim /etc/elasticsearch/elasticsearch.yml
...
# head插件
http.cors.enabled: true # 开启支持跨域访问
http.cors.allow-origin: "*" # 指定允许访问范围
# 安装cerebro软件包
wget https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.tgz
tar -xf cerebro-0.9.4.tgz
vim cerebro-0.9.4/conf/application.conf
hosts = [
host = "http://192.168.15.25:9200"
name = "NANA-ES"
....
]
# 启动cerebro程序
./cerebro-0.9.4/bin/cerebro
elasticsearch集群状态检查
响应信息中最重要的一块就是 status 字段。状态可能是下列三个值之一:
green:所有的主分片和副本分片都已分配。你的集群是 100% 可用的。 yellow:所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。 不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。 red:至少一个主分片(以及它的全部副本)都在缺失中。 这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
结合zabbix监控elasticsearch集群健康状态
访问ES的api接口测试
# 访问ES集群主机的api接口
curl http://192.168.15.25:9200/_cluster/health?pretty=true
"cluster_name" : "ES-nana",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 1,
"active_shards" : 2,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
编写py脚本
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import subprocess
body = ""
false = "false"
# url地址在集群中,如果做了ES集群高可用,理论上应该虚拟ip地址。
obj = subprocess.Popen(("curl -s http://192.168.15.25:9200/_cluster/health?pretty=true"), shell=True,stdout=subprocess.PIPE)
data = obj.stdout.read()
data1 = eval(data)
status = data1.get("status")
if status == "green":
print("50")
else:
print("100")
写好脚本之后,去zabbix直接配置监控项即可
以上是关于企业级Elasticsearch集群架构方案的主要内容,如果未能解决你的问题,请参考以下文章
顶级架构 -PB级数据实时查询,滴滴Elasticsearch多集群架构实践