效果

image.png

ES

1.部署环境准备

系统:CentOS Linux release 7.8.2003
IP:192.168.88.11,192.168.88.12,192.168.88.13
网络:确保内网可以相互通信,注意防火墙配置
安装目录:/data/
内核参数设置,需要加大系统的句柄数量和mmap值

  1. ulimit -n 65535
  2. sysctl -w vm.max_map_count=262144

否则ES启动的时候会报错
image.png
永久配置
在/etc/security/limits.conf添加

  1. vim /etc/security/limits.conf
  2. es - nofile 65535

在/etc/sysctl.conf添加

  1. vim /etc/sysctl.conf
  2. vm.max_map_count=262144
  3. sysctl -p


2.下载安装包

下载elasticsearch,有basic和oss等不同的包,这里是oss(不包含x-pack),
链接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-7.10.0-linux-x86_64.tar.gz
**

3.单机测试

解压安装包

  1. cd /data
  2. tar xf elasticsearch-oss-7.10.0-linux-x86_64.tar.gz

进入文件夹

  1. cd elasticsearch-7.10.0/

elasticsearch已经自带jdk环境了
image.png
默认elasticsearch是不让用root用户运行的,直接启动就会报错
image.png
先创建启动elasticsearch的用户,这里我用的是es用户

  1. useradd es -M -s /sbin/nologin

将elasticsearch目录的权限赋给es用户

  1. chown -R es:es /data/elasticsearch-7.10.0

用新加好的es用户启动elasticsearch试试

  1. sudo -u es /data/elasticsearch-7.10.0/bin/elasticsearch

image.png

4.集群配置

没有报错就是启动成功了,然后就是配置集群
基本需要配置如下参数

  1. #集群名称
  2. cluster.name: test
  3. #数据和日志目录我都没有设置,生成环境有需要可以指定目录
  4. node.name,这里我直接填的是本机的ip,(其它节点填自己的IP或者主机名就好)
  5. #绑定的hosts,我这里设置0.0.0.0,监听所有地址;
  6. network.host: 0.0.0.0
  7. #配置初始节点的hosts,如果不加端口,那就用默认端口
  8. discovery.seed_hosts: ["192.168.88.11", "192.168.88.12","192.168.88.13"]
  9. #因为是全新的集群,需要手动设置初始化master节点,集群形成完毕之后,这个参数就可以从配置文件里面去掉(其余节点无需配置)
  10. cluster.initial_master_nodes: ["192.168.88.11"]

以上都设置完成了,再次启动,启动成功
image.png

5.从节点启动

其它node启动,重复以上所有步骤
,把配置项中的node.name换成自己的ip或者主机名称然后启动就好,这里不再赘述
192.168.88.12节点启动成功
image.png
192.168.88.13节点启动成功
image.png
启动完成后主节点也会有日志显示节点加入成功
ELK部署 - 图10

6.可视化工具安装

Cerebro
https://github.com/lmenezes/cerebro/releases

这里我用的是cerebro, 部署在192.168.88.11

  1. wget https://github.com/lmenezes/cerebro/releases/download/v0.9.2/cerebro-0.9.2.tgz

然后解压,进去运行就好了
ELK部署 - 图11
如果有常用的es集群地址,可以在application.conf下配置

  1. vim /data/cerebro-0.9.2/conf/application.conf

ELK部署 - 图12
然后启动
ELK部署 - 图13
访问http://192.168.88.11:9000
ELK部署 - 图14
点test名称连接集群,已经可以看到我们的3个节点
ELK部署 - 图15
点其它菜单,可以看到集群的其它信息,这里不做过多的介绍,剩下的自己摸索
ELK部署 - 图16
ES集群搭建到此结束
参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/index.html
7.X版本重大更新:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/breaking-changes-7.0.html

Kafka+Zooper

1.kafka环境准备

系统:CentOS Linux release 7.8.2003Ip:192.168.88.11,192.168.88.12,192.168.88.13安装目录:/data/
下载
https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.6.0/kafka_2.13-2.6.0.tgz

2.zookeeper配置

2.1 zookeeper配置启动,下面简称zk

由于kafka依赖ZooKeeper,先要安装好zookeeper,kafka压缩包里已经附带zookeeper了,我们配置一下,启动就好,线上不建议单机部署,zk,这里也搭建的是集群模式,最好也是3(奇数)台,防止脑裂。搭建可以参考:https://zookeeper.apache.org/doc/current/zookeeperStarted.html

