一扫腺,背景
1,什么是ES(WHAT)
Elasticsearch是一個(gè)分布式可擴(kuò)展的實(shí)時(shí)搜索和分析引擎虏缸。
通過(guò)Lucene的倒排索引技術(shù)實(shí)現(xiàn)比關(guān)系型數(shù)據(jù)庫(kù)更快的過(guò)濾沧卢,采用分詞技術(shù)并支持高亮顯示蚁堤,是當(dāng)前流行的企業(yè)級(jí)搜索解決方案。
2但狭,為什么用ES (WHY)
Elasticsearch可以解決的痛點(diǎn):
- 數(shù)據(jù)檢索響應(yīng)速度慢
隨著業(yè)務(wù)發(fā)展披诗,數(shù)據(jù)量攀漲到千萬(wàn)級(jí)別以上,查詢必然會(huì)遇到瓶頸立磁,ES利用倒排索引技術(shù)呈队,可以實(shí)現(xiàn)毫秒級(jí)檢索,是提升查詢速度的利器唱歧。
- 檢索數(shù)據(jù)的匹配不完全
目前MYSQL模糊檢索主要是通過(guò)LIKE關(guān)鍵字匹配宪摧,這種方式的實(shí)現(xiàn),在一定程度上會(huì)減少用戶檢索的數(shù)據(jù)獲取量颅崩,尤其是商品檢索几于,可能因此就損失一些成交額。
以搜索 零基礎(chǔ) 關(guān)鍵詞為例:
序號(hào) | 常規(guī)SQL | 匹配不到 | 索引使用 | 檢索速度 |
---|---|---|---|---|
1 | %零基礎(chǔ) | 零基礎(chǔ) 快速入門(mén)短視頻 | 失效 | 慢 |
2 | 零基礎(chǔ)% | 「新品」《14天 零基礎(chǔ) 公眾號(hào)速成》 | 正常 | 慢 |
2 | %零基礎(chǔ)% | 0基礎(chǔ) 快速入門(mén)Elasticsearch | 失效 | 慢 |
另外主要優(yōu)點(diǎn)如下:
- 易于部署
- 方便橫向擴(kuò)容沿后,無(wú)需額外的軟件即可擴(kuò)展到數(shù)百個(gè)節(jié)點(diǎn)沿彭,處理PB級(jí)別的數(shù)據(jù)量
- 支持豐富的插件,內(nèi)置RESTful API得运,開(kāi)箱即用
- 開(kāi)源膝蜈,更新快锅移,生態(tài)圈豐富熔掺,社區(qū)活躍
3,ES怎么用 (HOW)
常規(guī)套件ELK:elasticsearch + logstash + kibana
Elasticsearch
基于JSON的分布式搜索和分析引擎非剃,專為實(shí)現(xiàn)水平可擴(kuò)展性置逻、高可靠性和管理便捷性而設(shè)計(jì),本次主要用來(lái)對(duì)數(shù)據(jù)進(jìn)行搜索和存儲(chǔ)备绽。官網(wǎng)介紹:https://www.elastic.co/cn/products/elasticsearch
Logstash
作為ES常用的實(shí)時(shí)數(shù)據(jù)采集引擎券坞,可以采集來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)鬓催,并對(duì)數(shù)據(jù)進(jìn)行處理后輸出到多種輸出源,本次主要用來(lái)做從MYSQL到ES的數(shù)據(jù)導(dǎo)入恨锚。官網(wǎng)介紹: https://www.elastic.co/cn/products/logstash
Kibana
能夠以圖表的形式呈現(xiàn)數(shù)據(jù)宇驾,來(lái)搜索查看,并和存儲(chǔ)在Elasticsearch索引中的數(shù)據(jù)進(jìn)行交互猴伶,本次主要用來(lái)做數(shù)據(jù)可視化和服務(wù)監(jiān)控课舍。官網(wǎng)介紹:https://www.elastic.co/cn/products/kibana
二,服務(wù)部署
環(huán)境要求
- Linux
- JDK(1.8以上他挎,推薦1.8)
- Node
1. 安裝elasticsearch
版本選型:因?yàn)橹鞍惭b的官方PHP客戶端Elasticsearch-PHP的最新版為6.7.X筝尾,6.8版本測(cè)試尚可使用,且6.8可以免費(fèi)使用XPACK服務(wù)办桨,故采用6.8版本
下載地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-0
ES的各產(chǎn)品鏈接后綴為產(chǎn)品+版本號(hào)筹淫,例如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
啟動(dòng)腳本
#!/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數(shù)據(jù)導(dǎo)入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 ***
數(shù)據(jù)導(dǎo)入配置呢撞,以測(cè)試表demo為例损姜,創(chuàng)建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 &
安裝插件
- 安裝Mysql導(dǎo)入驅(qū)動(dòng) https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.13
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
啟動(dòng)腳本
#!/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服務(wù)搭建完畢,7.X版本大同小異狸相,主要是集成JDK不用單獨(dú)安裝