首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手动从零使用ELK构建一套搜索服务

手动从零使用ELK构建一套搜索服务

作者头像
我是攻城师
发布2018-05-14 16:36:38
7520
发布2018-05-14 16:36:38
举报
文章被收录于专栏:我是攻城师我是攻城师

前言

这两天需要对接一个新的搜索业务,由于测试机器还没到位,所以就自己创造条件,通过在Windows上安装VM虚拟机,模拟整套环境,从而能快速进入核心业务的开发测试状态中。

系统环境安装配置

虚拟机VMware Workstation Pro 12

云盘下载地址:https://pan.baidu.com/s/1hrWx76k

序列号:FF1JR-AZGE6-480UP-1PPXV-W38TA

Centos7 minimal镜像iso

下载地址:http://mirror.bit.edu.cn/centos/7/isos/x86_64/

网络模式 :使用桥接模式

启动虚拟机加载镜像后,第一件事配置静态ip,centos7方法如下:

(1) 编辑 网卡文件 vi /etc/sysconfig/network-scripts/ifcfg-eno16777736 (2)修改IP并保存 TYPE=Ethernet //改动为静态 BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no //新增静态ip地址 IPADDR=192.168.10.39 IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=eno16777736 UUID=c541e86c-324f-4761-8ddc-5531d75dc0b7 DEVICE=eno16777736 NAME=eno16777736 //改动为yes ONBOOT=yes (3)配置网关和网络

编辑network文件,执行如下命令 vi /etc/sysconfig/network 新增内容 #新增 NETWORKING=yes #新增 HOSTNAME=es1 #新增 GATEWAY=192.168.10.200

注意这个网关地址,可在windows里面看到

最后在确认下DNS即可: cat /etc/resolv.conf 和上面IPv4的两个DNS一致即可: nameserver 192.168.10.200 nameserver 192.168.10.1

最后,重启网卡即可: systemctl restart network.service 然后ping 一个域名测试通过即可: [root@es3 ~]# ping www.taobao.com PING www.taobao.com.danuoyi.tbcache.com (61.135.144.254) 56(84) bytes of data. 64 bytes from 61.135.144.254: icmp_seq=1 ttl=50 time=3.66 ms 64 bytes from 61.135.144.254: icmp_seq=2 ttl=50 time=3.45 ms 64 bytes from 61.135.144.254: icmp_seq=3 ttl=50 time=3.83 ms 64 bytes from 61.135.144.254: icmp_seq=4 ttl=50 time=3.61 ms 64 bytes from 61.135.144.254: icmp_seq=5 ttl=50 time=3.67 ms

最后关于mini版的centos7系统,一些常用命令如下: ““ //1 安装centos6.x存在的网络包,gcc编译,ntp时间同步服务,防火墙 yum install -y net-tools gcc ntp firewalld lrzsz //2 关闭禁用防火墙 systemctl stop firewalld && systemctl disable firewalld //3 ntp时间同步可使用中国或美国的标准时间 ntpdate us.pool.ntp.org ntpdate cn.pool.ntp.org //4 设置主机名 hostnamectl set-hostname “name” //5 设置文件描述符 vi /etc/security/limits.conf //6 追加如下内容 * soft nofile 65535 * hard nofile 65535 //7 设置一些别名 vi .bash_profile //8 添加内容 alias vi=”vim”

““

(4)配置SSH //生成公钥 ssh-keygen -t rsa -P '' //传输认证 ssh-copy-id -i .ssh/id_rsa.pub 10.171.92.147

(5)新建search用户,并给与sudo权限 ““ useradd search //添加用户 passwd search // 修改密码 // 赋予sudo权限,编译sudoers文件 vi /etc/sudoers //在root ALL=(ALL) ALL 下面添加权限,并不需要密码就能使用sudo search ALL=(ALL) NOPASSWD: ALL

““

软件环境安装配置

框架

下载地址

JDK8

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Logstash2.3.4

https://www.elastic.co/downloads

Elasticsearch2.3.4

https://www.elastic.co/downloads

Kibana4.5.3

https://www.elastic.co/downloads

JDK变量在当前用户的根目录下,编辑.bash_profile文件加入下面的内容 ““ vi .bash_profile // 加入下面的变量

export PATH export PATH=.:$PATH

//jdk export JAVA_HOME=/home/search/jdk1.8.0_102/ export CLASSPATH=.:$JAVA_HOME/lib export PATH=$JAVA_HOME/bin:$PATH ““

有关ELK的安装,这里不再详细描述,可参考前面的文章 http://qindongliang.iteye.com/blog/2250776

安装的插件 ““ //==================logstash的插件================== //kafka bin/logstash-plugin logstash-input-kafka bin/logstash-plugin logstash-output-kafka //ruby代码中,由于要连接redis读取对应的kv数据,所以还需要 //ruby安装redis客户端,注意这个不是logstash-input-redis插件 cd /home/search/logstash-2.3.4/vendor/jruby/bin //为了保险安装ruby和jruby下面的redis插件 gem install redis jgem install redis

//==================ElasticSearch的插件================== //head bin/plugin install mobz/elasticsearch-head //marvel bin/plugin install license bin/plugin install marvel-agent

//==================Kibana的插件================== bin/kibana plugin –install elasticsearch/marvel/2.3.4

““

一些使用案例

