简介:
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
软件安装:
- 系统准备
- 安装JDK,配置Java环境变量
- 安装Elasticsearch
- 启动Elasticsearch
- Elasticsearch目录结构
推荐插件安装:
Marvel,head , Bigdesk
Marvel 是一个收费的插件,个人开发本是可以免费使用的,但是如果在商业行为中使用时需要购买的下简单的例子
PUT http://192.168.1.106:9200/library3/
{
"settings":{
"index":{
"number_of_shards": 5,
"number_of_replicas": 1
}
}
}
GET /library3/_settings
GET library,library2/_settings
GET /_all/_settings
PUT library/books/1
{
"title":"Elastisearch: the Definitive Guide",
"name":{
"first":"Zachary",
"last":"Tong"
},
"publish_date":"2015-02-06",
"price":"49.99"
}
POST /library/books/3
{
"title":"Elastisearch Blueprints",
"name":{
"first":"Vineeth",
"last":"Mohan"
},
"publish_date":"2015-02-06",
"price":"35.99"
}
GET /library/books/1
GET library/books/2
GET library/books/1?_source=title,price
GET library/books/1?_source
#覆盖跟新
PUT library2/shakespare/1
{
"title":"Elastisearch: the Definitive Guide",
"name":{
"first":"Zachary",
"last":"Tong"
},
"publish_date":"2015-02-06",
"price":"59.99"
}
POST library/books/1/_update
{
"doc":{
"price":10
}
}
GET library/books/1
#delete one item
DELETE library/books/1
DELETE library/books
GET library/books
GET /_mget
{
"docs":[
{
"index":"library",
"_type":"books",
"_id":1
},
{
"index":"library",
"_type":"books",
"_id":2
},
{
"index":"library2",
"_type":"shakespare",
"_id":1
}
]
}
Elasticsearch <> Mysql 术语对应关系
对于已经接触了关系型数据的人来说,elasticsearch的数据对应起来是有点困难的。
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
分布式的特性
Elasticsearch致力于隐藏分布式系统的复杂性。以下这些操作都是在底层自动完成的:
- 将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。
- 将分片均匀的分配到各个节点,对索引和搜索做负载均衡.
- 冗余每一个分片,防止硬件故障造成的数据丢失。
- 将集群中任意一个节点上的请求路由到相应数据所在的节点.
- 无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。
集群
Elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以是购买更好的服务器(纵向扩展(vertical scale or scaling up))或者购买更多的服务器(横向扩展(horizontal scale or scaling out))。Elasticsearch虽然能从更强大的硬件中获得更好的性能,但是纵向扩展有它的局限性。真正的扩展应该是横向的,它通过增加节点来均摊负载和增加可靠性。
多机集群中的节点可以分为master nodes和data nodes,在配置文件中使用Zen发现(Zen discovery)机制来管理不同节点。Zen发现是ES自带的默认发现机制,使用多播发现其它节点。只要启动一个新的ES节点并设置和集群相同的名称这个节点就会被加入到集群中。
集群的配置:
只需要在配置文件中配置相同的集群名字。elasticsearch将会自己通过多播的方式自动发现集群的其他节点,其他配置稳健的详细配置大家可以自行查看官方文档,最新版本的配置稳健选项相对以前少了很多。
elasticsearch.yml - cluster
设置集群的名称:
cluster.name: elasticsearch
设置是用来控制分片分配的进程:
cluster.routing.allocation.node_initial_primaries_recoveries: 4
添加删除节点或负载均衡时并发恢复线程的个数,默认为2:
cluster.routing.allocation.node_concurrent_recoveries: 2
设置节点的名称:
node.name: "Franz Kafka“
指定一个主节点:
node.master: true
1) 当master为false,而data为true时,会对该节点产生比较大的负荷;
2) 当master为true,而data为false时,该节点作为一个协调者;
3) 当master为false,data也为false时,该节点就变成了一个负载均衡器。
定义节点机架位置:
node.rack: rack314
设置一台机子能运行的节点数目:
node.max_local_storage_nodes: 1
持续优化
没有最好的优化方法,只有不断的调试测试。
- 在预算充足的情况下,服务器尽量配置高些(加内存,加硬盘,最好SSD)
- 根据业务,规划好索引方面的配置
- 冷热数据分离,不用的索引可以关闭或者删除
- 使用适合自己的插件,做好监控
软件层面性能影响因素:
1. 索引
- 分词器
- Segment
2. 分片数量
- 多,会导致交互多
- 少,会导致分片大
3. 副本数量:副本数量多,性能会下降
OS层面优化
选择CentOS 64位
CentOS6.5/6.6/6.7 7以上系统有很大改变,建议稳定后采用。
设置最大文件打开数
ulimit -a 查看
ulimit -SHn 65535
/etc/security/limits.conf 添加 * - nofile 65535
优化相关内核参数
查看当前TCP连接数:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}‘
更多请参考: Linux(Centos )的网络内核参数优化来提高服务器并发处理能力.txt
FQA
1.Elasticsearch是基于多播自动发其他节点的,国内网上的大多教程都是基于同一网段搭建的环境,那么如过是夸网段的,在不同的Vlan里,Elasticsearch如何发现其他节点?
在配置文件里有一个 discovery.zen.ping.[unicast](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-zen.html#unicast)
在后面添加节点列表就可以了
参考文档:
https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-zen.html#unicast