Elastic Stack搭建部署及使用示例(史上最全)

666 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本博客是演示基于filebeat->kafka->logstash->elasticsearch->kibana 数据采集及数据可视化分析系统搭建。

包括配置方法、使用实例、运维脚本

zookeeper安装部署

采用伪集群部署 zookeeper版本为:apache-zookeeper-3.6.1-bin.tar.gz

配置:zoo.cfg

zoo1.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/zk/data/1
dataLogDir=/home/hadoop/zk/logs/1
clientPort=8181
#伪集群部署
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883
#为zookeeper添加SASL支持
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000

zoo2.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/zk/data/2
dataLogDir=/home/hadoop/zk/logs/2
clientPort=8182
#伪集群部署
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883
#为zookeeper添加SASL支持
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000

zoo3.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/zk/data/3
dataLogDir=/home/hadoop/zk/logs/3
clientPort=8183
#伪集群部署
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883
#为zookeeper添加SASL支持
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000

创建数据和日志目录

cd /home/hadoop/zk
mkdir -p /home/hadoop/zk/data/3
mkdir -p /home/hadoop/zk/data/2
mkdir -p /home/hadoop/zk/data/1

mkdir -p /home/hadoop/zk/logs/1
mkdir -p /home/hadoop/zk/logs/2
mkdir -p /home/hadoop/zk/logs/3

创建myid文件

在dataDir指定目录下创建一个myid文件。
然后分别在myid文件中按照zoo.cfg文件的server.(数字)中数字的数值,
在不同服务器上的myid文件中填写相应的值。例如server.1 在当前机器的myid中就只写上1
#echo 1 > /home/hadoop/zk/data/myid
echo 1 > /home/hadoop/zk/data/1/myid
echo 2 > /home/hadoop/zk/data/2/myid
echo 3 > /home/hadoop/zk/data/3/myid

zk使用

启动
zkServer.sh start ../conf/zoo1.cfg
停止
zkServer.sh stop ../conf/zoo1.cfg
查看状态
zkServer.sh status ../conf/zoo1.cfg
启动客户端
zkCli.sh -server 127.0.0.1:8181
zkCli.sh -server 127.0.0.1:8182
zkCli.sh -server 127.0.0.1:8183
或者
zkCli.sh -server 127.0.0.1:8181,127.0.0.1:8182,127.0.0.1:8183

客户端连接zookeeper集群,可以连接多台也可以连接1台服务器,bin/zkCli.sh -server (ip1或域名1):2181,(ip2域名2):2181,(ip3域名3):2181,
多个ip或域名间用逗号分隔(这里可以使用ip也可以使用域名。)

zookeeper可视化:

  1. zookeeper-visualizer (很好使)

  2. idea zookeeper插件(不好使,容易卡死)

参考: zookeeper 安装及配置 zookeeper伪集群安装部署

kafka

kafka伪分布式安装部署

kafka版本: kafka_2.11-2.4.1.tgz

server1.properties

#每台机器必须唯一
broker.id=0
#在配置集群的时候必须设置,不然以后的操作会报找不到leader的错误
listeners=INSIDE://0.0.0.0:9091,OUTSIDE://0.0.0.0:8091
# INSIDE指的是broker之间通讯,例如:REPLICATION 与LEADER的通讯,OUTSIDE指的是外部客户端与kafka集群之间的通讯,例如:CLIENT与kafka集群
advertised.listeners=INSIDE://127.0.0.1:9091,OUTSIDE://hostname:8091
listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
#broker间通讯的监听器名称。如果未设置,则侦听器名称由security.inter.broker.protocol定义。 同时设置此项和security.inter.broker.protocol属性是错误的,只设置一个。
inter.broker.listener.name=INSIDE
#log.retention.minutes=5
log.retention.hours=168
zookeeper.connect=127.0.0.1:8181,127.0.0.1:8182,127.0.0.1:8183/kafka
compression.type=producer
delete.topic.enable=true
log.dirs=/home/hadoop/kafka/data/1
log.dir=/home/hadoop/kafka/data/1
num.partitions=1
min.insync.replicas=1
default.replication.factor=3
auto.create.topics.enable=false
log.retention.check.interval.ms=300000
log.segment.bytes=1073741824

server2.properties

