设为首页 收藏本站
查看: 2406|回复: 0

[经验分享] elasticsearch基本搭建

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-2-27 10:27:03 | 显示全部楼层 |阅读模式
elk产生的场景:

在微服务开发过程中,一般都会利用多台服务器做分布式部署,如何能够把分散在各个服务器中的日志归集起来做分析处理,是一个微服务服务需要考虑的一个因素。
搭建一个日志系统
搭建一个日志系统需要考虑一下一些因素:

利用什么技术,是自己实现还利用现成的组件
日志需要定义统一的格式
日志需要拥有一个锚点来进行全局跟踪

第一个问题,针对我们小公司来说,基本没有自己的研发能力,绝对是选用第三方开源的组件了。ELK配置比较简单,有现成的UI界面,容易检索日志信息,是首选。
第二个问题,利用log4j2定义好统一的日志格式,利用logstash过滤日志内容。
第三个问题,全局跟踪的ID有几种生产方式,一种是利用UUID或者生成随机数,一种是利用数据库来生成sequence number,还可以通过自定义一个id生成服务来获取。考虑到自身服务的需要,这里选用生成随机数来实现。
ELK+Filebeat 集中式日志解决方案详解

  • Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene                    构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;
  • Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;
  • Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;
  • Filebeat:ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder                    源代码开发,是对它的替代。在需要采集日志数据的 server 上安装 Filebeat,并指定日志目录或日志文件后,Filebeat                    就能读取数据,迅速发送到 Logstash 进行解析,亦或直接发送到 Elasticsearch 进行集中式存储和分析

ELK 常用架构及使用场景介绍在这个章节中,我们将介绍几种常用架构及使用场景。
最简单架构在这种架构中,只有一个 Logstash、Elasticsearch 和 Kibana 实例。Logstash                通过输入插件从多种数据源(比如日志文件、标准输入 Stdin 等)获取数据,再经过滤插件加工数据,然后经 Elasticsearch 输出插件输出到                Elasticsearch,通过 Kibana 展示。详见图 1。
图 1. 最简单架构 image001.jpg
这种架构非常简单,使用场景也有限。初学者可以搭建这个架构,了解 ELK 如何工作。
Logstash 作为日志搜集器这种架构是对上面架构的扩展,把一个 Logstash 数据搜集节点扩展到多个,分布于多台机器,将解析好的数据发送到 Elasticsearch                server 进行存储,最后在 Kibana 查询、生成日志报表等。详见图 2。
图 2. Logstash                    作为日志搜索器 image002.jpg
这种结构因为需要在各个服务器上部署 Logstash,而它比较消耗 CPU                和内存资源,所以比较适合计算资源丰富的服务器,否则容易造成服务器性能下降,甚至可能导致无法正常工作。
Beats 作为日志搜集器这种架构引入 Beats 作为日志搜集器。目前 Beats 包括四种:
  • Packetbeat(搜集网络流量数据);
  • Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据);
  • Filebeat(搜集文件数据);
  • Winlogbeat(搜集 Windows 事件日志数据)。

Beats 将搜集到的数据发送到 Logstash,经 Logstash 解析、过滤后,将其发送到 Elasticsearch 存储,并由                Kibana 呈现给用户。详见图 3。
图 3. Beats                    作为日志搜集器 image003.jpg
这种架构解决了 Logstash 在各服务器节点上占用系统资源高的问题。相比 Logstash,Beats 所占系统的 CPU                和内存几乎可以忽略不计。另外,Beats 和 Logstash 之间支持 SSL/TLS 加密传输,客户端和服务器双向认证,保证了通信安全。
因此这种架构适合对数据安全性要求较高,同时各服务器性能比较敏感的场景。
引入消息队列机制的架构到笔者整理本文时,Beats 还不支持输出到消息队列,所以在消息队列前后两端只能是 Logstash 实例。这种架构使用 Logstash                从各个数据源搜集数据,然后经消息队列输出插件输出到消息队列中。目前 Logstash 支持 Kafka、Redis、RabbitMQ                等常见消息队列。然后 Logstash 通过消息队列输入插件从队列中获取数据,分析过滤后经输出插件发送到 Elasticsearch,最后通过                Kibana 展示。详见图 4。
图 4.                    引入消息队列机制的架构 image004.jpg
这种架构适合于日志规模比较庞大的情况。但由于 Logstash 日志解析节点和 Elasticsearch                的负荷比较重,可将他们配置为集群模式,以分担负荷。引入消息队列,均衡了网络传输,从而降低了网络闭塞,尤其是丢失数据的可能性,但依然存在                Logstash 占用系统资源过多的问题。
基于 Filebeat 架构的配置部署详解前面提到 Filebeat 已经完全替代了 Logstash-Forwarder                成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。这个章节将详细讲解如何部署基于 Filebeat 的 ELK                集中式日志解决方案,具体架构见图 5。
图 5. 基于                    Filebeat 的 ELK 集群架构 image005.jpg
因为免费的 ELK 没有任何安全机制,所以这里使用了 Nginx 作反向代理,避免用户直接访问 Kibana 服务器。加上配置 Nginx                实现简单的用户认证,一定程度上提高安全性。另外,Nginx 本身具有负载均衡的作用,能够提高系统访问性能。

