赞
踩
Elk集群安装+配置(Elasticsearch+Logstash+Filebeat+Kafka+zookeeper+Kibana)
一、部署环境
软件 | 版本 | 作用 |
---|---|---|
Linux | Centos7.1, | 16g |
Jdk | 1.8.0_151 | |
Elasticsearch | 5.5.0 | 数据持久化,存储数据 |
Logstash | 5.5.0 | 数据过滤/处理,从kafka中接收日志,转发到es中 |
Kibana | 5.5.0 | 数据可视化 |
Filebeat | 5.5.0 | 数据采集,在各个服务器上收集日志,输出到kafka中 |
Kafka | 2.11-0.10.2.1 | 数据缓存,避免因logstash服务挂掉造成的日志丢失 |
Zookeeper | 3.4.10 | 与kafka 配套使用,协调管理kafka代理 |
2.机器环境:elk服务器4台,业务服务器65台
NODE | IP | 节点类型 |
---|---|---|
es1 | X.X.X.109 | 数据/主节点(安装es、logstash、kafka、zookeeper) |
es2 | X.X.X.108 | 数据/主节点(安装es、logstash、kafka、zookeeper) |
es3 | X.X.X.105 | 数据/主节点(安装es、logstash、kafka、zookeeper) |
es4 | X.X.X.100 | 搜索节点(安装es、kibana、node、head、kafkaOffsetMonitor) |
log* | X.X.X.X | 业务服务器日志收集节点(安装filebeat) |
二、安装jdk
解压
sudo tar -zxvf jdk-8u151-linux-x64.tar.gz -c /usr/local/etc/
- sudo vi /etc/profile
- etc/profile文件末尾增加环境变量
- export JAVA\_HOME=/usr/local/etc/jdk1.8.0\_151
- export JRE\_HOME=${JAVA\_HOME}/jre
- export CLASSPATH=.:${JAVA\_HOME}/lib:${JRE\_HOME}/lib
- export PATH=$PATH:${JAVA_HOME}/bin
source /etc/profile
java -version
三、安装elasticsearch
- cluster.name: 66kuaiche #集群名称,同一个集群的标识.
- node.name: es1 #节点名称
- node.master: true #允许一个节点可以成为一个master节
- node.data: true #允许该节点存储数据(默认开启)
- network.host: X.X.X.109 #绑定监听IP
- http.port: 9200 #设置对外服务的http端口
- transport.tcp.port: 9300 # 设置节点间交互的tcp端口
- discovery.zen.ping.unicast.hosts: \["X.X.X.109:9300","X.X.X.108:9300","X.X.X.105:9300"\] # 这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测
- node.max\_local\_storage_nodes: 2 # 多个节点可以在同一个安装路径启动
- discovery.zen.minimum\_master\_nodes: 2 # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点.默认为1,对于大的集群来说,可以设置大一点的值(2-4)
- http.cors.enabled: true #允许跨域访问,head使用
- http.cors.allow-origin: "*" #允许跨域访问,head使用
启动命令 前台运行:
./elasticserch
后台台运行:
./elasticserch -d
验证
浏览器输入:X.X.X.109:9200
返回结果如下:
- {
- "name" : "es1",
- "cluster_name" : "66kuaiche",
- "cluster_uuid" : "jHr4yAzQQn2NnzAkakj-1A",
- "version" : {
- "number" : "5.5.0",
- "build_hash" : "260387d",
- "build_date" : "2017-06-30T23:16:05.735Z",
- "build_snapshot" : false,
- "lucene_version" : "6.6.0"
- },
- "tagline" : "You Know, for Search"
- }
启动elasticsearch时报错,
main ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
-原因:elasticearch不能以root权限启动,改变elasticsearch文件夹所有者到非root用户,sudo chown -R centos:centos elasticsearch
ERROR: bootstrap checks failed
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
-原因:堆内存过低,需设置内核参数
-临时修改:sudo sysctl -w vm.max_map_count=262144
-永久修改::修改/etc/sysctl.conf 文件
添加: vm.max_map_count=262144
执行:sysctl -p
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
-原因:elasticsearch用户拥有的可创建文件描述的权限太低,需设置资源参数,至少需要65536;
#切换到root用户修改:
sudo -s
vim /etc/security/limits.conf
在最后面追加下面内容
*** hard nofile 65536
*** soft nofile 65536
*** 是启动ES的用户,如:centos
修改文件成功,仍报too low,是因为没有使用sudo -s切换到root权限,而是使用sudo vi limit,conf修改的配置文件
main ERROR RollingFileManager (/usr/local/etc/elasticsearch-5.5.0-slave1/logs/66kuaiche.log)
java.io.FileNotFoundException: /usr/local/etc/elasticsearch-5.5.0-slave1/logs/66kuaiche.log (权限不够)
java.io.FileNotFoundException: /usr/local/etc/elasticsearch-5.5.0-slave1/logs/66kuaiche.log (权限不够)
-原因:es在生成日志时需要写文件的权限,但es又不能以root权限启动,所以需要将log文件或整个es文件夹赋予当前用户的权限
sudo chown -R elastic:elastic elasticsearch-5.5.0
搭建elsticsearch集群,报错with the same id but is a different node instance
-复制elsticsearch将其文件夹下的data文件夹一并复制了,data文件夹下已经产生了data历史数据,删除即可
填坑问题(查了好几天)在一开始使用Tcp的方式传输日志到logstash ,发现有数据丢失的问题
-原因:业务服务器的时间和logstash服务器的时间不同步,在开发环境服务器X.203.115.115上,时间比标准时间慢5分钟
-查看本服务器时间:date
-查看标准时间:rdate time-b.nist.gov (time-b.nist.gov为是美国标准技术院的时间自动同步服务器的域名)
-同步标准时间到本服务器:rdate -s time-b.nist.gov
四、安装logstash
参数 | 说明 | 举例 |
---|---|---|
-e | 立即执行,使用命令行里的配置参数启动实例 | ./bin/logstash -e ‘input {stdin {}} output {stdout {}}’ |
-f | 指定启动实例的配置文件 | ./bin/logstash -f config/test.conf |
-t | 测试配置文件的正确性 | ./bin/logstash-f config/test.conf -t |
-l | 指定日志文件名称 | ./bin/logstash-f config/test.conf -l logs/test.log |
-w | 指定filter线程数量,默认线程数是5 | ./bin/logstash-f config/test.conf -w 8 |
- input {
- stdin {
- }
- beats {
- port => 5044
- }
- }
类型 | 说明 | 举例 |
---|---|---|
Boolean | 布尔 | result => true |
Number | 数字 | port => 5054 |
String | 字符串 | type => “log” |
Commonts | 注释 | # 注释 |
字段
Logstash数据流中的数据被称之为Event对象,Event以JSON结构构成,Event的属性被称之为字段,如果你像在配置文件中引用这些字段,只需要把字段的名字写在中括号[]里就行了,如[type],对于嵌套字段每层字段名称都写在[]里就可以了,比如:[tags][type];除此之外,对于Logstash的arrag类型支持下标与倒序下表,如:[tags][type][0],[tags][type][-1]。
运算语法
类型 | 说明 |
---|---|
比较运算符 | ==, !=, <, >, <=, >= |
正则运算 | =~, !~ |
条件运算符 | in, not in |
逻辑运算符 | and, or, nand, xor |
输入插件 | |
file读取插件 | |
文件读取插件主要用来抓取文件的变化信息,将变化信息封装成Event进程处理或者传递。 |
- input
- file {
- path => \["/var/log/*.log", "/var/log/message"\]
- type => "system"
- start_position => "beginning"
- }
- }
- input {
- beats {
- port => 5044
- }
- }
- tcp {
- port => 41414
- }
- kafka {
- bootstrap_servers => \["X.X.X.109:9092,X.X.X.108:9092,X.X.13
- 0.105:9092"\]
- topics => \["ucenter-dev-kafka"\]
- auto\_offset\_reset => "latest"
- codec => "json"
- }
- web log
- input
- file {
- path => \["/var/log/*.log", "/var/log/message"\]
- type => "system"
- start_position => "beginning"
- }
- }
- date {
- match => \['time', ' yyyy-MM-dd HH:mm:ss.SSS '\]
- target => '@timestamp'
- }
- ruby {
- code =>"
- arr=event.get('message').split('-|')
- length=arr.length
- if length ==7
- event.set('logId',arr\[0\]\[-32..-1\])
- event.set('module',arr\[1\])
- event.set('time',arr\[2\])
- event.set('level',arr\[3\])
- event.set('thread',arr\[4\])
- event.set('class',arr\[5\])
- event.set('msg',arr\[6\])
- else
- event.set('msg',event.get('message'))
- end
- "
- remove\_field => \['\_id','input_type','tags','message','beat','offset'\]
- }
输出插件
ElasticSearch输出插件
用于将事件信息写入到Elasticsearch中
- elasticsearch {
- hosts => \["X.X.X.109:9200","X.X.X.108:9200","X.X.X.105:9200"\]
- index => "truck-ka-prod-%{+YYYY.MM.dd}"
- manage_template => true
- template_name => "filebeat-tem"
- template_overwrite => true
- template => "/usr/local/etc/logstash-1/template/filebeat_template.json"
- }
参数名称 | 类型 | 默认值 | 描述信息 |
---|---|---|---|
index | string | “logstash-%{+YYYY.MM.dd}” | 指定elasticsearch存储数据时的所有名称,支持变量引用,比如你可以按天创建索引,方便删除历史数据或者查询制定范围内的数据 |
hosts | string | [//127.0.0.1] | elasticsearch服务地址列表,如果配置多个将启用负载均衡 |
manage_template | boolean | true | 是否启用elasticsearch模版,Logstash自带一个模版,但是只有名称匹配“logstash-*”的索引才会应用该默版 |
template_name | string | “logstash” | 是否启用elasticsearch模版,Logstash自带一个模版,但是只有名称匹配“logstash-*”的索引才会应用该默版 |
template_overwrite | boolean | false | 始终 |
template | string | 无 | 设置自定义的默版存放路径 |
五、安装kibana
- server.port: 9000 # kibana 对外访问端口
- server.host: "X.X.X.100" # kibana 对外访问ip
- elasticsearch.url: "http://X.X.X.100:9200" # kibana 连接es的ip地址,其中本项目中es 集群有4哥几点,3台数据/主节点,1台搜索节点,kibana连接搜索节点
六、安装kafka
- broker.id=1 #当前机器在集群中的唯一标识,和zookeeper的myid性质一样
- delete.topic.enable=true #如果kafka启动之前没有配置delete.topic.enable=true,删除topic只会标记为marked for deletion,加上配置,重启kafka,之前的topic就真正删除了
- auto.create.topics.enable=false #是否自动创建topic,如果kafka中没有topic,- 自动创建topic
- listeners=PLAINTEXT://X.X.X.109:9092 #kafka监听
- advertised.listeners=PLAINTEXT://X.X.X.109:9092
- num.network.threads=3 #这个是borker进行网络处理的线程数
- num.io.threads=8 #这个是borker进行I/O处理的线程数
- socket.send.buffer.bytes=102400
- socket.receive.buffer.bytes=102400
- socket.request.max.bytes=104857600
- log.dirs=/usr/local/etc/kafka/log #消息存放的目录,这个目录可以配置为“,”逗号分割的表达式,上面的num.io.threads要大于这个目录的个数这个目录,如果配置多个目录,新创建的topic他把消息持久化的地方是,当前以逗号分割的目录中,那个分区数最少就放那一个
- num.partitions=3 #默认的分区数,一个topic默认1个分区数
- num.recovery.threads.per.data.dir=1
- log.retention.hours=168 #默认消息的最大持久化时间,168小时,7天
- log.segment.bytes=1073741824 #这个参数是:因为kafka的消息是以追加的形式落地到文件,当超过这个值的时候,kafka会新起一个文件
- log.retention.check.interval.ms=300000 #每隔300000毫秒去检查上面配置的log失效时间
- zookeeper.connect=X.X.X.109:12181,X.X.X.108:12181,X.X.X.105:12181 #设置zookeeper的连接端口
- zookeeper.connection.timeout.ms=6000 #设置zookeeper的连接超时时间
七、安装zookeeper
- tickTime=2000
- initLimit=10 #对于从节点最初连接到主节点时的超时时间,单位为tick值的倍数
- syncLimit=5 #对于主节点与从节点进行同步操作时的超时时间,单位为tick值的倍数
- dataDir=/usr/local/etc/zookeeper/zkdata #用于配置内存数据库保存的模糊快照的目录。即刚刚创建的data文件夹就是在此目录中,文件信息都存放在data目录下
- clientPort=12181 #表示客户端所连接的服务器所监听的端口号,默认是2181。即zookeeper对外提供访问的端口号
- server.1=X.X.X.109:12888:13888
- server.2=X.X.X.108:12888:13888
- server.3=X.X.X.105:12888:13888
- #server.1 这个1是服务器的标识也可以是其他的数字, 表示这个是第几号服务器,用来标识服务器,这个标识要写到快照目录下面myid文件里
- #第一个端口是master和slave之间的通信端口,默认是2888,第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888
b. 配置zoo.cfg
- 在三个linux机器上刚刚创建的data目录下新建一个myid文件并打开,vi myid命令,依次在3台机器上输入1、2、3,保存退出。这里的1,2,3是与server1,2,3相对应的
\[centos@supply-41b-6 zkdata\]$ more myid
c. 配置环境变量
- vi etc/profile 输入下面参数,保存退出,source profile命令使修改生效
- export ZOOKEEPER_HOME=/usr/local/etc/zookeeper/zookeeper-3.4.10/
- export PATH=$PATH:$ZOOKEEPER\_HOME/bin:$ZOOKEEPER\_HOME/conf
4.启动命令
./zkServer.sh start
5.验证
./zkServer.sh status
- ZooKeeper JMX enabled by default
- Using config: /usr/local/etc/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg #配置文件
- Mode: follower #是否为leader
7.连接到zookeeper
./zkCli.sh -server X.X.X.108:12181
八、安装filebeat
1.软件下载
链接:filebeat-5.5.0-linux-x86_64.tar.gz 2.解压文件到指定目录
/usr/local/etc
3.修改配置文件
- \# paths指定要监控的日志
- paths:
- \- /var/log/xxx.log
-
- \# 输出到logstash 配置
- output.logstash:
- # The Logstash hosts
- hosts: \["x.x.x.109:1091","x.x.x.108:1091","x.x.x.105:1091"\]
- worker: 3
- loadbalance: true
-
- \# 输出到kafka 配置
- output.kafka:
- #hosts: \["x.x.x.109:9092","x.x.x.108:9092","x.x.x.105:9092"\]
- topic: xxxx-kafka
- required_acks: 1
4.启动命令
sudo nohup ./filebeat -e -c beat-dev.yml >/dev/null 2>&1 &
5.验证启动成功失败
ps -ef|grep beat
九、安装ik分词插件
1.软件下载
2.解压文件到指定目录
3.重启es
十、安装xpack
1.软件下载
5.5版本的xpack插件是收费的,需要安装破解版的,破解教程后续完善
安装命令
安装前,需要关闭elasticsearch和kibana,否则启动会报错
2.es安装xpack(离线):./elasticsearch-plugin install file:usr/local/etc/package/x-pack-5.5.0.zip
[elastic@supply-7 bin]$ ./elasticsearch-plugin install file:usr/local/etc/package/x-pack-5.5.0.zip
- -\> Downloading file:usr/local/etc/package/x-pack-5.5.0.zip
- \[=================================================\] 100%
- \* java.io.FilePermission \\\.\\pipe\\* read,write
- \* java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
- \* java.lang.RuntimePermission getClassLoader
- \* java.lang.RuntimePermission setContextClassLoader
- \* java.lang.RuntimePermission setFactory
- \* java.security.SecurityPermission createPolicy.JavaPolicy
- \* java.security.SecurityPermission getPolicy
- \* java.security.SecurityPermission putProviderProperty.BC
- \* java.security.SecurityPermission setPolicy
- \* java.util.PropertyPermission * read,write
- \* java.util.PropertyPermission sun.nio.ch.bugLevel write
- \* javax.net.ssl.SSLPermission setHostnameVerifier
- See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
- for descriptions of what these permissions allow and the associated risks.
-
- Continue with installation? \[y/N\]y
-
- This plugin launches a native controller that is not subject to the Java
- security manager nor to system call filters.
-
- Continue with installation? \[y/N\]y
- -\> Installed x-pack
3.kibana安装xpack(离线):bin/kibana-plugin install
4.效果图:
1.es节点图,图中带星号的es2为master节点,es4为数据搜索节点
2.kibana效果图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。