热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手动从零使用ELK构建一套搜索服务

前言这两天需要对接一个新的搜索业务,由于测试机器还没到位,所以就自己创造条件,通过在Windows上安装VM虚拟机,模拟整套环境,从而能快速进入核心业务的开发测试状态中。系统环境安装配

前言

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


推荐阅读
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • Ansible:自动化运维工具详解
    Ansible 是一款新兴的自动化运维工具,基于 Python 开发,集成了多种运维工具(如 Puppet、CFEngine、Chef、Func 和 Fabric)的优点,实现了批量系统配置、程序部署和命令执行等功能。本文将详细介绍 Ansible 的架构、特性和优势。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 在 CentOS 7 中,为了扩展可用软件包的数量,通常需要配置多个第三方软件源。这些第三方源包括 EPEL、Nux Dextop 和 ELRepo 等,它们提供了大量官方源中未包含的软件包,从而增强了系统的功能性和灵活性。通过正确配置这些源,用户可以轻松安装和管理更多种类的软件,满足不同的需求。 ... [详细]
  • iOS 设备唯一标识获取的高效解决方案与实践
    在iOS 7中,苹果公司再次禁止了对MAC地址的访问,使得开发者无法直接获取设备的物理地址。为了在开发过程中实现设备的唯一标识,苹果推荐使用Keychain服务来存储和管理唯一的标识符。此外,还可以结合其他技术手段,如UUID和广告标识符(IDFA),以确保设备的唯一性和安全性。这些方法不仅能够满足应用的需求,还能保护用户的隐私。 ... [详细]
  • 在VMware虚拟机中部署带有中文图形界面的CentOS 7 Linux系统
    本文详细介绍了在VMware虚拟机中部署带有中文图形界面的CentOS 7 Linux系统的步骤。首先,通过“文件”菜单选择“新建虚拟机”并进入自定义设置。接着,在硬盘兼容性选项中选择默认设置。为了更好地进行Linux操作系统的安装练习,建议选择稍后安装操作系统,并在虚拟机安装完成后,根据实际需求删除不必要的硬件组件。此外,本文还提供了详细的配置参数和注意事项,帮助用户顺利完成整个部署过程。 ... [详细]
  • 在 CentOS 6.6 系统中搭建 MONO 和 Jexus 以支持 ASP.NET 及 MVC 应用的运行环境配置指南
    本文提供了在 CentOS 6.6 系统上配置 MONO 和 Jexus 以支持 ASP.NET 及 MVC 应用的详细步骤。首先,确保本机环境为 CentOS 6.6,并使用阿里云的 YUM 源来安装必要的软件包,包括 gcc、gcc-c++、bison、pkgconfig 和 glib2-devel。这些软件包是构建和运行 MONO 环境的基础,确保系统能够顺利支持 ASP.NET 和 MVC 应用的部署和运行。 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
author-avatar
衢江大道
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有