Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。它用于全文搜索、结构化搜索、分析以及将这三者混合使用。
备注:以下内容,elasticsearch 简称 ES
从官网www.elatic.co可以下载最新版的elasticsearch,但是它需要Java环境的支持,一般在操作系统上装最新版的JDK就行,当然得配置好JAVA环境。
CentOs 6.5
Jdk版本:1.8.0_101
安装方式:yum intall java-1.8.0-openjdk.x86_64
ES版本:Elasticsearch2.4.1
下载最新版本Elasticsearch2.4.1,官方支持的下载格式有(zip、tar、deb、rpm);以下内容,我采用的是rpm方式进行安装;
查看jdk是否已经安装:java –version,如图3.1所示:
图3.1 jdk版本信息
如果还未安装,先安装和配置好jdk环境变量。
查看ES是否已经安装过:find/ -name elasticsearch,如果已经安装过,先卸载,如图3.2所示:
图3.2 es安装位置信息
如果采用的是rpm安装方式,可以采用rpm卸载方式:
rpm –eelasticsearch
然后查看剩下的目录:
find / -nameelasticsearch
剩余的目录手动删除即可。
(备注:卸载方式只介绍rpm方式,其他安装方式选择其他卸载方式。)
最新ES版本下载地址:
https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.4.1/elasticsearch-2.4.1.rpm
Ø Rpm安装
rpm –ivh elasticsearch-2.4.1.rpm
Ø 进入bin目录把它加入服务
/sbin/chkconfig --add elasticsearch
Ø 查看ES的目录以及执行文件所在目录
rpm -ql elasticsearch
从输入的目录列表中找到bin目录,即执行文件所在目录,如图3.3所示:
图3.3 es安装位置图
Ø ES启动
service elasticsearch start
启动状态,如图3.4所示:
图3.4 启动es状态图
Ø 验证安装成功
在浏览器地址栏上输入:http://{yourip}:9200/
谷歌浏览器下会显示,如图所示:
出现以上结果,表示安装成功。
elasticsearch-head是一个界面化的集群操作和管理工具,他是通过html5编写,可以对集群进行傻瓜式操作。有两种安装方式:
(备注:资料来源官方文档:https://github.com/mobz/elasticsearch-head)
进入ES安装目录:
cd /usr/share/elasticsearch
执行
Sudo bin/plugin installmobz/elasticsearch-head
可以看到,如图3.5、图3.6所示:
图3.5安装elasticsearch-head插件状态图
图3.6elasticsearch-head插件安装结果图
在/usr/share/elasticsearch/plugins文件夹中,查看到head,说明elasticsearch-head已经安装。
Ø https://github.com/mobz/elasticsearch-head下载zip包,解压后将包名改为:head ;
Ø 然后将head包复制到:/usr/share/elasticsearch/plugins目录下;
ES服务重启
service elasticsearch restart
在浏览器器地址栏输入:http://{yourip}:9200/_plugin/head/
系统界面:大致界面如下图所示,自己尝试操作下,就不一一介绍了,如图3.7所示:
图3.7 elasticsearch-head插件界面图
bin/plugin -install lukas-vlcek/bigdesk
搭建elasticsearch的集群
现在假设我们有3台ES机器,想要把他们搭建成为一个集群
192.168.15.59 192.168.15.60 192.168.15.61 |
对于上面的三台机器,通过以上的步骤进行搭建ES系统。
在每个节点上都要进行这样的配置:
cluster.name: dc-display |
只要集群名相同,且机器处于同一局域网同一网段,es会自动去发现其他的节点。
这个是配置当前节点的名字,当然每个节点的名字都应该是唯一的,3台机器对应的节点名称
node.name: "dc-display-node-1" node.name: "dc-display-node-2" node.name: "dc-display-node-3" |
node.master: false node.data: true |
这两个配置有4种配置方法,表示这个节点是否可以充当主节点,这个节点是否充当数据节点。如果你的节点数目只有两个的话,为了防止“集群脑裂”的情况,需要手动设置主节点和数据节点。其他情况建议直接不设置,默认两个都为true。
绑定host,为了安全考虑,建议设置为内网IP,三个节点对应的host:
network.host: "192.18.15.59" network.host: "192.18.15.60" network.host: "192.18.15.61" |
http.port: 9700 |
这个是对外提供http服务的端口,安全考虑,建议修改,不用默认的9200
transport.tcp.port: 10800 |
节点到节点之间的交互是使用tcp的,这个设置设置启用的端口
discovery.zen.ping.multicast.enabled: false discovery.zen.fd.ping_timeout: 100s discovery.zen.ping.timeout: 100s discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.unicast.hosts: ["192.168.15.59:10800", "192.168.15.60:10800", "192.168.15.61:10800"] |
这几个是集群自动发现机制
discovery.zen.ping.multicast.enabled这个设置把组播的自动发现给关闭了,为了防止其他机器上的节点自动连入。 discovery.zen.fd.ping_timeout和discovery.zen.ping.timeout是设置了节点与节点之间的连接ping时长 discovery.zen.minimum_master_nodes 这个设置为了避免“集群脑裂”。比如3个节点的集群,如果设置为2,那么当一台节点脱离后,不会自动成为master。 discovery.zen.ping.unicast.hosts 这个设置了自动发现的节点。 |
action.auto_create_index: false |
这个关闭了自动创建索引。为的也是安全考虑,否则即使是内网,也有很多扫描程序,一旦开启,扫描程序会自动给你创建很多索引。
http.jsonp.enable: false |
这个关闭跨越远程访问,为了安全考虑,将禁止对外提供跨越的访问。
好了,启动三个节点他们就会互相自己连起来成为集群了。现在两个节点已经形成集群,并且做了数据的复制,如图3.8、图3.9所示,
图3.8 59机器集群信息
图3.9 60机器集群信息
elasticsearch.yml是elasticsearch主要的配置文件,所有的配置都在这个文件里完成,一般情况下,默认的配置已经可以比较好地运行一个集群了,但你也可以对其进行微调。下面对其比较常见的一部分参数做一些说明:
1. cluster.name
集群名称,如果有多个集群,那么每个集群名就得是唯一的。
1.node.data
集群中的节点名称,比如前面说的82、83、84三台机子每台都有一个名称,你也可以不设这个名称,默认的集群启动时会自己给每个节点初始化一个名称,但强烈建议这里还是由自己设置比较好。
2.node.master
该节点是否是master,true表示是的,false表示否,默认是true.
3.node.data
该节点是否存储数据,默认true表示是的。
说明:对于上面两个节点,如果你希望该节点只是一个master,但不存储数据,则应当设置为:
node.master: true
node.data: false
如果你希望该节点只存储数据,但不是一个master,则应该设置:
node.master: false
node.data: true
如果你既不希望该节点为一个master,也不想它存储数据,则应该设置为:
node.master: false
node.data: false
这种情况一般是你希望该节点仅仅是作为一个搜索负载均衡器,比如从各节点得到数据,聚合结果等。
1. index.number_of_shards
设置一个索引被分成的分片数,默认是5
2.index.number_of_replicas
设置一个索引有几个拷贝,默认为1。拷贝指的是其它节点对该节点的拷贝,比如在84上创建了一个索引,那么这个拷贝会存在于82和83上,这是一个分布式的属性。
拷贝越多,则搜索性能越佳,而分片越多则索引创建性能越好。
1.path.conf
配置文件目录,默认为es根目录下的config目录。
2.path.data
索引存储路径,默认为es根目录下的data目录,可以有多个存储路径,各存储路径用逗号隔开,如:path.data: /path/to/data1,/path/to/data2
3.path.work
临时文件存放目录,默认为es根目录下的work目录
4.path.logs
日志文件存放目录,默认为es根目录下的logs目录。
5.path.plugins
插件的安装目录,默认为es根目录下的plugins目录。
1.network.bind_host
Es节点绑定的地址,为一个ip地址(IPv4或IPv6)
2.network.publish_host
Es发布的地址,其它节点通过这个地址与其进行通信
3.network.host
该节点网络地址,也是一个ip地址,如果设置了该属性,则network.bind_host与network.publish_host都不用再设置了,比如我这里三台机子设置的值分别为:
118.200.108.82、118.200.108.83、118.200.108.84。
4.transport.tcp.port
节点之间通信的端口,默认为9300,在我们应用程序中调用es的方法提交索引创建时也是使用的这个端口。
5.http.port
http访问端口,默认是9200,通过这个端口,调用方可以索引查询请求。
6.http.max_content_length
设置内容的最大容量,默认是100MB
7.http.enabled
是否禁止http访问,默认是false。
1. discovery.zen.minimum_master_nodes
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)。
2. discovery.zen.ping.timeout
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错
3. discovery.zen.ping.multicast.enabled
设置是否打开多播来发现来发现节点,默认是true
4. discovery.zen.ping.unicast.hosts
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
elasticsearch集群一旦建立起来以后,会选举出一个master,其他都为slave节点。
但是具体操作的时候,每个节点都提供写和读的操作。就是说,你不论往哪个节点中做写操作,这个数据也会分配到集群上的所有节点中。
这里有某个节点挂掉的情况,如果是slave节点挂掉了,那么首先关心,数据会不会丢呢?不会。如果你开启了replicate,那么这个数据一定在别的机器上是有备份的。
别的节点上的备份分片会自动升格为这份分片数据的主分片。这里要注意的是这里会有一小段时间的yellow状态时间。
如果是主节点挂掉怎么办呢?当从节点们发现和主节点连接不上了,那么他们会自己决定再选举出一个节点为主节点。
但是这里有个脑裂的问题,假设有5台机器,3台在一个机房,2台在另一个机房,当两个机房之间的联系断了之后,每个机房的节点会自己聚会,推举出一个主节点。
这个时候就有两个主节点存在了,当机房之间的联系恢复了之后,这个时候就会出现数据冲突了。
解决的办法就是设置参数:
discovery.zen.minimum_master_nodes: 3 |
(3超过一半的节点数),那么当两个机房的连接断了之后,就会以大于等于3的机房的master为主,另外一个机房的节点就停止服务了。
对于自动服务这里不难看出,如果把节点直接暴露在外面,不管怎么切换master,必然会有单节点问题。所以一般我们会在可提供服务的节点前面加一个负载均衡。
意思就是说,你只需要在每个节点配置好了集群名称,节点名称,互相通信的节点会根据es自定义的服务发现协议去按照多播的方式来寻找网络上配置在同样集群内的节点。
和其他的服务发现功能一样,es是支持多播和单播的。多播和单播的配置分别根据这几个参数:
discovery.zen.ping.multicast.enabled: false discovery.zen.fd.ping_timeout: 100s discovery.zen.ping.timeout: 100s discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.unicast.hosts: ["192.168.15.59", “192.168.15.60”] |
多播是需要看服务器是否支持的,由于其安全性,其实现在基本的云服务(比如阿里云)是不支持多播的,所以即使你开启了多播模式,你也仅仅只能找到本机上的节点。
单播模式安全,也高效,但是缺点就是如果增加了一个新的机器的话,就需要每个节点上进行配置才生效了。
内存对于Elasticsearch来说绝对是重要的,用于更多的内存数据提供更快的操作。而且还有一个内存消耗大户-Lucene,Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。
最后标准的建议是把50%的内存给elasticsearch,剩下的50%也不会没有用处的,Lucene会很快吞噬剩下的这部分内存。不要超过32G
http://kibana.logstash.es/content/elasticsearch/principle/auto-discovery.htmlhttps://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discoveryhttp://www.cnblogs.com/yjf512/p/4865930.html