zoukankan      html  css  js  c++  java
  • 手动从零使用ELK构建一套搜索服务

    前言

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

    软件环境安装配置

    框架下载地址
    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 -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

  • 相关阅读:
    ROS中.launch文件的remap标签详解
    宝宝刷 leetcode
    ROS rosrun 调用 sudo 命令
    在moveit编译时找不到manipulation_msgsConfig.cmake manipulation_msgs-config.cmake文件
    CMake error with move_base_msgs问题解决
    VIVE pro和hololens购买调研
    /usr/bin/ld: 找不到 -lmsc----解决方案
    ubuntu16.04安装kinetic调用gazebo_control解决方案
    tomcat http协议与ajp协议
    GC日志分析
  • 原文地址:https://www.cnblogs.com/qindongliang/p/5716183.html
Copyright © 2011-2022 走看看