手動從零使用ELK構建一套搜索服務

前言

這兩天須要對接一個新的搜索業務,因爲測試機器還沒到位,因此就本身創造條件,經過在Windows上安裝VM虛擬機,模擬整套環境,從而能快速進入核心業務的開發測試狀態中。html

系統環境安裝配置

虛擬機VMware Workstation Pro 12前端

雲盤下載地址:https://pan.baidu.com/s/1hrWx76kjava

序列號:FF1JR-AZGE6-480UP-1PPXV-W38TAnode

Centos7 minimal鏡像isoredis

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

網絡模式 :使用橋接模式vim

啓動虛擬機加載鏡像後,第一件事配置靜態ip,centos7方法以下:windows

(1) 編輯 網卡文件centos

vi /etc/sysconfig/network-scripts/ifcfg-eno16777736

(2)修改IP並保存api

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
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

相關文章
相關標籤/搜索