云计算企业级小架构部署应用综合练习-二- Ansible 部署 Elastic Stack(ELK)
一、Elastic Stack 项目介绍
⚠️警告
1 这不是零基础的教程,需要掌握 Ansible 和 ELK 各个组件的使用
2 这个只是提供了一套自动化部署 ELK 系统的解决方案
3作为练习之用,也可以经过自己修改之后用于生产环境
4 讨论的话私信我或者评论区留言
1 项目使用的服务器情况
项目采用购买的阿里云抢占式服务器 5 台
主机名 | 功能 |
---|---|
es01 | 部署 elasticsearch 节点 ea1 |
es02 | 部署 elasticsearch 节点 ea2 |
es03 | 部署 elasticsearch 节点 ea3 |
logstash01 | 部署 logstash 节点 |
kibana01 | 部署 kibana 节点 |
美国(硅谷)
2 vcpu, 4G 内存, 2 M 带宽
每小时大约 1 元
注意设置自动释放时间,防止忘了释放导致一直扣费!
下方图片中是 7 台,这里只用到 5 台
2 架构图
3 整个 Elastic Stack 使用到的二进制包官方链接
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gzhttps://artifacts.elastic.co/downloads/kibana/kibana-7.10.2-linux-x86_64.tar.gzhttps://artifacts.elastic.co/downloads/logstash/logstash-7.11.1-linux-x86_64.tar.gzhttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.2-linux-x86_64.tar.gz
4 整个 Elastic Stack 项目的目录结构
elk-play/elk/
├── deploy-elasticsearch.yml
├── deploy-kibana.yml
├── deploy-logstash.yml
├── ela
│ ├── elasticsearch.j2
│ ├── jvm.options
│ ├── limits.conf
│ └── sysctl.conf
├── elk-pkg
│ ├── elasticsearch-7.10.0-linux-x86_64.tar.gz
│ ├── kibana-7.10.0-linux-x86_64.tar.gz
│ └── logstash-7.10.0-linux-x86_64.tar.gz
├── elk-vars.yml
├── kibana
│ ├── kibana.service.j2
│ └── kibana.yml
└── logstash├── logstash.conf├── logstash.service.j2└── logstash.yml4 directories, 17 files
5 整个 Elastic Stack 项目共用的变量文件内容
elk-play/elk/elk-vars.yml
[root@ansible ~]# cat elk-play/elk/elk-vars.yml
# elasticsearch 用户
ela_user: ela# 程序的二进制包名称
ela: elk-pkg/elasticsearch-7.10.0-linux-x86_64.tar.gz
logstash: elk-pkg/logstash-7.10.0-linux-x86_64.tar.gz
kibana: elk-pkg/kibana-7.10.0-linux-x86_64.tar.gz
6 整个 Elastic Stack 项目用的主机名解析文件
/etc/hosts
ip 根据自己的实际情况修改
192.168.122.6 es01
192.168.122.106 es02
192.168.122.218 es03
192.168.122.166 logstash01
192.168.122.131 kibana01
7 整个 Elastic Stack 项目用的资产清单文件
elk-play/hosts.ini
[es]
es01 node_name=ela1
es02 node_name=ela2
es03 node_name=ela3[es:vars]
es_nodes=["ela1", "ela2", "ela3"][kibana]
kibana01[logstash]
logstash01
8 整个 Elastic Stack 项目用的发送公钥的 playbook
elk-play/send-pubkey.yml
---
- name: 传输本地的 hosts 主机名解析文件hosts: es,logstash,kibanagather_facts: notasks:- name: 传输 /etc/hosts 文件copy:src: /etc/hostsdest: /etc/hosts
...
9 整个 Elastic Stack 项目用的发送主机解析文件的 playbook
elk-play/send-etc-hosts.yml
---
- hosts: es,logstash,kibanagather_facts: noremote_user: rootvars:ansible_ssh_pass: upsatasks:- name: Set authorized key taken from fileauthorized_key:user: rootstate: presentkey: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
...
二、部署 Elasticsearch 集群
1 目录结构
[root@vm1 playbook]# tree elk
elk
├── deploy-elasticsearch.yml
├── ela
│ ├── elasticsearch.j2
│ ├── jvm.options
│ ├── limits.conf
│ └── sysctl.conf
├── elk-pkg
│ ├── elasticsearch-7.10.0-linux-x86_64.tar.gz
│ ├── kibana-7.10.0-linux-x86_64.tar.gz
│ └── logstash-7.10.0-linux-x86_64.tar.gz
└── elk-vars.yml
2 说明:
1 elasticsearch 默认不允许使用 root 用户启动,因此这里需要创建普通用户: ela
2 使用系统自带的 systemd 程序管理 elasticsearch 进程
3 elk/deploy-elasticsearch.yml
---
- name: 部署 elasticsearch 集群hosts: esgather_facts: noremote_user: rootvars_files:- elastic-vars.ymltasks:- name: 创建用户user:name: "{{ ela_user }}"tags: deploy- name: 传输本地软件包到远程主机并且解压到指定目录ansible.builtin.unarchive:src: "{{ ela }}"dest: /usr/local/owner: "{{ ela_user }}"group: "{{ ela_user }}"list_files: yesregister: rettags: deploy- name: 创建软链接ansible.builtin.file:src: /usr/local/{{ ret.files.0 | regex_replace('/.*') }}dest: /usr/local/elasticsearchstate: linktags: deploy- name: 传输配置文件template:src: elasticsearch.j2dest: /usr/local/elasticsearch/config/elasticsearch.ymlowner: "{{ ela_user }}"group: "{{ ela_user }}"tags:- deploy- update-conf- name: 传输 jvm 配置文件copy:src: jvm.optionsdest: /usr/local/elasticsearch/config/jvm.optionsowner: "{{ ela_user }}"group: "{{ ela_user }}"tags:- deploy- update-conf- name: 传输系统配置文件copy:src: limits.confdest: /etc/security/limits.conftags: deploy- name: 传输系统配置文件copy:src: sysctl.confdest: /etc/sysctl.conftags: deploy- name: 加载 /etc/sysctl.conf 文件,使内核参数生效shell: sysctl -ptags: deploy- name: 检查 进程 PIDshell:cmd: ./jps | grep [E]lasticsearch | cut -d ' ' -f 1chdir: /usr/local/elasticsearch/jdk/bin/register: ela_pidtags:- restart- update-conf#- name: 调试# debug: var=ela_pid- name: 停止 elasticsearchwhen: ela_pid.stdoutshell: kill -9 "{{ ela_pid.stdout }}"tags:- restart- update-conf- name: 启动服务# 使用 elastic 用户执行此命令become: yesbecome_user: "{{ ela_user }}"command:# argv 是一个列表,存放了需要执行的命令及其参数# 一行一个argv:- nohup- /usr/local/elasticsearch/bin/elasticsearch- -p- /tmp/elasticsearch.pid- -dtags:- deploy- restart- update-conf
...
4 elk/ela/elasticsearch.j2
ES 集群配置模板文件
cluster.name: elk
node.name: {{ node_name }}
node.data: true
network.host: 0.0.0.0
http.port: 9200discovery.seed_hosts:- es01- es02:9300- es03
cluster.initial_master_nodes: {{ es_nodes }}
上面的模板文件中使用了变,需要在 资产清单文件 hosts.ini
中添加如下变量
[es]
# 集群节点名称
es01 node_name=ela1
es02 node_name=ela2
es03 node_name=ela3[es:vars]
# 用于参加选举的节点名列表
es_nodes=["ela1", "ela2", "ela3"]
5 elk/ela/jvm.options
ES 集群使用的 JVM 配置文件(这个不是必须的)
[root@vm1 playbook]# cat elk/jvm.options
-Xms1g
-Xmx1g
8-13:-XX:+UseConcMarkSweepGC
8-13:-XX:CMSInitiatingOccupancyFraction=75
8-13:-XX:+UseCMSInitiatingOccupancyOnly
14-:-XX:+UseG1GC
14-:-XX:G1ReservePercent=25
14-:-XX:InitiatingHeapOccupancyPercent=30
-Djava.io.tmpdir=${ES_TMPDIR}
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=data
-XX:ErrorFile=logs/hs_err_pid%p.log
8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
8:-Xloggc:logs/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m
9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
6 elk/ela/limits.conf
系统文件句柄数配置文件
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
7 elk/ela/sysctl.conf
系统的内核配置文件,内存映射数量等配置
只有
# elasticsearch
下面的配置内容是必须的,其他可选
# elasticsearch# 内存映射
vm.max_map_count=262144# TCP 连接等待响应的等待重试次数
net.ipv4.tcp_retries2=5
#####################################
vm.swappiness = 0
kernel.sysrq = 1net.ipv4.neigh.default.gc_stale_time = 120# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0
8 elk/elastic-vars.yml
参考上方 第一部分的第 5 小结
9 集群检查命令
9.1 查看集群内某个单一节点信息
curl 'http://es01:9200'
curl 'http://es02:9200'
curl 'http://es03:9200'
[root@ansible ~]# curl 'http://es01:9200'
{"name" : "ela1","cluster_name" : "elk","cluster_uuid" : "_1EhSGJfSG-FmmdljfwKcA","version" : {"number" : "7.10.0","build_flavor" : "default","build_type" : "tar","build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96","build_date" : "2020-11-09T21:30:33.964949Z","build_snapshot" : false,"lucene_version" : "8.7.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}
9.2 查看集群健康状态
curl -XGET 'http://es01:9200/_cluster/health?pretty'
9.3 查看节点信息
curl -X GET 'http://es01:9200/_cat/nodes'
二、 部署 Kibana
1 目录结构
elk
├── deploy-kibana.yml
├── elk-pkg
│ ├── elasticsearch-7.10.0-linux-x86_64.tar.gz
│ ├── kibana-7.10.0-linux-x86_64.tar.gz
│ └── logstash-7.10.0-linux-x86_64.tar.gz
├── elk-vars.yml
└── kibana├── kibana.service.j2└── kibana.yml
2 说明:
1 Kibana 默认不允许使用 root 用户启动,因此这里需要创建普通用户: ela
2 使用系统自带的 systemd 程序管理 Kibana 进程
3 自定义了程序的日志路径和程序的 PID 路径
3 elk/deploy-kibana.yml
---
- name: 部署 Kibanahosts: kibanagather_facts: noremote_user: rootvars_files:- elk-vars.ymlvars:dirs:dir_log: /var/log/kibanadir_pid: /run/kibanatasks:- name: create useruser:name: "{{ ela_user }}"state: presenttags: deploy- name: create directoryloop: "{{ dirs | dict2items }}"file:path: "{{ item.value }}"state: directoryowner: "{{ ela_user }}"group: "{{ ela_user }}"tags: deploy- name: 传输本地软件包到远程主机并且解压到指定目录ansible.builtin.unarchive:src: "{{ kibana}}"dest: /usr/local/owner: "{{ ela_user }}"group: "{{ ela_user }}"list_files: yesregister: rettags:- deploy- name: 创建软链接ansible.builtin.file:src: /usr/local/{{ ret.files.0 | regex_replace('/.*') }}dest: /usr/local/kibanastate: linktags: deploy- name: 传输配置文件template:src: kibana/kibana.ymldest: /usr/local/kibana/config/kibana.ymltags:- deploy- restartnotify: restart kibana- name: 传输服务管理文件template:src: kibana/kibana.service.j2dest: /etc/systemd/system/kibana.servicetags: deploy- name: 停止服务systemd:name: kibanastate: stoppedtags:- stop- name: 启动systemd:name: kibanastate: starteddaemon_reload: yestags:- deployhandlers:- name: restart kibanasystemd:name: kibanastate: restartedtags: restart
4 elk/kibana/kibana.yml
Kibana 程序的配置文件
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://es01:9200"]
pid.file: /run/kibana/kibana.pid
logging.dest: /var/log/kibana/kibana.log
i18n.locale: "zh-CN"
5 elk/kibana/kibana.service.j2
Kibana 程序管理模板文件
[Unit]
Description=Kibana
Documentation=https://www.elastic.co
After=network-online.target
Wants=network-online.target[Service]
Type=simple
User={{ ela_user }}
Group={{ ela_user }}ExecStart=/usr/local/kibana/bin/kibanaExecStop=/bin/pkill -F "{{ dirs.dir_pid }}/kibana.pid"Restart=on-failure
RestartSec=3StartLimitBurst=3
StartLimitInterval=60WorkingDirectory=/usr/local/kibanaStandardOutput=journal
StandardError=inherit[Install]
WantedBy=multi-user.target
6 elk/elk-vars.yml
用到的变量文件
参考上面 第一部分的第 5 小节
三、部署 Logstash
1 目录结构
elk
├── deploy-logstash.yml
│
├── elk-pkg
│ ├── elasticsearch-7.10.0-linux-x86_64.tar.gz
│ ├── kibana-7.10.0-linux-x86_64.tar.gz
│ └── logstash-7.10.0-linux-x86_64.tar.gz
├── elk-vars.yml
└── logstash├── logstash.conf├── logstash.service.j2└── logstash.yml
2 说明
1 程序使用 root 用户执行
2 指定了日志目录为 /var/log/logstash/
3 elk/deploy-logstash.yml
---
- name: 部署 Kibanahosts: logstashgather_facts: noremote_user: rootvars_files:- elk-vars.ymltasks:- name: 创建日志目录file:path: /var/log/logstashstate: directory- name: 传输本地软件包到远程主机并且解压到指定目录ansible.builtin.unarchive:src: "{{ logstash}}"dest: /usr/local/list_files: yesregister: rettags: deploy- name: 创建软链接ansible.builtin.file:src: /usr/local/{{ ret.files.0 | regex_replace('/.*') }}dest: /usr/local/logstashstate: linktags: deploy- name: 传输配置文件template:src: logstash/logstash.ymldest: /usr/local/logstash/config/logstash.ymltags: deploy- name: 传输管道配置文件copy:src: logstash/logstash.confdest: /usr/local/logstash/config/logstash-sample.conftags: deploy- name: 传输系统服务文件template:src: logstash/logstash.service.j2dest: /etc/systemd/system/logstash.servicetags: deploy- name: 启动 logstashsystemd:name: logstashstate: starteddaemon_reload: yestags:- deploy- name: restart logstashsystemd:name: logstashstate: restarteddaemon_reload: yestags:- restart
...
4 elk/logstash/logstash.yml
Logstash 程序主配置文件
http.host: "0.0.0.0"
path.logs: /var/log/logstash/
[root@ansible elk]#
5 elk/logstash/logstash.conf
Logstash 程序管道配置文件
这个文件内容后面实际项目的时候,会根据情况进行修改更新
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.input {beats {port => 5044}
}output {elasticsearch {hosts => ["http://es01:9200"]index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"#user => "elastic"#password => "changeme"}
}
6 logstash/logstash.service.j2
Logstash 程序进程管理模板文件
[Unit]
Description=logstash[Service]
Type=simpleExecStart=/usr/local/logstash/bin/logstash "-f" "/usr/local/logstash/config/*.conf"
Restart=always
WorkingDirectory=/
#Nice=19
LimitNOFILE=65535# When stopping, how long to wait before giving up and sending SIGKILL?
# Keep in mind that SIGKILL on a process can cause data loss.
TimeoutStopSec=infinity[Install]
WantedBy=multi-user.target
7 elk/elk-vars.yml
用到的变量文件
参考上面 第一部分的第 5 小节
云计算企业级小架构部署应用综合练习-二- Ansible 部署 Elastic Stack(ELK)相关推荐
- 云计算企业级小架构部署应用综合练习-docker变种(一)
前言 一.图 二.docker-compose 1 定义 Dockerfile 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. 先定义一个 Dockerfil ...
- 企业级小架构设计部署实现-docker变种(一)负载均衡网站
企业级小架构设计部署实现 企业级小架构设计部署实现-docker变种(一)负载均衡网站 企业级小架构设计部署实现-docker变种(二)日志系统 Elastic 企业级小架构设计部署实现-二- Ans ...
- Elastic Stack技术栈实践与Filebeat+Kibana企业级案例实战
Elastic Stack技术栈实践与Filebeat+Kibana企业级案例实战 全新ELK企业级应用实战教程 Elastic Stack技术栈实践基于企业级Elasticsearch应用与Elas ...
- 大数据、云计算系统高级架构师课程学习路线图
大数据之Linux+大数据开发篇 大数据的前景和意义也就不言而喻了,未来,大数据能够对大量.动态.能持续的数据,通过运用新系统.新 工具.新模型的挖掘,从而获得具有洞察力和新价值的东西.源于互联网的发 ...
- 大数据、云计算系统顶级架构师课程学习路线图
大数据之Linux+大数据开发篇 Java Linux基础 Shell编程 Hadoop2.x HDFS YARN MapReduce ETL数据清洗Hive Sqoop Flume/Oozie 大数 ...
- 《云计算开放应用架构》标准发布,阿里云持续领航云原生
简介:阿里云致力于为企业打造数字创新的最短路径,从实战中来,为价值而生. 5月26日,在 2021 云原生产业大会上,中国信通院联合 CNCF 发布 2021 年云原生优秀案例以及技术创新案例.阿里云 ...
- 企业级网络架构—云平台高可用网络的修炼之道
前言 当他睡眼惺忪.手拿红牛.嘴刁香烟迈着沉重的步伐从某网络核心机房走出来的时候,除了看门大爷简短问候之外,也只有刚刚过去的这个黑夜才真正懂得刚刚发生了什么,在外人眼里,这个夜晚再正常不过,和往常一样 ...
- 云计算的基础架构:并行计算+资源虚拟化
云计算的基础架构:并行计算+资源虚拟化 (2011-08-20 12:15:51) 标签: 校园 分类: 工作篇 高性能云计算:从科学应用的角度 科学计算往往需要可用的数量庞大的计算机来执行大规模实验 ...
- 云计算:体系架构与关键技术
1 引言 近年来,社交网络.电子商务.数字城市.在线视频等新一代大规模互联网应用发展迅猛.这些新兴的应用具有数据存储量大.业务增长速度快等特点.据统计至2010 年,社交网站Facebook 已存储了 ...
最新文章
- go使用SQLite数据库
- Python代码加密,将python文件编译成so文件
- 何不用python_人生几何,何不Python当歌
- 计蒜客 - Distance on the tree(LCA+主席树)
- ubuntu16 redis5.0以后版本集群部署示例
- msdn画圆弧函数_三角函数常识2020
- 连接SQL Server文件集锦
- [C++STL]vector容器用法介绍
- 搭建本地ubuntu镜像服务器(arm版)
- GSM网络结构及主要接口标注(附中英翻译)
- 机器学习数学基础十:相关分析
- Best Time to Buy and Sell Stock II(leetcode)
- 今世缘前三季考卷:江苏市场贡献超九成,3流通股东减持197.6万股
- Worthington毒液中核酸外切酶的特征及相关文献
- ecshop数据结构
- [tools]-excel的一些操作
- PCL:RANSAC 圆拟合(二维圆 + 空间圆)
- 培训机构短期培训半年后,他获得了 12K的月薪,却担心被解雇
- 按照现行四川省安全文明施工费计价管理办法【2017】5号文件测算安全文明施工费系数
- 抖音无水印视频下载方法