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

[经验分享] ELK最流行架构的搭建filebeat+kafka+zookeeper+ELK

[复制链接]

尚未签到

发表于 2019-1-8 13:54:20 | 显示全部楼层 |阅读模式
  本文给大家分享一下,如何搭建一个最为流行的ELK架构,上一篇博文中已经给大家分享过ELK架构的演变之路,
  也给出了当下最为流行的ELK日志架构,那就是filebeat+kafka(zookeeper)+logstash+elasticsearch+kibana。
  ELK的版本比较多,5.X版本和6.X版本之间差距较大,如果是打算新上系统的同仁,建议使用6.X版本,新版本的确功能
  提升较大,而且可视化功能也做的比早期的版本都要美观及强大。当然使用新版需要投入更多的时间及精力深入研究,
  毕竟新版技术文档不全,会有很多的不明之处等待着自行趟坑,但对于考虑ELK日后的可运维性以及敢于挑战自我学力
  能力的同仁,还是推荐使用新版的。
  官方提供的安装方式有两种,一种是基于二进制包展开的安装方式,另一种是直接使用rpm包进行安装。考虑到安装的便捷性
  及可维护性,我们选择rpm安装方式。kafka和zookeeper官方是没有发行rpm包的,所以只能使用二进制方式安装。
  环境展示:
  OS:CentOS 7.4.1708
  filebeat:6.4.0
  zookeeper:kafka 内置版本
  kafka:2.12-2
  logstash:6.4.0
  elasticsearch:6.4.0
  kibana:6.4.0
  本次演示(当然笔者的生产环境已经正式使用这套ELK了),所有节点均采用单节点方式
  为了节约资源,我们将对所需节点进行压缩
  压缩后资源分布如下:
  kibana+elasticsearch:192.168.10.101
  logstash+kafka+zookeeper:192.168.10.102
  filebeat+nginx:192.168.10.150
  所有节点基础工具安装及设定,保持统一(iptables禁用、SELinux禁用)
  yum install -y net-tools lrzsz telnet vim dos2unix bash-completion\
  ntpdate sysstat tcpdump traceroute nc wget
  echo -e "\nset nu\nset ai\nset nohlsearch\nset ts=4" >> /etc/vimrc && source /etc/vimrc
  echo 'HISTTIMEFORMAT="+%F %T "' >> /etc/profile && source /etc/profile
  sed -i s/'#ListenAddress 0/ListenAddress 0/' /etc/ssh/sshd_config && systemctl restart sshd
  systemctl disabled postfix
  systemctl disable postfix
  sed -i s/^SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config
  setenforce 0
  systemctl disable firewalld
  systemctl stop firewalld
  iptables -F
  kibana elasticsearch logstash kafka zookeeper
  以上软件均是java语言基础,所以有以上服务的节点都需要jdk环境,
  由于我们使用ELK stack的是官方较新版本6.4.0,查询官方推荐后决定使用升级稳定版java-1.8
  为了保持安装的便捷性我们一样使用yum安装方式进行安装
  yum install -y java-1.8.0-openjdk-devel
  kibana+elasticsearch:192.168.10.101
  此节点的安装过程
  安装jdk环境
  yum install -y java-1.8.0-openjdk-devel
  安装elasticsearch
  wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.rpm
  yum install -y elasticsearch-6.4.0.rpm
  cp /etc/elasticsearch/elasticsearch.yml{,.bak}
  vim /etc/elasticsearch/elasticsearch.yml
  elasticsearch显式配置内容
  grep ^[[[:alnum:]] /etc/elasticsearch/elasticsearch.yml
  cluster.name: my-es
  node.name: node-1
  path.data: /data/elasticsearch
  path.logs: /data/log/elasticsearch
  network.host: 0.0.0.0
  创建数据目录及日志目录
  mkdir -pv /data/{elasticsearch,log/elasticsearch}
  chown elasticsearch /data/{elasticsearch,log/elasticsearch}
  设定开机自启及启动服务
  systemctl enable elasticsearch
  systemctl start elasticsearch
  elasticsearch默认监听9200和9300端口
  9200用于对用户提供服务
  9300用于集群事务通信
  安装kibana
  由于和elasticsearch安装在同一个节点上了,所以不需要再次安装jdk环境了
  wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.0-x86_64.rpm
  vim /etc/kibana/kibana.yml
  kibana显示配置
  grep ^[[:alnum:]] /etc/kibana/kibana.yml
  server.host: "0.0.0.0"
  设定开机自启及启动服务
  systemctl enable kibana
  systemctl start kibana
  kibana默认监听5601端口(自身就是一个web服务器)
  logstash+kafka+zookeeper:192.168.10.102
  此节点的安装过程
  zookeeper+kafka安装配置
  安装jdk环境
  yum install -y java-1.8.0-openjdk-devel
  cd /opt && wget https://www.apache.org/dyn/closer.cgi?path=/kafka/2.0.0/kafka_2.12-2.0.0.tgz
  tar xf kafka_2.12-2.0.0.tgz
  配置kafka内置的zookeeper
  cp /opt/kafka_2.12-2.0.0/config/zookeeper.properties{,bak}
  vim /opt/kafka_2.12-2.0.0/config/zookeeper.properties
  zookeeper显式配置如下
  rep ^[[:alnum:]] /opt/kafka_2.12-2.0.0/config/zookeeper.properties
  dataDir=/data/zookeeper
  clientPort=2181
  maxClientCnxns=0
  配置kafka
  cp /opt/kafka_2.12-2.0.0/config/server.properties{,bak}
  vim /opt/kafka_2.12-2.0.0/config/server.properties
  kafka的显示配置如下
  grep ^[[:alnum:]] /opt/kafka_2.12-2.0.0/config/server.properties
  broker.id=0
  listeners=PLAINTEXT://192.168.10.102:9092
  num.network.threads=3
  num.io.threads=8
  socket.send.buffer.bytes=102400
  socket.receive.buffer.bytes=102400
  socket.request.max.bytes=104857600
  log.dirs=/data/kafka
  num.partitions=1
  num.recovery.threads.per.data.dir=1
  offsets.topic.replication.factor=1
  transaction.state.log.replication.factor=1
  transaction.state.log.min.isr=1
  log.retention.hours=168
  log.segment.bytes=1073741824
  log.retention.check.interval.ms=300000
  zookeeper.connect=localhost:2181
  zookeeper.connection.timeout.ms=6000
  group.initial.rebalance.delay.ms=0
  注意:
  listeners需要明确指定kafka通信需要监听的IP地址,不能使用0.0.0.0,否则无法启动
  为了系统安全和配置的标准化
  我们需要给zookeeper和kafka创建一个系统用户,使用这个系统用户来管理zookeeper和kafka进程
  useradd -M -d /opt/kafka_2.12-2.0.0 -r -s /sbin/nologin kafka
  创建zookeeper和kafka的数据目录
  mkdir -pv /data/{zookeeper,kafka}
  chown kafka /data/{zookeeper,kafka}
  为了使用方便,我们给zookeeper和kafka各写了一个服务管理脚本
  以免每次启动脚本写很长的命令,以及忘记使用kafka系统用户启动服务
  zookeeper服务脚本
  cat zk.sh
  #!/usr/bin/env bash
  #@Author: Lucker
  #@Company: BS
  #@Email: 183530300@qq.com
  #@Date: 2018-08-22 14:12:17
  #@Last Modified by: Lucker
  #@Last Modified time: 2018-08-22 18:00:48
  #@Description: zookeeper service management script
  kafka_home=/opt/kafka_2.12-2.0.0
  case $1 in
  start)
  sudo -u kafka $kafka_home/bin/zookeeper-server-start.sh \
  -daemon $kafka_home/config/zookeeper.properties
  ;;
  stop)
  sudo -u kafka $kafka_home/bin/zookeeper-server-stop.sh
  ;;
  *)
  echo -e "\033[32mUsage: $0 [start|stop]\033[0m"
  exit 1
  ;;
  esac
  kafka服务脚本
  cat kafka.sh
  #!/usr/bin/env bash
  #@Author: Lucker
  #@Company: BS
  #@Email: 183530300@qq.com
  #@Date: 2018-08-22 14:12:17
  #@Last Modified by: Lucker
  #@Last Modified time: 2018-08-22 14:12:17
  #@Description: kafka service management script
  kafka_home=/opt/kafka_2.12-2.0.0
  case $1 in
  start)
  sudo -u kafka $kafka_home/bin/kafka-server-start.sh \
  -daemon $kafka_home/config/server.properties
  ;;
  stop)
  sudo -u kafka $kafka_home/bin/kafka-server-stop.sh
  ;;
  *)
  echo -e "\033[32mUsage: $0 [start|stop]\033[0m"
  exit 1
  ;;
  esac
  logstash安装配置
  由于和kafka安装在同一个节点上了,所以不需要再次安装jdk环境了
  wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.0.rpm
  yum install -y logstash-6.4.0.rpm
  配置logstash的jvm
  grep -v ^# /etc/logstash/jvm.options | tr -s [[:space:]]
  -Xms1g
  -Xmx1g
  -XX:+UseParNewGC
  -XX:+UseConcMarkSweepGC
  -XX:CMSInitiatingOccupancyFraction=75
  -XX:+UseCMSInitiatingOccupancyOnly
  -Djava.awt.headless=true
  -Dfile.encoding=UTF-8
  -Djruby.compile.invokedynamic=true
  -Djruby.jit.threshold=0
  -XX:+HeapDumpOnOutOfMemoryError
  -Djava.security.egd=file:/dev/urandom
  -Xms -Xmx 如果logstash是专机专用的,建议调大此处的内存数值以提升logstash的性能
  logstash官方预设配置文件
  cat /etc/default/logstash
  LS_HOME="/usr/share/logstash"
  LS_SETTINGS_DIR="/etc/logstash"
  LS_PIDFILE="/var/run/logstash.pid"
  LS_USER="logstash"
  LS_GROUP="logstash"
  LS_GC_LOG_FILE="/data/log/logstash/gc.log"
  LS_OPEN_FILES="16384"
  LS_NICE="19"
  SERVICE_NAME="logstash"
  SERVICE_DESCRIPTION="logstash"
  LS_GC_LOG_FILE 建议修改为标准化的日志存放目录
  grep ^[[:alnum:]] /etc/logstash/startup.options
  LS_HOME=/usr/share/logstash
  LS_SETTINGS_DIR=/etc/logstash
  LS_OPTS="--path.settings ${LS_SETTINGS_DIR}"
  LS_JAVA_OPTS=""
  LS_PIDFILE=/var/run/logstash.pid
  LS_USER=logstash
  LS_GROUP=logstash
  LS_GC_LOG_FILE=/data/log/logstash/gc.log
  LS_OPEN_FILES=16384
  LS_NICE=19
  SERVICE_NAME="logstash"
  SERVICE_DESCRIPTION="logstash"
  变更/etc/logstash/startup.options内容之后需要使用$LS_HOME/bin/system-install
  推送变更到启动脚本环境预配置文件/etc/default/logstash中
  /usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd 6.4.0
  使用效果如下所示
  /usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd 6.4.0
  Using provided startup.options file: /etc/logstash/startup.options
  Manually creating startup for specified platform: systemd
  Manually creating startup for specified platform (systemd) version: 6.4.0
  Successfully created system startup script for Logstash
  以上的动作和直接修改/etc/default/logstash效果等同
  logstash主配文件显示配置如下
  grep ^[[:alnum:]] /etc/logstash/logstash.yml
  node.name: logstash-test
  path.data: /data/logstash
  path.logs: /data/log/logstash
  cat /etc/logstash/conf.d/logstash-es.conf
  input {
  kafka {
  bootstrap_servers => "192.168.10.102:9092"
  topics=> ["elk"]
  consumer_threads => 5
  decorate_events => true
  }
  }
  output {
  elasticsearch {
  hosts => ["192.168.10.101:9200"]
  index => "elk-%{+YYYY.MM.dd}"
  }
  }
  这里配置的logstash只是做了一个转发的工作,从kafka队列中获取消息并转发给elasticsearch进行索引并存储,
  没有对日志做任何的格式处理,要想拥有较理想的效果,的确需要在此启用filter插件,使用grok正则表达式进行
  数据字段的拆分后再送往elasticsearch
  创建logstash的数据及日志目录
  mkdir -pv /data/{logstash,log/logstash}
  chown logstash /data/{logstash,log/logstash}
  设定开机自启及启动服务
  systemctl enable logstash
  systemctl start logstash
  logstash默认监听9600端口
  filebeat+nginx:192.168.10.150
  此节点的安装过程
  由于此节点模拟业务服务器,只需要安装日志收集工具filebeat即可,因此无需安装jdk环境
  下载并安装filebeat
  wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-x86_64.rpm
  yum install -y filebeat-6.4.0-x86_64.rpm
  cp /etc/filebeat/filebeat.yml{,.bak}
  filebeat显式配置如下
  grep -v ^[[:space:]]*# /etc/filebeat/filebeat.yml | tr -s [[:space:]]
  filebeat.inputs:
  - type: log
  enabled: true
  paths:
  - /var/log/*.log
  - type: log
  enabled: true
  paths:
  - /var/log/nginx/*.log
  filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
  output.kafka:
  enabled: true
  hosts: ["192.168.10.102:9092"]
  topic: elk
  filebeat从本机抓取日志后输出到kafka列队中
  vim /etc/init.d/filebeat
  args="-c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config
  /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat"
  如果要想修改filebeat的自身日志的保存路径,需要在在此启动脚本中进行修改
  由于nginx只是为了测试效果,完全采用默认安装,为了方便测试效果,使用脚本批量生成了一些测试页面,脚本内容如下
  cat index.sh
  for i in {0..9}
  do
  echo "test page 100$i" > /usr/share/nginx/html/index${i}.html
  done
  为了方便产生日志,使用如脚本批量访问测试
  cat curl.sh
  for i in {0..9}
  do
  curl 127.0.0.1/index${i}.html
  done
  至此为止,初步配置完成了,剩下的就是全面的联调了。
  为了能够节省调试时间,建议大家从数据源头开始做调试,
  第一步:查看使用curl.sh批量访问后nginx的access日志收集是否正常
  第二步:查看filebeat的日志文件有没有自身配置错误信息以及转发数据到kafka队列是否正常
  此步骤可以在kafka服务器端使用命令行方式消费kafka中的消息进行双边确认
  具体操作见下文
  第三步:确认kafka服务本身正常的情况下,查看logstash日志,如果logstash和其它服务共用节点时
  需要注意该节点的内存资源是否充足,否则logstash会因为内存不足直接启动失败,笔者此次
  安装就再现过此问题
  第四步:如果前面三步验证都没问题的情况下,elasticsearch里面现在生产了少量的日志数据,但只要有
  数据存入elasticsearch,就会产生logstash out插件中预定义好的index,此时可能通过elasticsearch
  提供的查询API验证elasticsearch是否正常接收了来自logstash转发过来的日志数据
  具体操作见下文
  第五步:确认elasticsearch里面有数据以后,就可以使用浏览器打开es_server_ip:5601页面进行创建index模式
  注意:IE浏览器做此步的测试有问题,建议使用Chrome
  如果elasticsearch中没有数据时,是无法在kibana页面中创建index模式
  elasticsearch配置正确性验证命令
  以易读方式查询es中的可查询的接口列表
  [root@es-kibana ~]# curl 127.0.0.1:9200/_cat
  =^.^=
  /_cat/allocation
  /_cat/shards
  /_cat/shards/{index}
  /_cat/master
  /_cat/nodes
  /_cat/tasks
  /_cat/indices
  /_cat/indices/{index}
  /_cat/segments
  /_cat/segments/{index}
  /_cat/count
  /_cat/count/{index}
  /_cat/recovery
  /_cat/recovery/{index}
  /_cat/health
  /_cat/pending_tasks
  /_cat/aliases
  /_cat/aliases/{alias}
  /_cat/thread_pool
  /_cat/thread_pool/{thread_pools}
  /_cat/plugins
  /_cat/fielddata
  /_cat/fielddata/{fields}
  /_cat/nodeattrs
  /_cat/repositories
  /_cat/snapshots/{repository}
  /_cat/templates
  [root@es-kibana ~]#
  以易读方式查询es中的有效索引
  [root@es-kibana ~]# curl 127.0.0.1:9200/_cat/indices
  green  open .kibana        r6Vr3NxEQSC_jJizl3dNXg 1 0  2 0 10.2kb 10.2kb
  yellow open elk-2018.08.22 7Oou4ODYSD27QYsZgxMOig 5 1 10 0 25.2kb 25.2kb
  [root@es-kibana ~]#
  以易读方式查询es中健康状态
  [root@es-kibana ~]# curl 127.0.0.1:9200/_cat/health
  1534912178 12:29:38 my-es yellow 1 1 6 6 0 0 5 0 - 54.5%
  [root@es-kibana ~]#
  kafka配置正确性验证命令
  命令行方式生产kafka消息
  /opt/kafka/bin/kafka-console-producer.sh --broker-list 192.168.10.102:9092 --topic elk
  命令行方式消费kafka中的消息
  /opt/kafka_2.12-2.0.0/bin/kafka-console-consumer.sh --bootstrap-server 192.168.10.102:9092 \
  --topic elk --from-beginning
  整体ELK系统搭建过程并不复杂,但前提条件是你在打算使用这套系统时得首先理解清楚ELK系统的工作原理,
  否则根本无从下手,或是你参照本文把demo搭建出来了,但调试过程可能都调不通。




运维网声明 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-660826-1-1.html 上篇帖子: ZooKeeper 快速搭建与体验 下篇帖子: 基于redis和zookeeper的分布式锁实现方式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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