Filebeat + ELK 安装ELK 官网对于每种软件提供了多种格式的安装包(zip/tar/rpm/DEB),以 Linux 系列系统为例,如果直接下载 RPM,可以通过                rpm                -ivh path_of_your_rpm_file 直接安装成系统                service。以后就可以使用 service                命令启停。比如 service elasticsearch                start/stop/status。很简单,但缺点也很明显,就是不能自定义安装目录,相关文件放置比较分散。
实际使用中更常用是使用 tar 包安装。每种软件产品的安装过程非常相似,所以下面仅以 Elasticsearch 为例简述安装过程。

软件包

实验环境中使用的4个软件包都是5.1.1版本,也可以到官网http://www.elastic.co/下载最新的版本

环境:

配置hosts两台服务器网络通畅  
  agent1 安装es1,agent3安装es2 做成集群,后期可能还会用到redis,redis提供的功能相当于kafka,收集logstatsh发来的数据,es从redis中提取数据。
agent1 安装kibana 做数据展示
agent3安装logstatsh 做数据收集  

filebeat安装在需要收集日志的服务器上


为了安全起见 elasticsearch 5.x默认不能用root启动,所以 需要用elasticsearch 用户启动ES
首先关闭防火墙和Selinux,Redhat7.2关闭防火墙的方法如下
systemctl status firewall
systemctl stop firewalld
systemctl disable firewall
systemctl enable firewall
由于es logstatsh kibana基于java 开发,所以安装jdk ,jdk版本不要过低,否则会提醒升级jdk。
安装elasticsearch(agent1,agent3全都安装es)

在agent1,agent3上安装一个大于1.8的jdk版本,然后解压5.1.1的es的tar.gz

es1的配置:ip地址为192.168.137.11

[iyunv@agent1 ~]#  grep -n '^[a-Z]' /usr/local/elasticsearch-5.1.1/config/elasticsearch.yml
17:cluster.name: my-application
23:node.name: node-2
33:path.data: /var/lib/elasticsearch
37:path.logs: /var/log/elasticsearch
55:network.host: 192.168.137.11
56:network.bind_host: 192.168.137.11
57:network.publish_host: 192.168.137.11
58:http.port: 9201
59:node.master: false
60:node.data: true
61:http.enabled: true
62:http.cors.enabled: true
63:http.cors.allow-origin: "*"
76:discovery.zen.ping.unicast.hosts: ["192.168.137.11","192.168.137.13"]
es2的配置,设置es2为master节点:ip地址为192.168.137.13
[iyunv@agent3 ~]#  egrep -v "^#|^$" /usr/local/elasticsearch-5.1.1/config/elasticsearch.yml
cluster.name: my-application
node.name:    ${HOSTNAME}
node.master: true
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.137.13
network.bind_host: 192.168.137.13
network.publish_host: 192.168.137.13
http.enabled: true
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.137.13","192.168.137.11"]
[iyunv@agent3 ~]#

启动es1
su - elasticsearch

/usr/local/elasticsearch-5.1.1/bin/elasticsearch -d

查看java进程

[iyunv@agent1 bin]# ps -ef | grep java
501       5153  5121  0 11:11 pts/1    00:01:53 /usr/local/jdk1.8.0_121//bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/usr/local/elasticsearch-5.1.1 -cp /usr/local/elasticsearch-5.1.1/lib/elasticsearch-5.1.1.jar:/usr/local/elasticsearch-5.1.1/lib/* org.elasticsearch.bootstrap.Elasticsearch
root      6529  5328  0 16:53 pts/4    00:00:00 grep java

查看es1的启动端口

[iyunv@agent1 bin]# netstat -tulnp | grep java
tcp        0      0 ::ffff:192.168.137.11:9201  :::*                        LISTEN      5153/java           
tcp        0      0 ::ffff:192.168.137.11:9300  :::*                        LISTEN      5153/java           
[iyunv@agent1 bin]#
可以看到es的9201端口已经启动


