一、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)相关推荐

  1. 云计算企业级小架构部署应用综合练习-docker变种(一)

    前言 一.图 二.docker-compose 1 定义 Dockerfile 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. 先定义一个 Dockerfil ...

  2. 企业级小架构设计部署实现-docker变种(一)负载均衡网站

    企业级小架构设计部署实现 企业级小架构设计部署实现-docker变种(一)负载均衡网站 企业级小架构设计部署实现-docker变种(二)日志系统 Elastic 企业级小架构设计部署实现-二- Ans ...

  3. Elastic Stack技术栈实践与Filebeat+Kibana企业级案例实战

    Elastic Stack技术栈实践与Filebeat+Kibana企业级案例实战 全新ELK企业级应用实战教程 Elastic Stack技术栈实践基于企业级Elasticsearch应用与Elas ...

  4. 大数据、云计算系统高级架构师课程学习路线图

    大数据之Linux+大数据开发篇 大数据的前景和意义也就不言而喻了,未来,大数据能够对大量.动态.能持续的数据,通过运用新系统.新 工具.新模型的挖掘,从而获得具有洞察力和新价值的东西.源于互联网的发 ...

  5. 大数据、云计算系统顶级架构师课程学习路线图

    大数据之Linux+大数据开发篇 Java Linux基础 Shell编程 Hadoop2.x HDFS YARN MapReduce ETL数据清洗Hive Sqoop Flume/Oozie 大数 ...

  6. 《云计算开放应用架构》标准发布,阿里云持续领航云原生

    简介:阿里云致力于为企业打造数字创新的最短路径,从实战中来,为价值而生. 5月26日,在 2021 云原生产业大会上,中国信通院联合 CNCF 发布 2021 年云原生优秀案例以及技术创新案例.阿里云 ...

  7. 企业级网络架构—云平台高可用网络的修炼之道

    前言 当他睡眼惺忪.手拿红牛.嘴刁香烟迈着沉重的步伐从某网络核心机房走出来的时候,除了看门大爷简短问候之外,也只有刚刚过去的这个黑夜才真正懂得刚刚发生了什么,在外人眼里,这个夜晚再正常不过,和往常一样 ...

  8. 云计算的基础架构:并行计算+资源虚拟化

    云计算的基础架构:并行计算+资源虚拟化 (2011-08-20 12:15:51) 标签: 校园 分类: 工作篇 高性能云计算:从科学应用的角度 科学计算往往需要可用的数量庞大的计算机来执行大规模实验 ...

  9. 云计算:体系架构与关键技术

    1 引言 近年来,社交网络.电子商务.数字城市.在线视频等新一代大规模互联网应用发展迅猛.这些新兴的应用具有数据存储量大.业务增长速度快等特点.据统计至2010 年,社交网站Facebook 已存储了 ...

最新文章

  1. go使用SQLite数据库
  2. Python代码加密,将python文件编译成so文件
  3. 何不用python_人生几何,何不Python当歌
  4. 计蒜客 - Distance on the tree(LCA+主席树)
  5. ubuntu16 redis5.0以后版本集群部署示例
  6. msdn画圆弧函数_三角函数常识2020
  7. 连接SQL Server文件集锦
  8. [C++STL]vector容器用法介绍
  9. 搭建本地ubuntu镜像服务器(arm版)
  10. GSM网络结构及主要接口标注(附中英翻译)
  11. 机器学习数学基础十:相关分析
  12. Best Time to Buy and Sell Stock II(leetcode)
  13. 今世缘前三季考卷:江苏市场贡献超九成,3流通股东减持197.6万股
  14. Worthington毒液中核酸外切酶的特征及相关文献
  15. ecshop数据结构
  16. [tools]-excel的一些操作
  17. PCL:RANSAC 圆拟合(二维圆 + 空间圆)
  18. 培训机构短期培训半年后,他获得了 12K的月薪,却担心被解雇
  19. 按照现行四川省安全文明施工费计价管理办法【2017】5号文件测算安全文明施工费系数
  20. 抖音无水印视频下载方法

热门文章

  1. CSS 第005 背景-理论
  2. 使用GIS空间分析进行植物生长区域选址(附练习数据下载)
  3. 内外墙乳胶漆颜色怎么搭配,内外墙品牌涂料如何选购?
  4. 算法_数学问题_Question10_马克思手稿中的数学(java实现)
  5. 机器视觉——VisionPro应用开发指南
  6. Pygame(四)画椭圆,弧
  7. NFC交通卡移动支付产业链
  8. 用python写注册登录界面web_用Python实现web端用户登录和注册功能
  9. Android蓝牙打印机,带你真正了解各种打印格式
  10. 自研芯片,快手打响 ToB 第一战!