#每台机器必须唯一
broker.id=1
#在配置集群的时候必须设置,不然以后的操作会报找不到leader的错误
listeners=INSIDE://0.0.0.0:9092,OUTSIDE://0.0.0.0:8092
# INSIDE指的是broker之间通讯,例如:REPLICATION 与LEADER的通讯,OUTSIDE指的是外部客户端与kafka集群之间的通讯,例如:CLIENT与kafka集群
advertised.listeners=INSIDE://127.0.0.1:9092,OUTSIDE://hostname:8092
listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
#broker间通讯的监听器名称。如果未设置,则侦听器名称由security.inter.broker.protocol定义。 同时设置此项和security.inter.broker.protocol属性是错误的,只设置一个。
inter.broker.listener.name=INSIDE
#log.retention.minutes=5
log.retention.hours=168
zookeeper.connect=127.0.0.1:8181,127.0.0.1:8182,127.0.0.1:8183/kafka
compression.type=producer
delete.topic.enable=true
log.dirs=/home/hadoop/kafka/data/2
log.dir=/home/hadoop/kafka/data/2
num.partitions=1
min.insync.replicas=1
auto.create.topics.enable=false
log.retention.check.interval.ms=300000
log.segment.bytes=1073741824

server3.properties

#每台机器必须唯一
broker.id=2
#在配置集群的时候必须设置,不然以后的操作会报找不到leader的错误
listeners=INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:8093
# INSIDE指的是broker之间通讯,例如:REPLICATION 与LEADER的通讯,OUTSIDE指的是外部客户端与kafka集群之间的通讯,例如:CLIENT与kafka集群
advertised.listeners=INSIDE://127.0.0.1:9093,OUTSIDE://hostname:8093
listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
#broker间通讯的监听器名称。如果未设置,则侦听器名称由security.inter.broker.protocol定义。 同时设置此项和security.inter.broker.protocol属性是错误的,只设置一个。
inter.broker.listener.name=INSIDE
#log.retention.minutes=5
log.retention.hours=168
zookeeper.connect=127.0.0.1:8181,127.0.0.1:8182,127.0.0.1:8183/kafka
compression.type=producer
delete.topic.enable=true
log.dirs=/home/hadoop/kafka/data/3
log.dir=/home/hadoop/kafka/data/3
num.partitions=1
min.insync.replicas=1
auto.create.topics.enable=false
log.retention.check.interval.ms=300000
log.segment.bytes=1073741824

启动:

kafka-server-start.sh -daemon $KAFKA_HOME/config/server1.properties 
kafka-server-start.sh -daemon $KAFKA_HOME/config/server2.properties 
kafka-server-start.sh -daemon $KAFKA_HOME/config/server3.properties 

beats

filebeat

filebeat版本:filebeat-6.8.4-linux-x86_64.tar.gz filebeat配置: 本例是从本地目录采集文件到kafka filebeat.yml 需要配置的地方如下:

#=========================== Filebeat prospectors =============================

filebeat.prospectors:

# Each - is a prospector. Most options can be set at the prospector level, so
# you can use different prospectors for various configurations.
# Below are the prospector specific configurations.

- type: log

  # Change to true to enable this prospector configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /home/hadoop/fklek/filebeat/data_log/log.*
#-------------------------Kafka output ------------------------------
output.kafka:
  hosts: ["127.0.0.1:8091","127.0.0.1:8092","127.0.0.1:8093"]
  #topic: '%{[fields.my_log_topic]}'
  topic: test.3
  partition.round_robin:
    reachable_only: false
  #version: 0.10.0.0
  required_acks: -1
  compression: gzip
  max_message_bytes: 1000000

filebeat 配置验证

./filebeat test config -c filebeat.yml 

filebeat 启动

./filebeat -e -c filebeat.yml 

metricbeat 配置

metribeat版本:metricbeat-6.8.4-linux-x86_64.tar.gz
metricbeat 配置kibana仪表盘监控系统资源情况等(不需要的话,此项可以不配置)

metricbeat.yml 需要配置的地方

#============================== Kibana =====================================

# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:

  # Kibana Host
  # Scheme and port can be left out and will be set to the default (http and 5601)
  # In case you specify and additional path, the scheme is required: http://localhost:5601/path
  # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
  host: "127.0.0.1:8560"

  # Kibana Space ID
  # ID of the Kibana Space into which the dashboards should be loaded. By default,
  # the Default Space will be used.
  #space.id:

