如何更好地使用ElasticSearch之技巧和建议

我自己用的备忘录

安装 ~ 设置

我們使用Fabric進行了編排 Fabric

def install_elastic_search():
    sudo("wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.2.1.deb")
    sudo("dpkg -i elasticsearch-1.2.1.deb")
    sudo("service elasticsearch start")
    run("echo export PATH=\$PATH:/usr/share/elasticsearch/bin/ >> ~/.bashrc")

def es_init():
    //changing permission
    //see document

与td-agent的整合

可以使用 td-agent(fluentd)的forest插件从不同的服务器接收日志,并在包含elasticsearch的日志服务器上进行条件分支或从标签中提取信息并进行利用,这样会很好。


<source>
  type forward
  port 24224
</source>

<match **>
 type forest
 subtype elasticsearch
 <template>
   host localhost
   port 9200
   index_name ${tag_parts[2]}
   type_name ${tag_parts[1]}

   buffer_type memory
   flush_interval 3s
   retry_limit 17
   retry_wait 1.0
   num_threads 1
   flush_at_shutdown true
 </template>
</match>

这个 flush_interval 3s 可能不太好。
可能会对生产环境的性能产生较大影响,频率太高了。

顺便提一下,如果在td-agent中将间隔设置得太短,可能会导致数据在PUT到ElasticSearch之后无法立即反映出来,让人感到困惑。如果觉得反映速度太慢,可能需要调整一下相关设置。

考试

存在测试


def all():
  availability_test("td-agent")
  availability_test("elasticsearch")

def availability_test(name):
  env.warn_only = True

  if name == "td-agent":
    version_checker = name + " --version"
  elif name == "elasticsearch":
    version_checker = "export PATH=$PATH:/usr/share/elasticsearch/bin/ && " + name + " -v"

  if "command not found" in run(version_checker):
    print(name + " hasn't been installed")
  else:
    print(name + " has been installed")
  env.warn_only = False

现在回想起来,使用fabric的测试工具envassert是一个更好的选择,而且我现在也应该在重构并使用它。

envassert很容易设置,也没有像serverspec那样繁琐。不过,我觉得可以用类似rspec的语法来编写,这样很好,就像JS里的mocha一样。但是,serverspec需要准备的东西太多了,让我有些不太想去测试基础设施。虽然我是个rubyist,但我不用chef,而是用fiblic。

日志系统集成测试

「超级脏」
用Python重新编写


#! /bin/bash
###############################################
# function
###############################################

initializing () {
  if ! expr $before : '[0-9]*' 1> /dev/null 2> /dev/null ; then
    before=0
  fi

  if [ -z $num ]; then
    num=0
  fi

  if [ $num -le $before ]; then
    num=$(($before+1))
  fi
}

buffering () {
  waiting=$*
  for i in `seq 1 $waiting`
  do
    left=$(($waiting - $i))
    echo $left sec
    sleep 1
  done
}

log_into_td_es () {
  fab -u <your_name> -i <your_pem> -H <your_domain> all
  buffering 1
}

diff_check () {
  diff=$(($after - $before))
  if [ $diff -eq 1 ]; then
    echo diff: $diff
  else
    echo not changed
    exit 1
  fi
}

# delete_all () {
#   curl -XDELETE 'http://$*:9200/*' 1> /dev/null 2> /dev/null 
# }




###############################################
# main
###############################################
before=`curl -XGET http://$*:9200/fluentd/_count 2> /dev/null | cut -d "," -f 1 | cut -d ":" -f 2`
echo before_count: $before
initializing
curl -XPUT http://$*:9200/fluentd/info/$num -d '{ "test" : "hoge" }' 1> /dev/null 2> /dev/null
after=`curl -XGET http://$*:9200/fluentd/_count 2> /dev/null | cut -d "," -f 1 | cut -d ":" -f 2`
echo after_count: $after
diff_check

使用日志

我使用了elasticsearch-py等库。虽然我是个Ruby开发者,但在基础架构方面,可能更多地使用Python之类的语言。这取决于团队。我没有特别偏好。

curl -X GET ‘http://hoge.com:9200/_index/_type/_search?pretty=true&size=1000&sort=desc’ 可以改写为:使用GET方法访问’http://hoge.com:9200/_index/_type/_search?pretty=true&size=1000&sort=desc’。

在中文中可以使用以下方式确认。

观察ES的情况

找目标

curl命令可以这样在中文中解释:在终端中输入以下命令,在hoge.com的端口9200上发送GET请求来获取统计数据,并以易读的格式输出。

现在还没有进行分片和复制,所以以后会处理大约几千行的统计数据。主要是浏览文档量(和存储容量)。

死活监视 – sǐ huó shì

    • elasticsearch-head

 

    • elasticsearch-paramedic

 

    SPM for ElasticSearch

定期获取并可视化ES的统计信息的人。

那种感觉。

广告
将在 10 秒后关闭
bannerAds