2.2 解压安装包

  1. cd /data
  2. tar xf kafka_2.13-2.6.0.tgz
  3. cd /data/kafka_2.13-2.6.0


2.3 编辑zookeeper配置文件,修改或者添加如下配置

  1. vim config/zookeeper.properties
  2. #clientPort端口设置
  3. clientPort=2181
  4. #maxClientCnxns客户端并发数量,0代表不限制
  5. maxClientCnxns=0
  6. #admin.enableServer默认是启动的,这里我们关闭,或者在其中一台上启用就好
  7. admin.enableServer=false
  8. #tickTime超时时间,单位毫秒
  9. tickTime =2000
  10. #initLimit集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数
  11. initLimit=10
  12. #syncLimit Leader 与Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是10*2000=20秒
  13. syncLimit=5
  14. #dataDir 快照日志的存储路径
  15. dataDir=/data/zookeeper/
  16. #dataLogDir 事物日志的存储路径,如果不配置这个那么事物日志会默认存储到dataDir制定的目录,这样会严重影响zk的性能,当zk吞吐量较大的时候,产生的事物日志、快照日志太多
  17. dataLogDir=/data/logs/zookeeper
  18. #server.n 这个n是服务器的标识也可以是其他的数字, 表示这个是第几号服务器,用来标识服务器,这个标识要写到快照目录下面myid文件里
  19. server.1=192.168.88.11:2888:3888
  20. server.2=192.168.88.12:2888:3888
  21. server.3=192.168.88.13:2888:3888


2.4 创建目录

  1. #以上配置3台机器都需要执行一遍
  2. mkdir /data/zookeeper/
  3. mkdir /data/logs/zookeeper

2.5 配置myid文件

在192.168.88.11上

  1. echo 1 >/data/zookeeper/myid

在192.168.88.12上

  1. echo 2 >/data/zookeeper/myid

在192.168.88.13上

  1. echo 3 >/data/zookeeper/myid

2.6 启动zk

  1. cd /data/kafka_2.13-2.6.0
  2. ./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

启动正常,但是有错误日志显示找不到sever.2和server.3
ELK部署 - 图17
然后再启动192.168.88.12和192.168.88.13上的zk,启动都是正常的

2.7 连接zookeeper

启动完毕后可以用kafka安装目录bin目录下的zookeeper-shell.sh连接zk测试是否正常

  1. cd /data/kafka_2.13-2.6.0/bin
  2. ./zookeeper-shell.sh 127.0.0.1:2181

2.8 测试

ls /
ELK部署 - 图18
然后新建一个节点
create /test
ELK部署 - 图19
再ls /查看一下
ELK部署 - 图20
可以看到多了一个test节点,那么再去其它节点查看是否数据同步了
其它节点同样可以看到新建的/test节点,那么zk集群就算建好了
ELK部署 - 图21

3.Kafka配置

3.1 kafka配置文件路径

  1. cat /data/kafka_2.12-2.5.0/config/server.properties

3.2 配置修改及解释