#================================ Outputs =====================================

# Configure what output to use when sending the data collected by the beat.

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:8920"]

  # Protocol - either `http` (default) or `https`.
  #protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  #username: "elastic"
  #password: "changeme"

查看现有的Modules

./metricbeat modules list

执行命令启动Metricbeat

nohup ./metricbeat -e > metricbeat.log & #后台启动

参考:
metricbeat,filebeat仪表盘的安装以及在Kibana上的展示
ELK日志处理之metricbeat服务器性能监控

elasticsearch

elasticsearch版本:
elasticsearch-6.8.4.tar.gz(本例使用此版本,因为需要在有type的类型下做测试) elasticsearch-7.x以上无type

elasticsearch.yml 需要配置的地方:

# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
cluster.name: my-application
node.name: node-1
path.data: /home/hadoop/fklek/es/data  
path.logs: /home/hadoop/fklek/es/logs
#修改绑定的ip:默认只允许本机访问,修改为0.0.0.0后则可以远程访问
network.host: 0.0.0.0
http.port: 8920 

#表示这个节点是否可以充当主节点,以及点是否充当数据节点。
node.master: true
node.data: true
#指定IK为分词工具,新版本不需要设置,设置会报错
#index.analysis.analyzer.ik.type : "ik"

#指定集群中的节点中有几个有master资格的节点。对于大集群可以写3个以上。
#covery.zen.minimum_master_nodes: 2   

#默认是3s,这是设置集群中自动发现其它节点时ping连接超时时间,为避免因为网络差而导致启动报错,我设成了40s。
#discovery.zen.ping.timeout: 40s

#设置是否打开多播发现节点。
#discovery.zen.ping.multicast.enabled: false

#设置绑定的ip地址,这是我的master的IP。
#network.bind_host: 127.0.0.1

#设置其他节点和该节点交互的IP地址
#network.publish_host: 127.0.0.1

#同时设置bind_host和publish_host上面两个参数
#network.host: 127.0.0.1

#指明集群中其他可能为master的节点ip,以防es启动后发现不了集群中的其他节点。第一对引号里是node1,默认端口是9300.第二个是node2,端口号是9301。第三个引号里是node3,端口号为9302
#discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9301","127.0.0.1:9302"]
#discovery.zen.ping.unicast.hosts:["节点1的 ip","节点2 的ip","节点3的ip"]

#集群结点之间通信端口,默认为9300
#transport.tcp.port: 9300

es启动

./bin/elasticsearch -d -p pid

启动集群

./elasticsearch --cluster.name myes --node.name node1

logstash

logstash版本:logstash-6.8.4.tar.gz
参考:
logstash.yml 需要的配置

path.data: /home/hadoop/fklek/logstash/data    #数据存储路径 
#path.config: /etc/logstash/conf.d/*.conf   #配置文件目录
path.logs: /home/hadoop/fklek/logstash/logs   #日志输出路径

kafka_es.conf 配置

input {
    kafka {
        bootstrap_servers => "127.0.0.1:8091,127.0.0.1:8092,127.0.0.1:8093"
        topics => ["test.3"]
        auto_offset_reset => "earliest"
        group_id => "logstash_group_1"
        codec => "plain"
        consumer_threads => 1
        decorate_events => true
    }
}

filter {
}

output {
    elasticsearch {
        hosts => ["127.0.0.1:8920"]
        index => "kafka-es-%{+YYYY.MM.dd}"
        workers => 1
    }
    stdout {codec => rubydebug}
}

logstash启动

nohup ./bin/logstash -l logs/log -f kafka_es.conf > logs/log.nohup 2>&1 &

kibana

kibana版本:kibana-6.8.4-linux-x86_64.tar.gz

kibana.yml 需要的配置

server.port: 8560
server.host: "0.0.0.0"
pid.file: /home/hadoop/fklek/kibana/kibana.pid
elasticsearch.hosts: ["http://localhost:8920"]
kibana.index: ".kibana"

启动kibana

nohup ./bin/kibana -l logs/log > logs/log.nohup 2>&1 &

访问:http://127.0.0.1:8560