一,背景
1,什么是ES(WHAT)
Elasticsearch是一个分布式可扩展的实时搜索和分析引擎。
通过Lucene的倒排索引技术实现比关系型数据库更快的过滤,采用分词技术并支持高亮显示,是当前流行的企业级搜索解决方案。
2,为什么用ES (WHY)
Elasticsearch可以解决的痛点:
- 数据检索响应速度慢
随着业务发展,数据量攀涨到千万级别以上,查询必然会遇到瓶颈,ES利用倒排索引技术,可以实现毫秒级检索,是提升查询速度的利器。
- 检索数据的匹配不完全
目前MYSQL模糊检索主要是通过LIKE关键字匹配,这种方式的实现,在一定程度上会减少用户检索的数据获取量,尤其是商品检索,可能因此就损失一些成交额。
以搜索 零基础 关键词为例:
序号 | 常规SQL | 匹配不到 | 索引使用 | 检索速度 |
---|---|---|---|---|
1 | %零基础 | 零基础 快速入门短视频 | 失效 | 慢 |
2 | 零基础% | 「新品」《14天 零基础 公众号速成》 | 正常 | 慢 |
2 | %零基础% | 0基础 快速入门Elasticsearch | 失效 | 慢 |
另外主要优点如下:
- 易于部署
- 方便横向扩容,无需额外的软件即可扩展到数百个节点,处理PB级别的数据量
- 支持丰富的插件,内置RESTful API,开箱即用
- 开源,更新快,生态圈丰富,社区活跃
3,ES怎么用 (HOW)
常规套件ELK:elasticsearch + logstash + kibana
Elasticsearch
基于JSON的分布式搜索和分析引擎,专为实现水平可扩展性、高可靠性和管理便捷性而设计,本次主要用来对数据进行搜索和存储。官网介绍:https://www.elastic.co/cn/products/elasticsearch
Logstash
作为ES常用的实时数据采集引擎,可以采集来自不同数据源的数据,并对数据进行处理后输出到多种输出源,本次主要用来做从MYSQL到ES的数据导入。官网介绍: https://www.elastic.co/cn/products/logstash
Kibana
能够以图表的形式呈现数据,来搜索查看,并和存储在Elasticsearch索引中的数据进行交互,本次主要用来做数据可视化和服务监控。官网介绍:https://www.elastic.co/cn/products/kibana
二,服务部署
环境要求
- Linux
- JDK(1.8以上,推荐1.8)
- Node
1. 安装elasticsearch
版本选型:因为之前安装的官方PHP客户端Elasticsearch-PHP的最新版为6.7.X,6.8版本测试尚可使用,且6.8可以免费使用XPACK服务,故采用6.8版本
下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-0
ES的各产品链接后缀为产品+版本号,例如elasticsearch + 6-8-0
配置elasticsearch.yml:
cluster.name: elastic-alpha
node.name: node-1
network.host: *** ES HOST ***
http.port: 9200
# 配合elasticsearch-head
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,Content-Type
# Fix low disk watermark [85%]
cluster.routing.allocation.disk.threshold_enabled: false
# x-pack
xpack.security.transport.ssl.enabled: true
xpack.security.enabled: true
xpack.monitoring.enabled: true
启动脚本
#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64/
export JAVA_BIN=/usr/java/jdk1.8.0_112/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
case "$1” in
start)
su lyt<<!
cd /usr/local/bin/es/v6.8.0/elasticsearch
./bin/elasticsearch -d
!
echo "elasticsearch startup"
;;
stop)
es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`
kill -9 $es_pid
echo "elasticsearch stopped"
;;
restart)
es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`
kill -9 $es_pid
echo "elasticsearch stopped"
su lyt<<!
cd /usr/local/bin/es/v6.8.0/elasticsearch
./bin/elasticsearch -d
!
echo "elasticsearch startup"
;;
*)
echo "start|stop|restart"
;;
esac
exit $?
操作指令:
service elasticsearch start/stop/restart
安装ES插件:
- 安装ES-IK中文分词插件 https://github.com/medcl/elasticsearch-analysis-ik
- 安装ES-head可视面板 https://github.com/mobz/elasticsearch-head (可选)
2. 安装logstash
作用:将MYSQL数据导入ES,支持增量和全量更新
下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-6-8-0
配置logstash.yml:
# XPACK
xpack.monitoring.elasticsearch.url: ["*** ES HOST ***"]
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: *** LOGSTASH USER ***
xpack.monitoring.elasticsearch.password: *** LOGSTASH PASSWD ***
数据导入配置,以测试表demo为例,创建demo.conf
input {
stdin { }
jdbc {
jdbc_connection_string => "***DB INFO***"
jdbc_user => "*** USER ***"
jdbc_password => "*** PASSWD ***"
jdbc_default_timezone => "Asia/Shanghai"
jdbc_driver_library => "/usr/local/bin/es/v6.8.0/logstash/driver/mysql-connector-java-8.0.13.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "5000"
codec => plain { charset => "UTF-8"}
statement_filepath => "/usr/local/bin/es/v6.8.0/logstash/bin/demo.sql"
schedule => "*/5 * * * *"
use_column_value => true
tracking_column => "updated_at"
type => "doc"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
hosts => "*** ES HOST ***"
index => "demo"
user => *** ES USER ***
password => *** ES PASSWD ***
document_id => "%{uuid}"
}
stdout {
codec => json_lines
}
}
操作指令
nohup bin/logstash -f demo.conf &
安装插件
3. 安装kibana
下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-6-8-0
配置kibana.yml:
# kibana
server.port: 5601
server.host: “*** ES HOST ***"
# elasticsearch
elasticsearch.hosts: ["** ES HOST ****"]
elasticsearch.username: "*** ES USER ***"
elasticsearch.password: "*** ES PASSWD ***"
# i18n
i18n.locale: "zh-CN”
# xpack
xpack.security.enabled: true
xpack.monitoring.enabled: true
启动脚本
#!/bin/sh
KIBANA_BIN=/usr/local/bin/es/v6.8.0/kibana/bin
NAME=kibana
PID_FILE=/var/run/$NAME.pid
PATH=/bin:/usr/bin:/sbin:/usr/sbin:$KIBANA_BIN
DAEMON=$KIBANA_BIN/kibana
DESC="Kibana6"
if [ `id -u` -ne 0 ]; then
echo "You need root privileges to run this script"
exit 1
fi
. /lib/lsb/init-functions
if [ -r /etc/default/rcS ]; then
. /etc/default/rcS
fi
case "$1" in
start)
log_daemon_msg "Starting $DESC"
pid=`pidofproc -p $PID_FILE kibana`
if [ -n "$pid" ] ; then
log_begin_msg "Already running."
log_end_msg 0
exit 0
fi
# Start Daemon
start-stop-daemon --start --pidfile "$PID_FILE" --make-pidfile --background --exec $DAEMON
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping $DESC"
if [ -f "$PID_FILE" ]; then
start-stop-daemon --stop --pidfile "$PID_FILE" \
--retry=TERM/20/KILL/5 >/dev/null
if [ $? -eq 1 ]; then
log_progress_msg "$DESC is not running but pid file exists, cleaning up"
elif [ $? -eq 3 ]; then
PID="`cat $PID_FILE`"
log_failure_msg "Failed to stop $DESC (pid $PID)"
exit 1
fi
rm -f "$PID_FILE"
else
log_progress_msg "(not running)"
fi
log_end_msg 0
;;
status)
status_of_proc -p $PID_FILE kibana kibana && exit 0 || exit $?
;;
restart|force-reload)
if [ -f "$PID_FILE" ]; then
$0 stop
sleep 1
fi
$0 start
;;
*)
log_success_msg "Usage: $0 {start|stop|restart|force-reload|status}"
exit 1
;;
esac
exit 0
操作指令
service kibana start/stop/restart/force-reload/status
至此ES6.8服务搭建完毕,7.X版本大同小异,主要是集成JDK不用单独安装