搭建es
不允许root用于运行
创建esuser用户:
useradd esuser
设置密码
passwd esuser
让esuser拥有sudo的权限,需要修改/etc/sudoers文件
需要先给/etc/sudoers添加写的权限
[root@node1 ~]# vim /etc/sudoers
改完之后将写权限删除
三台服务器上操作
在/opt下创建目录es,将es的所有权切换给esuser
[esuser@node1 opt]$ sudo mkdir es
[esuser@node1 opt]$ sudo chown -R esuser:esuser es
使用esuser账户将
elasticsearch-2.2.1.tar.gz
elasticsearch-analysis-ik-1.8.1.zip
elasticsearch-head-master.zip
上传到服务器的esuser家目录
解压elasticsearch-2.2.1.tar.gz到/opt
[esuser@node1 ~]$ tar -zxf elasticsearch-2.2.1.tar.gz -C /opt/es
在三台服务器上依次设置:
cluster.name: escluster
node.name: esnode-1
# 让ES在两个地址发布ES服务
network.host: ["localhost", "node2"]
discovery.zen.ping.unicast.hosts: ["node2", "node3", "node4"]
discovery.zen.minimum_master_nodes: 2 过半:N/2+1
cluster.name: escluster
node.name: esnode-3
# 让ES在两个地址发布ES服务
network.host: ["localhost", "node4"]
discovery.zen.ping.unicast.hosts: ["node2", "node3", "node4"]
discovery.zen.minimum_master_nodes: 2
安装插件
head插件
下载地址:
https://github.com/mobz/elasticsearch-head/archive/master.zip
bin/plugin install file:///home/esuser/elasticsearch-head-master.zip
es/bin/plugin install https://github.com/mobz/elasticsearch-head/archive/master.zip
github使用的是SSLv2
CENTOS6.5 SSLv1
[esuser@node1 ~]$ /opt/es/elasticsearch-2.2.1/bin/plugin install file:///home/esuser/elasticsearch-head-master.zip
ik中文分词器插件
注意:是esuser用户来操作
下载地址:
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v1.8.1/elasticsearch-analysis-ik-1.8.1.zip
如果elasticsearch/plugins不存在就创建该目录,然后执行:
unzip elasticsearch-analysis-ik-1.8.1.zip -d /opt/es/elasticsearch-2.2.1/plugins/ik
在三台服务器上同步。
重启ES即可。
在/etc/profile中配置es的bin目录
ES_HOME
PATH
[esuser@node3 ~]$ sudo vim /etc/profile
export ES_HOME=/opt/es/elasticsearch-2.2.1
export PATH=$PATH:$ES_HOME/bin
前台启动
[esuser@node1 ~ ]elasticsearch
后台启动
[esuser@node1 ~ ]elasticsearch -d
[esuser@node1 ~ ]elasticsearch -d -p mypidfile
kill -9 `cat mypidfile`
访问es:http://node2:9200
访问head插件
http://node2:9200/_plugin/head/
通过单播发现节点
elasticsearch-2.2不支持组播查找其他节点方式。
单播发现(unicast discovery)让ES连接一系列的主机,并试图发现更多关于集群的信息。使用单播时,我们告诉ES集群中其他节点的IP地址以及端口或端口范围。如下配置:
discovery.zen.ping.unicast.hosts: [“10.0.0.3”, “10.0.0.4:9300”, “10.0.0.5[9300-9400]”] |
并非所有的ES集群节点需要出现在单播列表中来发现全部的节点,但是必须为每个节点配置足够的地址,让其认识可用的“口碑传播”节点。例如,如果单播列表中的第一个节点认识7个集群节点中的3个,而单播列表中的第二个节点认识7个节点中的其他4个,那么该节点执行发现操作后就能找到集群中全部7个节点。在发现集群中的部分节点后,ES节点将进行主节点选举。
一旦集群中的节点发现了彼此,会协商谁将成为主节点。
主节点负责管理集群状态,即当前的设置和集群中分片、索引以及节点的状态。
在主节点被选举出来之后,会建立内部的ping机制来确保每个节点在集群中保持活跃和健康,称为错误识别(fault detection)。
所有的节点都有资格成为主节点,除非某个节点的node.master选项设置为false。
当集群中只有一个节点时,该节点先等一段时间,如果没有发现其他任何集群的节点,就将自己选为主节点。
设置主节点的最小数量,可以控制ES在成为健康集群之前,集群中多少个节点有资格成为主节点。
如果节点数量不会随着时间变化,可以将最小数量设置为集群总结点数,一般设置为集群数量的一半+1,也就是N/2+1。通过过半机制防止脑裂。
设置elasticsearch.yml中的
discovery.zen.minimum_master_nodes=N/2+1
可以使用如下的命令确认集群的状态以及哪个是主节点:
$ curl 'localhost:9200/_cluster/state/master_node,nodes?pretty'
{
"cluster_name" : "escluster-1",
"master_node" : "1pF4neAtSDWjyn9tsYOfGg",
"nodes" : {
"DqjdrX-1QSuVkDOj20xarQ" : {
"name" : "esnode-1",
"transport_address" : "192.168.202.101:9300",
"attributes" : { }
},
"nSBWfYeARL6YkBe7er0FZg" : {
"name" : "esnode-3",
"transport_address" : "192.168.202.103:9300",
"attributes" : { }
},
"1pF4neAtSDWjyn9tsYOfGg" : {
"name" : "esnode-2",
"transport_address" : "192.168.202.102:9300",
"attributes" : { }
}
}
}
错误识别:
主节点ping集群中所有其他的节点,而且每个节点也会ping主节点来确认无需选举。
每个节点每隔discovery.zen.fd.ping_interval(默认是1s)发送一个ping请求,等待discovery.zen.fd.ping_timeout(默认是30s)的时间,并尝试最多discovery.zen.fd.ping_retries(默认3)次,如果ping不通,则宣布节点失联,并在需要的时候进行新的分片路由和主节点选举。
一旦一个节点ping不通,节点连不上,ES做的第一件事是自动地将剩下节点中的副本分片升为主分片,因为索引操作会首先更新主分片。
副本分片变为主分片之后,集群就会变为黄色的状态,表明有副本分片没有分配到某个节点。ES下一步需要创建更多的副本分片来保持索引的高可用。
一旦副本分片重新创建,并用于弥补损失的节点,集群将重回绿色状态,全部的主分片和其副本分片都分配到了某个节点。在这段时间之内由于没有数据丢失,整个集群都可用于搜索和索引。如果有丢失的数据,则集群状态转为红色。可以使用多个副本增强抗风险能力。
每个可以成为master的节点都会保有一个集群状态版本号
每个可以成为master的节点都有一个id
选取集群状态版本号高的作为master,如果版本号都一样,则选取id最小的节点成为主节点master。