這兩天須要對接一個新的搜索業務,因爲測試機器還沒到位,因此就本身創造條件,經過在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裏面看到
最後在確認下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的正常使用
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),在後臺留言諮詢。 技術債不能欠,健康債更不能欠, 求道之路,與君同行。