测试:

在es机器上访问:

curl 'http://localhost:9200'
curl 'http://localhost:9200/?pretty'
或者在浏览器窗口中输入 http://localhost:9200/?pretty

es1结果如下:
QQ截图20170227102333.png
es集群搭建

集群的搭建也非常简单,保证cluster_name一致, node_name不一致就好了,
可以在同一个网段自动发现新节点,也可以在配置文件的discovery.zen.ping.unicast.hosts属性中指定集群的节点IP;node2的es端口改成9201

判断设备的角色
[url=]http://192.168.137.13:9200/_cat/master?v[/url]
[url=]http://192.168.137.11:9201/_cat/nodes?v[/url]
QQ截图20170227102339.png
*代表master
QQ截图20170227102343.png






Elasticsearch5.1.1安装问题集锦
使用Elasticsearch5.X 必须安装jdk1.8

问题1:

org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
解决方案:
因为安全问题elasticsearch 不让用root用户直接运行,所以要创建新用户
建议创建一个单独的用户用来运行ElasticSearch
创建elasticsearch用户组及elasticsearch用户
groupadd asticsearch
useradd elasticsearch -g elasticsearch -p elasticsearch
然后修改安装配置文件
chown elasticsearch:elasticsearch /usr/local/elasticsearch-5.1.1 -R
另外指定的日志文件和数据文件也需要递归修改用户和组,启动程序时切换到自定的elasticsearch用户,./elasticsearch -d在后台的方式启动

root 启动elasticsearch报错
/bin/elasticsearchException in thread "main" java.lang.RuntimeException: don't run elasticsearch as root.        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:93)        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:144)        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:285)        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
Refer to the log for complete error details.12345671234567
解决方案:

bin/elasticsearch -Des.insecure.allow.root=true


启动失败
Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root.
解释:为“防止attacker 获取root权限”, 如果是RPM包安装,会自动创建elastsearch组和elastsearch用户,设置好密码,换一个用户启动即可


问题2:
使用elasticsearch启动ES后 又会遇到以下问题
ERROR: bootstrap checks failed
max file descriptors [10240] for elasticsearch process likely too low, increase to at least [65536]
max number of threads [1024] for user [elsearch] likely too low, increase to at least [2048]
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
[2016-11-14T10:22:17,569][INFO ][o.e.n.Node               ] [mysteel-node1] stopping ...
[2016-11-14T10:22:17,615][INFO ][o.e.n.Node               ] [mysteel-node1] stopped
[2016-11-14T10:22:17,615][INFO ][o.e.n.Node               ] [mysteel-node1] closing ...
[2016-11-14T10:22:17,638][INFO ][o.e.n.Node               ] [mysteel-node1] closed
max virtual memory areas vm.max_map_count [65530] likely too low,increase to at least [262144]

解决方案:
切换到root用户
vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

vi /etc/security/limits.d/20-nproc.conf
修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 2048

max file descriptors [10240] for elasticsearch process likely too low, increase to at least [655360]

vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
sysctl -p
然后,重新启动elasticsearch,即可启动成功。

或者直接用命令行临时的方式进行更改进行修改值:
sysctl -w vm.max_map_count=262144
查看修改结果:
sysctl -a|grep vm.max_map_count

ulimit -Hn
65536

Increase RLIMIT_MEMLOCK, soft limit: XXXXX, hard limit: XXXXX
es为了性能考虑,推荐关掉swap,并锁定一部分mem,按照日志中的指引操作即可

问题3:
外网访问9200端口系统redhat7.2安装elasticsearch后本机可以访问127.0.0.1:9200,但不能访问【公网IP:9200】
解决方案

修改配置文件 config/elasticsearch.yml
network.host: 0.0.0.0
http.port: 9200
注意关闭防火墙和selinux


问题4:
cannot allocate memory
解决方案: 虚拟机内存不够,关掉虚拟机,重新加大内存分配,原先是512M,现在分配到2000M


博客参考地址:

http://m.blog.csdn.net/article/details?id=51280058

http://www.ibm.com/developerwork ... utm_medium=referral



elastic官方文档
https://www.elastic.co/guide/en/ ... rrent/settings.html
https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details

https://www.elastic.co/guide/en/ ... tion-filtering.html

https://kibana.logstash.es/conte ... lysis/kbnindex.html 中文 指南








运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-347819-1-1.html 上篇帖子: Shell+AWStats+ELK分析Nginx的Log 下篇帖子: Elasticsearch PHP MYSQL的同步使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表