文档章节

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

九劫散仙
 九劫散仙
发布于 2016/07/28 19:45
字数 1784
阅读 421
收藏 4

前言

这两天需要对接一个新的搜索业务,由于测试机器还没到位,所以就自己创造条件,通过在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里面看到

image

最后在确认下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


软件环境安装配置

框架下载地址
JDK8http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Logstash2.3.4https://www.elastic.co/downloads
Elasticsearch2.3.4https://www.elastic.co/downloads
Kibana4.5.3https://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
bin/plugin install lmenezes/elasticsearch-kopf

//==================Kibana的插件==================
//监控
bin/kibana plugin --install elasticsearch/marvel/2.3.4
//索引rest查询
bin/kibana plugin --install elastic/sense
// vi  config/kibana.yml 加入如下配置
//默认是 127.0.0.1:9200  访问地址:http://192.168.1.123:5601/app/sense
sense.defaultServerUrl: "192.168.10.40:9200"

一些使用案例

(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 -9 `cat 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的正常使用

image

Kibana封装的启动停止脚本:

(1)start.sh
nohup bin/kibana  &> kibana.log & echo $! >pid& 
(2)stop.sh
kill -9 `cat pid`

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


有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。 image

© 著作权归作者所有

九劫散仙
粉丝 266
博文 175
码字总数 189625
作品 0
海淀
私信 提问
小白都会超详细--ELK日志管理平台搭建教程

目录 一、介绍 二、安装JDK 三、安装Elasticsearch 四、安装Logstash 五、安装Kibana 六、Kibana简单使用 系统环境:CentOS Linux release 7.4.1708 (Core) 当前问题状况 开发人员不能登录线...

渣渣辉
2018/07/15
0
0
centos 7( linux )下安装elasticsearch教程

目录 概述 环境准备 elaticsearch简介 安装elasticsearch 彩蛋 概述 很久没有写博客了,最近在做全文检索的项目,发现elasticsearch踩了不少坑,百度点进去又是坑,在此记录一下自己的踩坑历程。...

java_龙
2018/10/15
0
0
ELK环境搭建(ElasticSearch+Logstash+kibana)

ELK是指Elasticsearch + Logstash + Kibaba三个组件的组合。本文讲解一个基于日志文件的ELK平台的搭建过程,有关ELK的原理以及更多其他信息,会在接下来的文章中继续研究。   在这个系统中...

阿恒灬
2017/10/31
0
0
Elasticsearch最佳实践之使用场景

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwgdft/article/details/82917861 序   最开始使用Elasticsearch是两年多前,在一家创业公司负责数据系统的...

Mr-Bruce
2018/10/08
0
0
Elastic 在年度用户大会 Elastic{ON} 2018 上发布众多新功能和技术预览

下载超过 2.25 亿次,Elastic 公开 X-Pack 源代码 旧金山 (Elastic{ON} 2018) – 2018 年 2 月 27 日 – Elastic,Elasticsearch 和 Elastic Stack背后的公司,今天宣布其产品累计下载次数达...

Medcl
2018/03/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
2
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
3
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部