我这里配置的主要有以下选项,更多参数请参考官方文档:
http://kafka.apache.org/documentation/#configuration

  1. #当前机器在集群中的唯一标识,和zookeeper的myid性质一样,其余两台分别配置1和2
  2. broker.id=0
  3. #主机名为空表示绑定到默认接口,这里建议使用域名代替ip,将来如果迁移集群也不用动配置文件,还有如果写死了内网ip,那么通过外网IP是没有办法访问集群的,用域名一劳永逸,listeners和advertised.listeners是不允许绑定0.0.0.0这个地址的,
  4. listeners=PLAINTEXT://node1.kafka:9092
  5. #执行网络操作的线程数
  6. num.network.threads=3
  7. #指定 io 操作的线程数
  8. num.io.threads=8
  9. # socket的发送缓冲区(SO_SNDBUF)
  10. socket.send.buffer.bytes=1048576
  11. # socket的接收缓冲区 (SO_RCVBUF)
  12. socket.receive.buffer.bytes=1048576
  13. # socket请求的最大字节数。为了防止内存溢出,message.max.bytes必然要小于
  14. socket.request.max.bytes=104857600
  15. #消息数据存放目录,多个目录使用逗号分割
  16. log.dirs=/data/logs/kafka
  17. # 每个topic的默认分区个数,更多的partition会产生更多的segment file
  18. num.partitions=3
  19. # 每个数据目录用于在启动时进行日志恢复和在关闭时进行刷新的线程数,默认值为: 1
  20. num.recovery.threads.per.data.dir1
  21. # offset topic的replicas数量(设置更高以确保可用性)。在集群大小满足此复制因子要求之前(例如set为3,而broker不足3个),内部topic创建将失败
  22. offsets.topic.replication.factor=1
  23. # 事务主题的复制因子(设置更高以确保可用性)。 内部主题创建将失败,直到群集大小满足此复制因素要求
  24. transaction.state.log.replication.factor=1
  25. # 覆盖事务主题的min.insync.replicas配置,在min.insync.replicas中,replicas数量为1,该参数将默认replicas定义为2
  26. transaction.state.log.min.isr=2
  27. # 更新记录起始偏移量的持续记录的频率,官方建议不要动这个参数
  28. log.flush.interval.messages=10000
  29. # 更新记录起始偏移量的持续记录的频率(时间/毫秒)
  30. log.flush.interval.ms=1000
  31. # 默认消息的最大持久化时间,168小时,7天
  32. log.retention.hours=168
  33. #这个参数是:因为kafka的消息是以追加的形式落地到文件,当超过这个值的时候,kafka会新起一个文件
  34. log.segment.bytes=1073741824
  35. #每隔300000毫秒去检查上面配置的log失效时间(log.retention.hours=168 ),到目录查看是否有过期的消息如果有,删除
  36. log.retention.check.interval.ms=300000
  37. #是否启用log压缩,一般不用启用,启用的话可以提高性能
  38. log.cleaner.enable=true
  39. #设置zookeeper的连接端口
  40. zookeeper.connect=192.168.88.11:2181,192.168.88.12:2181,192.168.88.13:2181/kafka
  41. zookeeper.connection.timeout.ms=18000
  42. group.initial.rebalance.delay.ms=0

然后启动就好了

3.3 Kafka可视化软件

然后kafka我们也需要装一个监控软件
Kafka-eagle
下载地址:https://codeload.github.com/smartloli/kafka-eagle-bin/tar.gz/v2.0.3
解压

  1. tar xf kafka-eagle-bin-2.0.3.tar.gz
  2. cd /data/kafka-eagle-bin-2.0.3
  3. tar xf kafka-eagle-web-2.0.3-bin.tar.gz

3.4 修改配置文件

  1. #修改这两行的内容即可
  2. vim conf/system-config.properties
  3. kafka.eagle.zk.cluster.alias=test-kafka
  4. test-kafka.zk.list=192.168.88.11:2181,192.168.88.12:2181,192.168.88.13:2181/kafka

3.5 开启JMX

记得kafka开启jmx,开启的话在这个脚本

  1. vim /data/kafka_2.13-2.6.0/ bin/kafka-server-start.sh
  2. KAFKA_HEAP_OPTS下面加入export JMX_PORT=9999 # 然后重启即可
  3. ./bin/ke.sh start

3.6 kafka可视化界面

注意:jmx远程调用会返回一个主机以host_name映射的ip,如果你的hostname解析的不是内网IP,有可能会返回“create has error,msg is java.rmi.ConnectException cannot be cast to javax.management.remote.JMXConnector”
访问192.168.88.11:8048
ELK部署 - 图22
用户名/密码:admin/123456
ELK部署 - 图23
ELK部署 - 图24
常用命令

  1. 查看topic列表
  2. ./kafka-topics.sh --zookeeper localhost:2181/kafka list
  3. 查看topic详情
  4. ./kafka-topics.sh --zookeeper localhost:2181/kafka --describe --topic nginx-access-log
  5. 查询看topic内容
  6. ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic nginx-access-log --from-beginning


td-agent安装

参照官网教程:
https://docs.fluentd.org/installation

1.脚本一键安装

执行完没有报错即安装完毕

  1. # td-agent 4
  2. $ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
  3. # td-agent 3
  4. $ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh

2.配置td-agent

配置文件在/etc/td-agent/目录下
mv td-agent.conf td-agent.conf.bak
备份一下原始配置,接下来以收集nginx日志为例
ELK部署 - 图25

