前言

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

    OpenLayers绘制图形   OpenLayers的显示构成由外向内为: ol.Map:地图对象. ol.layer.Vector:图层对象layer.Map含有多个layer,最终的显示效果是由 ...

  2. autocad 2015 破解方法

    下载 http://trial.autodesk.com/SWDLDNET4/2015/ACD/DLM/AutoCAD_2015_Simplified_Chinese_Win_64bit_dlm.sf ...

  3. C# 反射入门

    反射 别的用处先不管,至少在WinForm登录后的权限控制上有大用,比如登录后的窗体左侧树,点击通过字符串创建出窗体实例 案例如下图 AssTest类很简单 namespace assemblyTes ...

  4. 2-vim-打开和新建文件-01-打开/新建文件/打开定位到文件指定行

    1.新建或打开文件 命令: vim 文件名 在终端中输入vi在后面跟上文件名即可. 如果文件已经存在,会直接打开文件. 如果文件不存在,会新建一个文件. 2.打开文件并定位到文件指定行. 命令: vi ...

  5. 数据可视化echart

    刚接到这个一脸懵逼,到现在还算有点眉目,先上个图庆祝一下,哈哈,开心.... 最近没时间,等待更新..........

  6. 2019-4-15-VisualStudio-如何在-NuGet-包里面同时包含-DEBUG-和-RELEASE-的库

    title author date CreateTime categories VisualStudio 如何在 NuGet 包里面同时包含 DEBUG 和 RELEASE 的库 lindexi 20 ...

  7. ARM TK1 安装ROS- indigo

    之前安装不成功是因为校园网无法访问源的问题. Ubuntu ARM install of ROS Indigo There are currently builds of ROS for Ubuntu ...

  8. linux fcntl 对文件描述符控制

    linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制

  9. 【PKUWC2018】猎人杀

    题目描述 题目分析 设\(W=\sum\limits_{i=1}^nw_i\),\(A=\sum\limits_{i=1}^nw_i[i\ is\ alive]\),\(P_i\)为下一个打中\(i\ ...

  10. CTF学习路线指南(附刷题练习网址)

    PWN,Reverse:偏重对汇编,逆向的理解: Gypto:偏重对数学,算法的深入学习: Web:偏重对技巧沉淀,快速搜索能力的挑战: Mic:则更为复杂,所有与计算机安全挑战有关的都算在其中 常规 ...