Elasticsearch服务搭建实践

一,背景

1,什么是ES(WHAT)

Elasticsearch是一个分布式可扩展的实时搜索和分析引擎。

通过Lucene的倒排索引技术实现比关系型数据库更快的过滤,采用分词技术并支持高亮显示,是当前流行的企业级搜索解决方案。

2,为什么用ES (WHY)

Elasticsearch可以解决的痛点:

  • 数据检索响应速度慢

随着业务发展,数据量攀涨到千万级别以上,查询必然会遇到瓶颈,ES利用倒排索引技术,可以实现毫秒级检索,是提升查询速度的利器。

  • 检索数据的匹配不完全

目前MYSQL模糊检索主要是通过LIKE关键字匹配,这种方式的实现,在一定程度上会减少用户检索的数据获取量,尤其是商品检索,可能因此就损失一些成交额。

以搜索 零基础 关键词为例:

序号 常规SQL 匹配不到 索引使用 检索速度
1 %零基础 零基础 快速入门短视频 失效
2 零基础% 「新品」《14天 零基础 公众号速成》 正常
2 %零基础% 0基础 快速入门Elasticsearch 失效

另外主要优点如下:

  1. 易于部署
  2. 方便横向扩容,无需额外的软件即可扩展到数百个节点,处理PB级别的数据量
  3. 支持丰富的插件,内置RESTful API,开箱即用
  4. 开源,更新快,生态圈丰富,社区活跃

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插件:

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不用单独安装

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281