如何更好地使用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的统计信息的人。
那种感觉。