ElasticSearch初探

JerryXia 发表于 , 阅读 (0)
单个索引本质上可以存储大量数据(可能超出单个节点的硬件限制),比如,一个索引里包含了十亿个文档, 并占用了1TB磁盘空间,这将不利于单个节点提供查询服务。为了解决这种问题, ElasticSearch具有将索引细分为多个分片(Shards)的能力。 当你创建索引时,可以定义想要的分片数。分片即是一个具有独立功能的"索引",可以位于集群中的任何节点上。 分片主要有两个原因:

1. 水平分割扩展容量。
2. 跨分片(本质是节点)分发和并行操作,因此提升性能和吞吐量。

分片如何被分布以及它的文档如何被聚合到搜索请求中,都被ElasticSearch隐藏起来,对用户完全透明。 在分布式网络环境中,故障任何时候都可能发生,通过分片实现容错机制是十分有用并被推荐的。为此, ElasticSearch允许对索引分片进行备份,即备份分片。备份主要有两个原因:

1. 当分片失败时提供高可用,需要注意备份分片永远不会和其主分片分配在同一节点上。
2. 这将扩展集群的搜索吞吐量,因为所有搜索可以在备份分片上并行执行。

大致的总结就是

每个索引可以分割为多个分片,也可以有0个或多个备份,一旦备份, 每个索引将有主分片备份分片, 分片数和备份数可以在索引被创建时定义,索引创建后,可以动态更新备份数,但不能更新分片数。 ElasticSearch默认将每个索引分成5个分片,作1个备份,也就是说,集群中至少有2个节点, 那么索引将有5个主分片,5个备份分片。如

1.png 两个节点分别有5个分片,粗线表示的是主分片,细线表示的是备份分片。

安装部署

ElasticSearch(1.5.2)的安装部署比较简单,只需JAVA环境(1.7以上), 将安装包解压缩,进入bin,执行elasticsearch即可, 这是自己使用的一个标准包,其中集成了 BigdeskHeadIK分词器。 下面是一份简明的ES脚本
#!/usr/bin/env bashES_HOME=~/Envir/server/es/es1ES_PID_FILE=~/Envir/server/es/es1/es.pid# java options such as: -Xmx512m -Xms512mJAVA_OPTIONS="-Xmx512m -Xms512m"# -d run in backgroundBACKGROND="-d"REST_URL="localhost:9200"start(){    local script=$ES_HOME/bin/elasticsearch    $script -p $ES_PID_FILE  $JAVA_OPTIONS $BACKGROND    echo "Started"    return 0}stop(){    if [ ! -f $ES_PID_FILE ]; then        echo "$ES_PID_FILE isn't exist, maybe elasticsearch isn't running."        return 1    fi    local pid=$(cat $ES_PID_FILE)    if [ "$pid" = "" ]; then        echo "pid is empty in file $ES_PID_FILE, maybe elasticsearch isn't running."        return 1    fi    kill -9 $pid    rm $ES_PID_FILE    echo "Stopped."    return 0}nodes(){    curl "$REST_URL/_cat/nodes?v"    return 0}indexs(){    curl "$REST_URL/_cat/indices?v"    return 0}master(){    curl "$REST_URL/_cat/master?v"    return 0}alloc(){    curl "$REST_URL/_cat/allocation?v"    return 0}kat(){    curl -XGET "$REST_URL/$1?pretty"    return 0}case "$1" in    'start')        start        ;;    'stop')        stop        ;;    'restart')        stop        start        ;;    'nodes')        nodes        ;;    'indexs')        indexs        ;;    'master')        master        ;;    'alloc')        alloc        ;;    'kat')        kat $2        ;;    *)        echo "Usage:        start   : start es.        stop    : stop es.        restart : restart es.        nodes   : nodes informations.        indexes : all index informations.        master  : master information.        alloc   : disk allocation informastions.        kat     : cat an document, such as: kat /persons/person/{document ID}        "esacunset ES_HOMEunset ES_PID_FILEunset JAVA_OPTIONSunset BACKGRONDunset REST_URL    
此外封装了一个简明的Java客户端工具