目录
1.简介
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。
l Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
l Logstash是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。
l kibana 也是一个开源和免费的工具,他Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web界面,可以帮助您汇总、分析和搜索重要数据日志。
整体数据流程:
图1.1 ELK数据流图
因为子系统和实例远远大于ES数量,所以在ES和收集日志的logstash终端之间添加了Kafka实现缓存。
图1.2 添加kafka实现logstash与ES缓存
日志信息存储量过大,ES只存储1周数据,超过1周的数据存放HIVE。日志大小信息如图1.3
图1.3 ES 普惠日志增长量
普惠信息主要来自三个方面,针对不同的数据采用不同的方法:
安全日志:存储于Oracle数据库。
Oracle---logstash----kafka-----ES----Kibana
应用日志:以txt文档方式存储于应用本地目录。
Txt----logstash(filter)----kafka----ES---Kibana
Nginx访问日志:使用Nginx差价Lua直接推送Kafka
Nginx+lua-----kafka----ES---kibana
1.1. Logstash
logstash是一个数据分析软件,主要目的是分析log日志。数据首先将数据传给logstash,它将数据进行过滤和格式化(转成JSON格式),然后传给Elasticsearch进行存储、建搜索的索引。
图1.4 Logstash数据处理流程
1.2. ElasticSearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
1.3. Kibana
Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。可进行搜索、查看、交互存放在Elasticsearch索引里的数据,使用各种不同的图表、表格、地图等kibana能够很轻易地展示高级数据分析与可视化。
1.4. Kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消费。
1.5. Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
图1.5 Zookeeper 工作原理
1.6. Lua
Lua 是一个小巧的脚本语言。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。
1.7. Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
2.本机环境搭建
ELK 所有组件均只依赖Java 就可以运行,所以在部署方面相对比较简单。
本章先介绍使用本机直接安装ELK,再建此环境移植到Docker环境,待后期使用Mesos或Openshift统一调用管理。
生产环境无法联网,请自行下载到本地目录后上传,科技有封装好的ZK和Kafka,可以考虑使用。
组件多数依赖Java,先安装Java再安装其他组件,各组件列表及其下载地址:
JDK
ElasticSearch,Logstash,Kibana,X-pack
Kafka:
Zookeeper
本地资源:
本地环境:测试环境。
直接将各组件搭建在本地机器,测试其可用性。
生产环境:
Es-node01 | 192.168.0.1 | 8核/32.0GB | Centos7.2 | elastic | ES-node01,ansible |
Es-node02 | 192.168.0.2 | 8核/32.0GB | Centos7.2 | elastic | ES-node02 |
Es-node03 | 192.168.0.3 | 8核/32.0GB | Centos7.2 | elastic | ES-node03 |
Es-node04 | 192.168.0.4 | 8核/32.0GB | Centos7.2 | elastic | ES-node04 |
Es-node05 | 192.168.0.5 | 8核/32.0GB | Centos7.2 | elastic | ES-node05 |
2.1. 系统初始化
系统初始化:
添加组:方便统一,添加组id
groupadd -g 4567 elk ansible kafka -m shell -a 'groupadd -g 4567 elk ' |
添加用户:
useradd -G elk -u 1234 kafka ansible kafka -m shell -a 'useradd -G elk -u 1234 kafka ' |
初始化密码:
echo ***** | passwd kafka --stdin ansible kafka -m shell -a 'echo ****** | passwd kafka --stdin ' ansible es -m shell -a 'echo ****** | passwd elastic --stdin ' ansible logstash -m shell -a 'echo ****** | passwd logstash --stdin ' |
创建kafka数据/日志路径:
mkdir /mnt/data{1..4}/kafka/data -p ansible kafka -m shell -a 'mkdir /mnt/data{1..4}/kafka/data -p ' ansible kafka -m shell -a 'mkdir /mnt/data1/kafka/logs -p ' |
创建zookeeper数据/日志路径:
mkdir /mnt/data1/zookeeper/logs -p ansible kafka -m shell -a 'mkdir /mnt/data1/zookeeper/logs -p ' ansible kafka -m shell -a 'mkdir /mnt/data{1..4}/zookeeper/data -p ' |
创建软件路径:
mkdir /var/soft -p ansible kafka -m shell -a ' mkdir /var/soft –p’ |
2.2. JDK 安装
1. 远程登录服务器,创建业务用户:
$ ssh [root@es-node01 ~]# groupadd elk [root@es-node01 ~]# useradd elastic –b /wls/ -G elk [root@es-node01 ~]# echo ****** |passwd elastic --stdin 更改用户 elastic 的密码 。 passwd: 所有的身份验证令牌已经成功更新。 |
重复以上动作,在所有主机添加用户。
2. 切换用户。
[root@es-node01 ~]# su - elastic |
3. JDK安装
下载并上传jdk包至服务器。因为数据包过大,请使用跳板机上传。此处省略过程。
[root@es-node01 ~]# wget -O /var/soft/jdk1.8.0_131.tar.gz |
进入安装目录,解压包,并设置PATH路径
[root@es-node01 ~]$ cd /var/soft [root@es-node01 ~]$ tar –zxvf jdk1.8.0_131.tar.gz [root@es-node01 ~]$ vim ~/.bash_profile #修改PATH路径,并设置开机运行 JAVA_HOME=/wls/elk/jdk1.8.0_131 PATH=$JAVA_HOME/binPATH [root@es-node01 ~]$ source ~/.bash_profile [root@es-node01 ~]$ java –version #确认Java版本是否可用 java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) [root@es-node01 ~]$ which java #确认是否为Java 路径 /wls/elk/jdk1.8.0_131/bin/java [root@es-node01 ~]$ |
2.3. ElasticSearch
ElasticSearch只依赖JAVA,直接解压,修改配置就好。
ES有很多可用插件,但是离线真的很难安装,直接放弃,对于我们这种专业的运维,直接使用curl操作。
1. 上传解压
[root@es-node01 ~]$ wget -O /var/soft/elasticsearch-6.0.0.tar.gz http://http://mirrors-ph.paic.com.cn//repo/elk/elasticsearch-6.0.0.tar.gz [root@es-node01 ~]$ cd /var/soft [root@es-node01 ~]$ tar -zxvf tools/elasticsearch-6.0.0.tar.gz |
2. 修改配置
可以参考配置文件:
查看系统配置,存储数据地址:
创建文件位置
[root@es-node01 soft]#df -Th /dev/mapper/VolGroup1-LVdata1 xfs 500G 33M 500G 1% /mnt/data2 /dev/mapper/VolGroup2-LVdata2 xfs 500G 33M 500G 1% /mnt/data1 [root@es-node01 soft]#mkdir /mnt/data{1..2}/elasticsearch/data –p [root@es-node01 soft]#mkdir /mnt/data1/elasticsearch/logs –p [root@es-node01 soft]#chown elastic:elk /mnt/data* -R |
修改配置:
[root@es-node01 soft]#cat /config/elasticsearch.yml cluster.name: ph-elk #集群名 node.name: es-node01 #主机名 path.data: /mnt/data1/elasticsearch/data,/mnt/data2/elasticsearch/data #数据路径,多文件用逗号 path.logs: /mnt/data1/elasticsearch/logs #log 路径 network.host: 0.0.0.0 #可访问机器 http.port: 9200 #端口 discovery.zen.ping.unicast.hosts: ["192.168.0.1","192.168.0.2","192.168.0.3","192.168.0.4","192.168.0.5"] #其他机器 xpack.ssl.key: certs/${node.name}/${node.name}.key #x-pack 认证证书路径 xpack.ssl.certificate: certs/${node.name}/${node.name}.crt #机器私钥 xpack.ssl.certificate_authorities: certs/ca/ca.crt #集群CA证书 xpack.security.transport.ssl.enabled: true #开启xpack功能 |
Jvm 配置根据机器配置修改:
[root@es-node01 soft]#cat config/jvm.options -Xms28g -Xmx28g |
3. 启动验证
[root@es-node01 soft]# bin/elasticsearch [2018-03-29T11:02:42,296][INFO ][o.e.b.BootstrapChecks ] [es-node01] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks ERROR: [1] bootstrap checks failed [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] |
此报错使用root修改vm.max_map_count
[root@es-node01 soft]# sysctl -w vm.max_map_count=20000000 vm.max_map_count = 20000000 |
再次启动
[root@es-node01 soft]# bin/elasticsearch –d [2018-03-29T11:06:32,320][INFO ][o.e.n.Node ] [es-node01] initializing ... [2018-03-29T11:06:32,390][INFO ][o.e.e.NodeEnvironment ] [es-node01] using [2] data paths, mounts [[/mnt/data1 (/dev/mapper/VolGroup2-LVdata2), /mnt/data2 (/dev/mapper/VolGroup1-LVdata1)]], net usable_space [999.4gb], net total_space [999.5gb], types [xfs] [2018-03-29T11:06:32,391][INFO ][o.e.e.NodeEnvironment ] [es-node01] heap size [27.9gb], compressed ordinary object pointers [true] [2018-03-29T11:06:32,392][INFO ][o.e.n.Node ] [es-node01] node name [es-node01], node ID [6o6WyURiRdeargHwqbGWag] [2018-03-29T11:06:32,392][INFO ][o.e.n.Node ] [es-node01] version[6.0.0], pid[48441], build[8f0685b/2017-11-10T18:41:22.859Z], OS[Linux/3.10.0-693.17.1.el7.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_131/25.131-b11] [2018-03-29T11:06:32,392][INFO ][o.e.n.Node ] [es-node01] JVM arguments [-Xms28g, -Xmx28g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -XX:+HeapDumpOnOutOfMemoryError, -Des.path.home=/var/soft/elasticsearch-6.0.0, -Des.path.conf=/var/soft/elasticsearch-6.0.0/config] [2018-03-29T11:06:33,353][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [aggs-matrix-stats] [2018-03-29T11:06:33,353][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [analysis-common] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [ingest-common] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [lang-expression] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [lang-mustache] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [lang-painless] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [parent-join] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [percolator] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [reindex] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [repository-url] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [transport-netty4] [2018-03-29T11:06:33,354][INFO ][o.e.p.PluginsService ] [es-node01] loaded module [tribe] [2018-03-29T11:06:33,355][INFO ][o.e.p.PluginsService ] [es-node01] loaded plugin [x-pack] |
验证:
[root@kafka-node5 ~]# curl { "name" : "es-node01", "cluster_name" : "ph-elk", "cluster_uuid" : "x2oARQMlQoqMPTYXT4MeGw", "version" : { "number" : "6.0.0", "build_hash" : "8f0685b", |
4. 安装x-pack
[root@es-node01 soft]# wget http://http://mirrors-ph.paic.com.cn//repo/elk/x-pack-6.0.0.zip [root@es-node01 soft]# bin/elasticsearch-plugin install file:///var/soft/elasticsearch-6.0.0/x-pack-6.0.0.zip -> Downloading file:///var/soft/elasticsearch-6.0.0/x-pack-6.0.0.zip [=================================================] 100%聽聽 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: plugin requires additional permissions @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ * 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.net.SocketPermission * connect,accept,resolve * 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 See for descriptions of what these permissions allow and the associated risks. Continue with installation? [y/N]y @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: plugin forks a native controller @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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 |
5. 生成认证秘钥
[elastic@es-node01 x-pack]$ bin/x-pack/certgen Please enter the desired output file [certificate-bundle.zip]: ph-elk Enter instance name: es-node01 Enter name for directories and files [es-node01]: Enter IP Addresses for instance (comma-separated if more than one) []: 192.168.0.1 |
6. 解压秘钥
[elastic@es-node01 config]$ mkdir certs [elastic@es-node01 config]$ cd certs/ [elastic@es-node01 certs]$ unzip ../ph-elk.zip Archive: ../ph-elk.zip creating: ca/ inflating: ca/ca.crt inflating: ca/ca.key creating: es-node01/ inflating: es-node01/es-node01.crt inflating: es-node01/es-node01.key creating: es-node02/ inflating: es-node02/es-node02.crt inflating: es-node02/es-node02.key creating: es-node03/ inflating: es-node03/es-node03.crt inflating: es-node03/es-node03.key creating: es-node04/ inflating: es-node04/es-node04.crt inflating: es-node04/es-node04.key creating: es-node05/ inflating: es-node05/es-node05.crt inflating: es-node05/es-node05.key |
7. 密码初始化
[root@es-node01 soft]#cd bin/x-pack [elastic@es-node01 x-pack]$ ./setup-passwords interactive Initiating the setup of reserved user elastic,kibana,logstash_system passwords. You will be prompted to enter passwords as the process progresses. Please confirm that you would like to continue [y/N]y Enter password for [elastic]: Reenter password for [elastic]: Enter password for [kibana]: Reenter password for [kibana]: Enter password for [logstash_system]: Reenter password for [logstash_system]: Changed password for user [kibana] Changed password for user [logstash_system] Changed password for user [elastic] [elastic@es-node01 x-pack]$ |
重启验证。恭喜恭喜
[elastic@es-node01 x-pack]$ curl -u elastic Enter host password for user 'elastic':******* { "name" : "es-node01", "cluster_name" : "ph-elk", "cluster_uuid" : "x2oARQMlQoqMPTYXT4MeGw", "version" : { "number" : "6.0.0", "build_hash" : "8f0685b", "build_date" : "2017-11-10T18:41:22.859Z", "build_snapshot" : false, "lucene_version" : "7.0.1", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" } |
2.4. Kibana
Kibana 安装依赖java,下载安装即可。
[root@es-node01 soft]# wget -O /var/soft/kibana-6.0.0-linux-x86_64.tar.gz http://http://mirrors-ph.paic.com.cn//repo/elk/kibana-6.0.0-linux-x86_64.tar.gz --2018-03-29 13:13:42-- http://http://mirrors-ph.paic.com.cn//repo/elk/kibana-6.0.0-linux-x86_64.tar.gz 正在连接 http://mirrors-ph.paic.com.cn/:80... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:62681301 (60M) [application/octet-stream] 正在保存至: “/var/soft/kibana-6.0.0-linux-x86_64.tar.gz” 100%[================================================================================================================================>] 62,681,301 36.1MB/s 用时 1.7s 2018-03-29 13:13:44 (36.1 MB/s) - 已保存 “/var/soft/kibana-6.0.0-linux-x86_64.tar.gz” [62681301/62681301]) [root@es-node01 soft]# |
解压
[root@es-node01 soft]# cd /var/soft/ [root@es-node01 soft]# tar zxv kibana-6.0.0-linux-x86_64.tar.gz |
修改配置
[root@es-node01 soft]# cat ../config/kibana.yml|egrep -v "^#|$?" server.port: "5601" server.host: "0.0.0.0" server.name: "es-node01" elasticsearch.url: "http://127.0.0.1:9200" elasticsearch.username: "kibana" elasticsearch.password: "kibana" |
启动验证
[root@es-node01 soft]# bin/kibana |
访问页面,恭喜恭喜:http://kibana_server:5601
2.5. zookeeper
服务器列表:
kafka-node1 | 192.168.0.6 | 8核/32.0GB | Centos7.2 | Kafka-node1 |
kafka-node2 | 192.168.0.7 | 8核/32.0GB | Centos7.2 | Kafka-node2 |
kafka-node3 | 192.168.0.8 | 8核/32.0GB | Centos7.2 | Kafka-node3 |
kafka-node4 | 192.168.0.9 | 8核/32.0GB | Centos7.2 | Kafka-node4 |
kafka-node5 | 192.168.0.10 | 8核/32.0GB | Centos7.2 | Kafka-node5 |
安装jdk,参考以前步骤。
ansible kafka -m shell -a 'wget -O /var/soft/jdk1.8.0_131.tar.gz ' ansible kafka -m shell -a 'cd /var/soft ; tar zxf jdk1.8.0_131.tar.gz' |
下载zookeeper包:
URL: http://http://mirrors-ph.paic.com.cn//repo/elk/zookeeper-3.4.6.tar.gz
wget -O /var/soft/zookeeper-3.4.6.tar.gz wget -O /var/soft/kafka_2.11-0.10.2.1.tar.gz http://http://mirrors-ph.paic.com.cn//repo/elk/kafka_2.11-0.10.2.1.tar.gz |
解压:
ansible kafka -m shell -a 'cd /var/soft; tar xf zookeeper-3.4.6.tar.gz' ansible kafka -m shell -a 'cd /var/soft; tar zxf kafka_2.11-0.10.2.1.tar.gz' |
修改配置:
[root@es-node01 conf]# cat conf/zoo.cfg |egrep -v "^#|^$" tickTime=2000 initLimit=10 syncLimit=5 dataDir=/mnt/data1/zookeeper/data dataLogDir=/mnt/data1/zookeeper/logs clientPort=2181 maxClientCnxns=300 autopurge.snapRetainCount=20 autopurge.purgeInterval=48 server.1=192.168.0.6:2888:3888 server.2=192.168.0.7:2888:3888 server.3=192.168.0.8:2888:3888 server.4=192.168.0.9:2888:3888 server.5=192.168.0.10:2888:3888 |
同步配置文档:使用ansible统一分发(方便)。
[root@es-node01 conf]# ansible kafka -m copy -a "src=/var/soft/zookeeper-3.4.6/conf/zoo.cfg dest=/var/soft/zookeeper-3.4.6/conf/" kafka-node3 | SUCCESS => { "changed": true, "checksum": "3c05364115536c3b645bc7222df883b341d50c83", "dest": "/var/soft/zookeeper-3.4.6/conf/zoo.cfg", "gid": 0, "group": "root", "md5sum": "ded548de08fa7afda587162df935cdcd", "mode": "0644", "owner": "root", "size": 1163, "src": "/root/.ansible/tmp/ansible-tmp-1522724739.95-275544206529433/source", "state": "file", "uid": 0 } |
修改权限
[root@es-node01 conf]# ansible kafka -m shell -a 'chown kafka:elk /var/soft' [WARNING]: Consider using file module with owner rather than running chown kafka-node3 | SUCCESS | rc=0 >> kafka-node5 | SUCCESS | rc=0 >> kafka-node4 | SUCCESS | rc=0 >> kafka-node2 | SUCCESS | rc=0 >> kafka-node1 | SUCCESS | rc=0 >> [root@es-node01 conf]# ansible kafka -m shell -a 'chown kafka:elk /mnt/data* -R ' |
启动查看
[root@es-node01 conf]# ansible kafka -m shell -u kafka -a '/var/soft/zookeeper-3.4.6/bin/zkServer.sh start ' [root@es-node01 conf]# ansible kafka -m shell -u kafka -a '/var/soft/zookeeper-3.4.6/bin/zkServer.sh status' |
如下报错:
[kafka@kafka-node1 ~]$ cat zookeeper.out 2018-04-03 11:19:53,751 [myid:] - INFO [mainuorumPeerConfig@103] - Reading configuration from: /var/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg 2018-04-03 11:19:53,760 [myid:] - INFO [mainuorumPeerConfig@340] - Defaulting to majority quorums 2018-04-03 11:19:53,763 [myid:] - ERROR [mainuorumPeerMain@85] - Invalid config, exiting abnormally org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing /var/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:123) at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:101) at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78) Caused by: java.lang.IllegalArgumentException: /mnt/data1/zookeeper/data/myid file is missing at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:350) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:119) ... 2 more |
添加对应的ID号到此文件:
ServerName | IP | MYID |
kafka-node1 | 192.168.0.6 | 1 |
kafka-node2 | 192.168.0.7 | 2 |
kafka-node3 | 192.168.0.8 | 3 |
kafka-node4 | 192.168.0.9 | 4 |
kafka-node5 | 192.168.0.10 | 5 |
更新myid
ansible kafka-node1 -m shell -u kafka -a 'echo 1 >/mnt/data1/zookeeper/data/myid' ansible kafka-node2 -m shell -u kafka -a 'echo 2 >/mnt/data1/zookeeper/data/myid' ansible kafka-node3 -m shell -u kafka -a 'echo 3 >/mnt/data1/zookeeper/data/myid' ansible kafka-node4 -m shell -u kafka -a 'echo 4 >/mnt/data1/zookeeper/data/myid' ansible kafka-node5 -m shell -u kafka -a 'echo 5 >/mnt/data1/zookeeper/data/myid' |
重启验证:
一台leader其他均为follower即可。
[root@es-node01 ~]# ansible kafka -m shell -u kafka -a '/var/soft/zookeeper-3.4.6/bin/zkServer.sh restart ' [root@es-node01 ~]# ansible kafka -m shell -u kafka -a '/var/soft/zookeeper-3.4.6/bin/zkServer.sh status ' kafka-node5 | SUCCESS | rc=0 >> Mode: leaderJMX enabled by default Using config: /var/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg kafka-node4 | SUCCESS | rc=0 >> Mode: followerJMX enabled by default Using config: /var/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg kafka-node3 | SUCCESS | rc=0 >> Mode: followerJMX enabled by default Using config: /var/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg kafka-node2 | SUCCESS | rc=0 >> Mode: followerJMX enabled by default Using config: /var/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg kafka-node1 | SUCCESS | rc=0 >> Mode: followerJMX enabled by default Using config: /var/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg |
2.6. kafka
和zk同样的五台机器。
下载解压:
wget -O /var/soft/kafka_2.11-0.10.2.1.tar.gz |
解压,修改配置文档:
以下标记部分配置每台不同
[root@es-node01 config]# cat server.properties |egrep -v "^$|^#" broker.id=1 delete.topic.enable=true host.name=kafka-node1 listeners=PLAINTEXT:/192.168.0.6/:9092 advertised.listeners=PLAINTEXT://192.168.0.6: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=/mnt/data1/kafka/data,/mnt/data2/kafka/data,/mnt/data3/kafka/data,/mnt/data4/kafka/data num.partitions=3 num.recovery.threads.per.data.dir=1 log.flush.interval.messages=10000 log.flush.interval.ms=1000 log.retention.hours=72 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 min.insync.replicas=2 num.replica.fetchers=2 zookeeper.connect=192.168.0.6:2181,192.168.0.7:2181,192.168.0.8:2181,192.168.0.9:2181,192.168.0.10:2181 zookeeper.connection.timeout.ms=6000 |
调整JVM参数,开启JMX监控功能。
[root@es-node01 config]# vim bin/kafka-server-start.sh if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then export KAFKA_HEAP_OPTS="-Xmx24G -Xms24G" export JMX_PORT="9999" |
同步配置到其他机器:记得修改上面×××部分配置。
[root@kafka-node1 bin]# ansible kafka -m copy -a "src=/var/soft/kafka_2.11-0.10.2.1/config/server.properties dest=/var/soft/kafka_2.11-0.10.2.1/config/ owner=kafka group=elk" [root@kafka-node1 bin]# ansible kafka -m copy -a "src=/var/soft/kafka_2.11-0.10.2.1/bin/kafka-server-start.sh dest=/var/soft/kafka_2.11-0.10.2.1/bin/ owner=kafka group=elk" |
启动查看:
[root@es-node01 config]# ansible kafka -m shell -u kafka -a "/var/soft/kafka_2.11-0.10.2.1/bin/kafka-server-start.sh -daemon /var/soft/kafka_2.11-0.10.2.1/config/server.properties" kafka-node3 | SUCCESS | rc=0 >> kafka-node4 | SUCCESS | rc=0 >> kafka-node5 | SUCCESS | rc=0 >> kafka-node2 | SUCCESS | rc=0 >> kafka-node1 | SUCCESS | rc=0 >> |
进入一台kafka服务器,测试kafka是否可用。
创建topic
[kafka@kafka-node1 var]$ kafka-topics.sh -create –zookeeper 192.168.0.6:2181,192.168.0.7:2181,192.168.0.8:2181,192.168.0.9:2181,192.168.0.10:2181 -topic ELK.TEST -replication-factor 2 -partition 3 |
查看topic列表
kafka@kafka-node1 var]kafka-topics.sh -zookeeper 192.168.0.6:2181,192.168.0.7:2181,192.168.0.8:2181,192.168.0.9:2181,192.168.0.10:2181 -list ELK.TEST |
创建productor
[kafka@kafka-node1 var]$ kafka-console-producer.sh --broker-list 192.168.0.6:9092,192.168.0.7:9092,192.168.0.8:9092,192.168.0.9:9092,192.168.0.10:9092 --topic ELK.TEST |
创建consumer
开另外一台机器开启consumer,并在productor 输入信息,看是否能够同步
[kafka@kafka-node5 ~]$ kafka-console-consumer.sh --zookeeper 192.168.0.6:2181,192.168.0.7:2181,192.168.0.8:2181,192.168.0.9:2181,192.168.0.10:2181 --topic ELK.TEST Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper]. aaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaa |
删除topic
kafka-topics.sh --delete --zookeeper 192.168.0.6:2181,192.168.0.7:2181,192.168.0.8:2181,192.168.0.9:2181,192.168.0.10:2181 --topic ELK.TEST |
查看topic内容
kafka-console-consumer.sh --bootstrap-server 192.168.0.6:9092,192.168.0.7:9092,192.168.0.8:9092,192.168.0.9:9092,192.168.0.10:9092 --topic ELK.TEST --from-beginning --max-messages 10000 |
查看消费情况
kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --group PH-SAFE --topic ELK.TEST --zookeeper 192.168.0.6:2181,192.168.0.7:2181,192.168.0.8:2181,192.168.0.9:2181,192.168.0.10:2181 |
以上操作均无问题,那么kafka、ZK 搭建OK。恭喜恭喜。
2.7logstash
Kafka-----ES 的logstash 使用docker去运行。已经做好docker images。修改配置,运行就好。
主机列表:
SZC-L0093638 | 30.18.32.231 | 8核/32.0GB | LINUX | Logstash-1 |
SZC-L0093637 | 30.18.32.230 | 8核/32.0GB | LINUX | Logstash-2 |
运行命令:
docker run -d -it \ -h ELK-TEST \ --name ELK-TEST \ --restart=on-failure:2 \ --net=host \ -v /etc/ bash Bash 可以更换为启动命令。 logstash -w 1 -f /usr/local/logstash-6.0.0/config/ph-safe.conf |
配置参考
3.Docker环境搭建
云主机名称 | 内网IP | 配置 | 操作系统 | 用户 | 安装组件 |
SZC-L0080585 | 30.18.32.54 | 8核/32.0GB | LINUX7.2 | root | es-elk-1,zk-elk-1,kafka-elk-1,kabana-elk-1 |
SZC-L0080587 | 30.18.32.55 | 8核/32.0GB | LINUX7.2 | root | es-elk-2,zk-elk-2,kafka-elk-2,kabana-elk-2 |
SZC-L0080583 | 30.18.32.56 | 8核/32.0GB | LINUX7.2 | root | es-elk-3,zk-elk-3,kafka-elk-3 |
SZC-L0080586 | 30.18.32.58 | 8核/32.0GB | LINUX7.2 | root | es-elk-4,zk-elk-4,kafka-elk-4 |
SZC-L0080584 | 30.18.32.59 | 8核/32.0GB | LINUX7.2 | root | es-elk-5,zk-elk-5,kafka-elk-5 |
4.案例4.1. logstash获取应用日志。
后续更新
4.2. logstash获取Oracle数据:员工行为分析
4.3. Nginx+Lua 获取网页访问记录
附录Ⅰ配置列表
附录Ⅱ x-pack破解
x-pack 破解方法,亲测有效,按照步骤来就可以。
1.下载x-pack-6.0.0.zip 包
2.创建一个文件夹,解压压缩包。
elasticsearch]# #mkdir /x-pack elasticsearch]# #cd /x-pack elasticsearch]# #unzip ../x-pack-6.0.0.zip elasticsearch]# #cd elasticsearch elasticsearch]# file x-pack-6.0.0.jar x-pack-6.0.0.jar: Zip archive data, at least v1.0 to extract elasticsearch]# mkdir x-pack-6.0.0 elasticsearch]#cd x-pack-6.0.0 x-pack-6.0.0]#unzip ../x-pack-6.0.0.jar |
4. 寻找license判定代码:LicenseVerifier.class。
x-pack-6.0.0]# find -name LicenseVerifier.class ./org/elasticsearch/license/LicenseVerifier.class |
5. 找一个目录创建LicenseVerifier.java
#mkdir /tmp/test #cd /tmp/test/ #vim LicenseVerifier.java #别人已经反编译成功,拿来用就可以。 |
package org.elasticsearch.license; public class LicenseVerifier { public static boolean verifyLicense(final License license, final byte[] encryptedPublicKeyData) { return true; } public static boolean verifyLicense(final License license) { return true; } } |
6. 编译。我的安装路径为/usr/local/elasticsearch-6.0.0
javac -cp "/usr/local/elasticsearch-6.0.0/lib/elasticsearch-6.0.0.jar:/usr/local/elasticsearch-6.0.0/lib/lucene-core-7.0.1.jar:/usr/local/elasticsearch-6.0.0/plugins/x-pack/x-pack-6.0.0.jar" LicenseVerifier.java |
7. 更新代码包并替换。
#rm /usr/local/elasticsearch-6.0.0/plugins/x-pack/x-pack-6.0.0.jar #rm /x-pack/elasticsearch/x-pack-6.0.0.jar #rm /x-pack/elasticsearch/x-pack-6.0.0/org /elasticsearch/license/LicenseVerifier.class #cp /tmp/test/LicenseVerifier.class /x-pack-6.0.0/x-pack-6.0.0/org/elasticsearch/license/ |
8. 重新打包压缩
#cd /x-pack/x-pack-6.0.0/ #jar -cvf x-pack-6.6.0.jar ./* |
9. 覆盖确认:查看修改时间是否OK。
#cp x-pack-6.6.0.jar /usr/local/elasticserver-6.0.0/plugins/x-pack/x-pack-6.6.0.jar #ls –al /usr/local/elasticserver-6.0.0/plugins/x-pack/x-pack-6.6.0.jar |
10. 查看_license
$ curl -u elastic:******* { "license" : { "status" : "active", "uid" : "b7d9fe72-926a-453d-bba4-1932b7c2d6a8", "type" : "trial", "issue_date" : "2018-03-29T03:06:40.711Z", "issue_date_in_millis" : 1522292800711, "expiry_date" : "2018-04-28T03:06:40.711Z", "expiry_date_in_millis" : 1524884800711, "max_nodes" : 1000, "issued_to" : "ph-elk", "issuer" : "elasticsearch", "start_date_in_millis" : -1 } } |
10.重启elastic和kibana。
11.官网申请license
访问网站:
{"license":{"uid":"c127f207-c8f6-4d71-8b89-21f350f7d284","type":"platinum","issue_date_in_millis":1514160000000,"expiry_date_in_millis":2524579200999,"max_nodes":100,"issued_to":"Maoshu Ran (Pingan)","issuer":"Web Form","signature":"AAAAAwAAAA3nC1a1H/RvS9soHXxIAAABmC9ZN0hjZDBGYnVyRXpCOW5Bb3FjZDAxOWpSbTVoMVZwUzRxVk1PSmkxaktJRVl5MUYvUWh3bHZVUTllbXNPbzBUemtnbWpBbmlWRmRZb25KNFlBR2x0TXc2K2p1Y1VtMG1UQU9TRGZVSGRwaEJGUjE3bXd3LzRqZ05iLzRteWFNekdxRGpIYlFwYkJiNUs0U1hTVlJKNVlXekMrSlVUdFIvV0FNeWdOYnlESDc3MWhlY3hSQmdKSjJ2ZTcvYlBFOHhPQlV3ZHdDQ0tHcG5uOElCaDJ4K1hob29xSG85N0kvTWV3THhlQk9NL01VMFRjNDZpZEVXeUtUMXIyMlIveFpJUkk2WUdveEZaME9XWitGUi9WNTZVQW1FMG1DenhZU0ZmeXlZakVEMjZFT2NvOWxpZGlqVmlHNC8rWVVUYzMwRGVySHpIdURzKzFiRDl4TmM1TUp2VTBOUlJZUlAyV0ZVL2kvVk10L0NsbXNFYVZwT3NSU082dFNNa2prQ0ZsclZ4NTltbU1CVE5lR09Bck93V2J1Y3c9PQAAAQAtob2KBeFwY2nMY7RkxDKEoskFqTtTvvVCPCJAFDsRsz+OdlLfbnAQF2hj32nGTZ/HTDbCa6GXIEkKce6rxMC92JtZ37Fh96uenccS+OdbnHeoDnnLcRmCR7k031hVgcGyKHHv5W1+VhSw54IY8vPpuaz2e7Ggul/9V6RwzxNXeWEdIAKabTUp2Gg48UZ+WKUKM2FuoWHRdszMFxu0W+oU2aJCnHkX87AjL3ed94sqZBW0GdiU1dMJI3HmMoWdYy3gaPkq/xI73GVM0A/kE0p+Q+cmB9PSANIV/YS47ygD2VjmXOptjkaWmvbAopNCqxE4yB4TdlcaH7G/doPHc+zi","start_date_in_millis":1514160000000}} |
11. 修改license字段:
"type":"platinum" "expiry_date_in_millis":2524579200999 |
12. 更新license
#curl -XPUT -u elastic:changeme 'http://127.0.0.1:9200/_xpack/license?acknowledge=true' -H "Content-Type: application/json" -d @license.json {"acknowledged":true,"license_status":"invalid"} |
13. 确认是否OK
#curl -XPUT -u elastic:****** { "license": { "status": "active", "uid": "c127f207-c8f6-4d71-8b89-21f350f7d284", "type": "platinum", "issue_date": "2017-12-25T00:00:00.000Z", "issue_date_in_millis": 1514160000000, "expiry_date": "2049-12-31T16:00:00.999Z", "expiry_date_in_millis": 2524579200999, "max_nodes": 100, "issued_to": "Maoshu Ran (Pingan)", "issuer": "Web Form", "start_date_in_millis": 1514160000000 } } |
备注: 破解步骤前期1----9 已经完成,生产的jar包位置:
copy到elasticsearch,重启服务,更新license即可