(1)Logstash读取Kakfa数据并写入Elasticsearch的conf配置: ““ input{ kafka{ zk_connect=>”node3-kafka.net” topic_id=>’pt_userlog’ codec => plain consumer_id => “192.168.10.38” group_id=> “logstash” rebalance_backoff_ms=>5000 rebalance_max_retries=>10 } }

filter { ruby { code => ” temp=event[‘message’].split(‘–’) ;

event[‘t1’]= temp[0]

common_attr=event[‘t1’].split(’ ‘)

event[‘y_time’]=common_attr[0]+’ ‘+common_attr[1]

event[‘ip’]=common_attr[2] event[‘module’]=common_attr[3] event[‘t2’]= temp[1].strip ” }

json{ source => “t2” }

date{ match => [“y_time”,”yyyy-MM-dd HH:mm:ss.SSS”] remove_field => [ “y_time”,”t1”,”t2”,”message” ] }

ruby{ code=>” event[‘primary_module’]=event[‘actId’][0,2] event[‘second_module’]=event[‘actId’][0,4] ” } }

output{ elasticsearch{ index => “userlog-%{+YYYYMM}” hosts=> [“192.168.10.38:9200”,”192.168.10.39:9200”,”192.168.10.40:9200”] manage_template => false template_name => “userlog” } stdout { codec => rubydebug } } ““

(2)Logstash在filter的ruby插件中从redis中读取kv数据(非input插件的用法)

““ //接受从控制台的读入 input{ stdin{} }

filter{

//因为需要用到redis,所以在init里面使用静态实例初始化redis ruby{

init => ” require ‘redis’ class Rconn @@con = Redis.new(:host => ‘192.168.10.40’, :port => 6379) def self.con @@con end end ” code => ” event[‘redis_data’]=Rconn.con.get(event[‘message’]) ” } }

//输出,从redis里面读取出来的数据 output{ stdout { codec => rubydebug } } ““

Logstash封装的启动,停止脚本: ``` (1)start.sh nohup bin/logstash -f log.conf &> logstash.log & echo $! >pid& (2)stop.sh kill -9cat pid`

““

(3)ElasticSearch的动态maping的相关操作

注意最新版本的ElasticSearch不支持在conf下的templates/xxx.json,作为 mapping映射源了,但是我们可以将定制好的maping.json文件put到ElasticSearch中

例如有下面一个userlog.json,作为logstash的Schema模板, ““ { “template”: “userlog-*”, “settings”: { “number_of_shards”: 3, “number_of_replicas”: 2, “index.translog.flush_threshold_ops”: “100000” }, “mappings”: { “default“: { “_all”: { “enabled”: false }, “dynamic_templates”: [ { “strings”: { “match_mapping_type”: “string”, “mapping”: { “type”: “string”, “index”: “not_analyzed”, “doc_values”: true

        }
      }
    }
  ]
}

} } ““

““ //上传本地的userlog.json curl -XPUT ‘http://192.168.10.40:9200/_template/userlog’ -d @userlog.json

//查看指定的json模板 curl -XGET 192.168.10.38:9200/_template/userlog?pretty=true

//删除指定的json模板 curl -XDELETE http://192.168.10.40:9200/_template/userlog

//删除指定索引数据 curl -XDELETE ‘http://192.168.1.187:9200/crawl*/’

//删除所有索引数据 curl -XDELETE ‘http://192.168.10.38:9200/_all/

ElasticSearch封装的集群启动,关闭脚本

(1) 确保ssh免密登录已经配置好 (2) 将所有机器的hostname或者ip写入hosts文件中 (3) es.sh脚本内容如下,注意不同的目录下,下面脚本需要稍作改动 启动停止方法 执行es.sh start 或者es.sh stop即可

if [ ! $# -eq 1 ] ; then

echo “必须输入一个start或者stop参数”

exit

fi start(){ for host in cat stop_hosts do ssh $host “source /home/search/.bash_profile && cd /home/search/elasticsearch-2.3.4 && bin/elasticsearch -d ” echo “ip: $host elasticsearch 启动完毕!” done }

stop(){ for host in cat stop_hosts do ssh $host ” es_pid=`jps | grep Elasticsearch | gawk ‘{print $1}’` && kill $es_pid ” ssh $host ” source /home/search/.bash_profile && jps | grep Elasticsearch | gawk ‘{print $1}’ | xargs kill -9 ” echo “ip: $host 的elasticsearch停止完毕!” done }

initial(){ case “$1” in “start”) start ;; “stop”) stop ;; *) echo “必须输入一个start或者stop参数” ;; esac } //传递参数,给方法 initial $1

““

(4)Kibana与Marvel集成的注意事项

新版本的marvel作为kibana的插件了,在elasticsearch中只要安装license和marvel-agent即可,最在在kibana里面安装marvel插件,注意使用kibana+marvel时,请务必确保 服务器的时间是一致的否则影响marvel的正常使用

Kibana封装的启动停止脚本: ``` (1)start.sh nohup bin/kibana &> kibana.log & echo $! >pid& (2)stop.sh kill -9cat pid`

““

一切安装配置完毕后,通过logstash稳定的从kafka读取数据,然后实时清洗,并推送数据到ElasticSearch中,最后在前端使用Kibana检索,当然你也可以通过Dubbo封装一个搜索服务,方便其他模块调用,最后有关索引和机器的监控可在marvel中跟踪查看,非常不错。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 系统环境安装配置
  • 软件环境安装配置
  • 一些使用案例
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档