前言

这两天需要对接一个新的搜索业务,由于测试机器还没到位,所以就自己创造条件,通过在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 -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),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。 

手动从零使用ELK构建一套搜索服务的更多相关文章

  1. 如何自己构建一套EasyNVR这样的无插件流媒体服务器实现摄像机硬盘录像机的网页可视化直播

    EasyNVR流媒体解决方案 EasyNVR能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera.NVR等具有RTSP协议输出的设备接入到EasyNVR,EasyNV ...

  2. 利用ELK构建一个小型的日志收集平台

    利用ELK构建一个小型日志收集平台 伴随着应用以及集群的扩展,查看日志的方式总是不方便,我们希望可以有一个便于我们查询及提醒功能的平台:那么首先需要剖析有几步呢? 格式定义 --> 日志收集 - ...

  3. 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))

    容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器

  4. 基于Golang设计一套微服务架构[转]

      article- @嘟嘟噜- May/26/2018 18:35:30 如何基于Golang设计一套微服务架构 微服务(Microservices),这个近几年我们经常听到.那么现在市面上的的微服 ...

  5. [译]Spring Boot 构建一个RESTful Web服务

    翻译地址:https://spring.io/guides/gs/rest-service/ 构建一个RESTful Web服务 本指南将指导您完成使用spring创建一个“hello world”R ...

  6. 使用Elasticsearch 与 NEST 库 构建 .NET 企业级搜索

    使用Elasticsearch 与 NEST 库 构建 .NET 企业级搜索 2015-03-26 dotNET跨平台 最近几年出现的云计算为组织和用户带来了福音.组织对客户的了解达到前所未有的透彻, ...

  7. 实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务

    本文为实战SpringCloud响应式微服务系列教程第九章,讲解使用Spring WebFlux构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 从本节开始我们 ...

  8. 基于dubbo构建分布式项目与服务模块

      关于分布式服务架构的背景和需求可查阅http://dubbo.io/.不同于传统的单工程项目,本文主要学习如何通过maven和dubbo将构建分布项目以及服务模块,下面直接开始. 创建项目以及模块 ...

  9. 构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介

    构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组 ...

随机推荐

  1. 1、获取APP 冷/热启动时间

    最近在研究Android APP性能测试.所以发现一些有趣的东西,在这里进行分享.我们先讲第一个内容,如何获取APP冷/热启动时间?为什么要做这个测试,道理其实很简单,如果启动APP特别耗时的话,用户 ...

  2. PE代码段中的数据

    PE代码段中可能包含一些数据,比如 optional header中的data directory会索引到一些数据,比如import/export table等等: 还有一些jump table/sw ...

  3. 2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)

    K-th Closest Distance 题目传送门 解题思路 二分答案+主席树 先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明 ...

  4. Apache Flink:详细入门

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能.现有的开源计算 ...

  5. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  6. 豆瓣图书Top250

    从豆瓣图书Top250抓取数据,并通过词云图展示 导入库 from lxml import etree #解析库 import time #时间 import random #随机函数 import ...

  7. 类 __init__的注意事项

    class Dog():  class类 后面的ClassName类名第一个字母一定要大写. def __init__(self,name,age):    注意init前后是英文格式下,前后都是两道 ...

  8. [LOJ#6468.] 魔法

    官方题解 看了题解才会做.. 首先考虑如果所有询问的点都是[1,n]的做法,如果询问是[l,r]只需要把多余的去掉就好了 然后要把问题转化为一个点对其他附近的点的贡献 记$pre[i]$为第i个位置的 ...

  9. 启动eclipse出现JVM terminated. Exit code=127 错误解决办法

    https://blog.csdn.net/wpzsidis/article/details/72954387 进去第二次又错

  10. 沉默的QQ

    QQ很久没有叮咚了,一是没人发消息给我,二是我关了QQ的声音.现在除了几个还在接收消息的群外,其他的群都屏蔽了,有事才上去看看.我从来就没写过QQ空间,那些以前经常写空间的朋友也多数停止了喧闹.每次登 ...