2.1.配置详解

  1. 配置文件主要由以下指令组成:
  2. 1. Source设置输入来源
  3. 2. Match设置输出目的地
  4. 3. Filter过滤器,处理管道,可以改写流程中的数据
  5. 4. System全局配置,比如收集器的日志输出目录,级别等
  6. 5. @include引入其它配置文件
  7. 本文中用到的配置:
  8. <system>
  9. log_level trace
  10. </system>
  11. <source>
  12. #每个source指令必须要有输入插件的类型,详见https://docs.fluentd.org/input
  13. @type tail
  14. #日志路径,只可以指定多个路径,以逗号分隔,支持通配符.
  15. path /data/logs/nginx/*.access.log
  16. #记录日志文件最后读取的位置.
  17. pos_file /data/logs/td-agent/*.access.pos
  18. #收集事件的标签,可以为通配符.
  19. tag test.access
  20. read_from_head true
  21. #日志格式,必填
  22. <parse>
  23. #解析类型
  24. @type json
  25. </parse>
  26. </source>
  27. #过滤器
  28. <filter test.access>
  29. #使用的过滤器插件类型
  30. @type record_transformer
  31. #recode指令,内部使用键值对
  32. <record>
  33. #project,这个属于自定义字段
  34. project test
  35. #主机的hostname
  36. hostname "#{Socket.gethostname}"
  37. </record>
  38. </filter>
  39. #输出配置项
  40. <match test.access>
  41. #输出类型,参考官方文档https://docs.fluentd.org/output/kafka
  42. @type kafka2
  43. #kafka服务器brokers列表
  44. brokers node1.kafka:9092,node2.kafka:9092,node3.kafka:9092
  45. #发送消息的最大字节大小,如果发送的数据大于kafka配置的接收值大小,那么消息就会发送失败
  46. max_send_limit_bytes 1048576
  47. #将收集器事件事件设置为kafka的createtime
  48. use_event_time true
  49. # buffer settings
  50. # 缓冲区设置
  51. <buffer topic>
  52. @type file
  53. #缓冲区块存储的路径,如果填'*'则为随机字符,必填
  54. path /data/logs/td-agent/test.access
  55. #刷新间隔
  56. flush_interval 3s
  57. </buffer>
  58. # data type settings
  59. #扩展和重新定义输出的格式
  60. <format>
  61. @type json
  62. </format>
  63. # topic settings
  64. # topic_key message
  65. # topic名称
  66. default_topic nginx-access-log
  67. # producer settings
  68. # 压缩消息
  69. compression_codec gzip
  70. # 重试发送次数
  71. max_send_retries 1
  72. # 和kafka发送数据的健壮性有关,详细了解搜索kafka的request.required.acks
  73. required_acks -1
  74. </match>

3.启动

配置了以上内容启动即可,

  1. systemctl start td-agent

4. 进kafka web查看

然后kafka eagle监控里可以看到数据已经进来了
ELK部署 - 图26
Td-agent完成
**

logstash安装

实时解析和转换数据

1.Logstash安装和下载

  1. https://artifacts.elastic.co/downloads/logstash/logstash-7.10.0-linux-x86_64.tar.gz

2.安装配置

  1. cd /data/logstash-7.10.0/config
  2. #新建配置文件
  3. vim nginx-access-log.conf
  4. input {
  5. kafka {
  6. bootstrap_servers => "node1.kafka:9092,node2.kafka:9092,node2.kafka:9092"
  7. topics => ["nginx-access-log"]
  8. consumer_threads => 4
  9. codec => "json"
  10. }
  11. }
  12. output {
  13. elasticsearch {
  14. hosts =>
  15. ["192.168.88.11:9200",
  16. "192.168.88.12:9200",
  17. "192.168.88.13:9200"]
  18. index => "nginx-access-log-%{+YYYY.MM.dd}"
  19. # sniffing => true
  20. #字段映射模版
  21. template => "/data/logstash7.10.0/template/nginx-access-log.json"
  22. template_name => "nginx-access-log"
  23. template_overwrite => true
  24. }
  25. }
  26. #新建字段映射模版
  27. mkdir template/
  28. vim nginx-access-log.json
  29. {"template":"nginx-access-log-*",
  30. "settings":{
  31. "index.refresh_interval":"10s",
  32. "number_of_shards":"3",
  33. "number_of_replicas":"0"
  34. },
  35. "mappings": {
  36. "properties": {
  37. "@timestamp": {
  38. "type": "date"
  39. },
  40. "@version": {
  41. "type": "text",
  42. "fields": {
  43. "keyword": {
  44. "type": "keyword",
  45. "ignore_above": 256
  46. }
  47. }
  48. },
  49. "hostname": {
  50. "type": "text",
  51. "fields": {
  52. "keyword": {
  53. "type": "keyword",
  54. "ignore_above": 256
  55. }
  56. }
  57. },
  58. "http_body_size": {
  59. "type": "text",
  60. "fields": {
  61. "keyword": {
  62. "type": "keyword",
  63. "ignore_above": 256
  64. }
  65. }
  66. },
  67. "http_host": {
  68. "type": "text",
  69. "fields": {
  70. "keyword": {
  71. "type": "keyword",
  72. "ignore_above": 256
  73. }
  74. }
  75. },
  76. "http_referer": {
  77. "type": "text",
  78. "fields": {
  79. "keyword": {
  80. "type": "keyword",
  81. "ignore_above": 256
  82. }
  83. }
  84. },
  85. "http_remote_addr": {
  86. "type": "text",
  87. "fields": {
  88. "keyword": {
  89. "type": "keyword",
  90. "ignore_above": 256
  91. }
  92. }
  93. },
  94. "http_request": {
  95. "type": "text",
  96. "fields": {
  97. "keyword": {
  98. "type": "keyword",
  99. "ignore_above": 256
  100. }
  101. }
  102. },
  103. "http_request_time": {
  104. "type": "double",
  105. "fields": {
  106. "keyword": {
  107. "type": "keyword",
  108. "ignore_above": 256
  109. }
  110. }
  111. },
  112. "http_status": {
  113. "type": "long",
  114. "fields": {
  115. "keyword": {
  116. "type": "keyword",
  117. "ignore_above": 256
  118. }
  119. }
  120. },
  121. "http_ua": {
  122. "type": "text",
  123. "fields": {
  124. "keyword": {
  125. "type": "keyword",
  126. "ignore_above": 256
  127. }
  128. }
  129. },
  130. "http_uri": {
  131. "type": "text",
  132. "fields": {
  133. "keyword": {
  134. "type": "keyword",
  135. "ignore_above": 256
  136. }
  137. }
  138. },
  139. "http_x_forward_for": {
  140. "type": "text",
  141. "fields": {
  142. "keyword": {
  143. "type": "keyword",
  144. "ignore_above": 256
  145. }
  146. }
  147. },
  148. "project": {
  149. "type": "text",
  150. "fields": {
  151. "keyword": {
  152. "type": "keyword",
  153. "ignore_above": 256
  154. }
  155. }
  156. },
  157. "time_local": {
  158. "type": "date"
  159. },
  160. "upsteam_status": {
  161. "type": "text",
  162. "fields": {
  163. "keyword": {
  164. "type": "keyword",
  165. "ignore_above": 256
  166. }
  167. }
  168. },
  169. "upstream_addr": {
  170. "type": "text",
  171. "fields": {
  172. "keyword": {
  173. "type": "keyword",
  174. "ignore_above": 256
  175. }
  176. }
  177. },
  178. "upstream_cache_status": {
  179. "type": "text",
  180. "fields": {
  181. "keyword": {
  182. "type": "keyword",
  183. "ignore_above": 256
  184. }
  185. }
  186. },
  187. "upstream_response_time": {
  188. "type": "text",
  189. "fields": {
  190. "keyword": {
  191. "type": "keyword",
  192. "ignore_above": 256
  193. }
  194. }
  195. }
  196. }
  197. }
  198. }

3. 启动

  1. ./bin/logstash -f config/nginx-access-log.conf --path.data=/data/logs/logstash/nginx-access-log

启动没有报错,es展示工具显示已经有了数据,索引已经生成
ELK部署 - 图27

kibana安装

1.安装下载:

  1. # 一定要下载oss版本的,因为之前安装的es就是oss版本的
  2. https://artifacts.elastic.co/downloads/kibana/kibana-oss-7.10.0-linux-x86_64.tar.gz

2.配置

  1. cd /data/kibana-7.10.0-linux-x86_64/config/
  2. #添加
  3. server.host: "0.0.0.0"
  4. elasticsearch.hosts: ["http://192.168.88.11:9200","http://192.168.88.12:9200","http://192.168.88.11:9300"]


3.启动

  1. /data/kibana-7.10.0-linux-x86_64/bin/kibana

ELK部署 - 图28

4.web配置

打开http://192.168.88.11
ELK部署 - 图29
点explore on my own
ELK部署 - 图30
ELK部署 - 图31
ELK部署 - 图32
我们在es中已经有数据,创建一个索引模式即可查看数据
ELK部署 - 图33
ELK部署 - 图34
ELK部署 - 图35
选择左侧面板的discover,访问一下(http://192.168.88.14)测试页面,最新的3条日志就展示在面板上了
**