一、Elasticsearch 集群理论基础
我们之所以使用 Elasticsearch,就是希望它能帮助我们存储海量的数据,并且可以很快的将我们需要的数据查找出来,即解决海量数据搜索的问题,其次才是解决海量数据统计的问题。
Elasticsearch 本身的设计就是分布式的,也是高可用性的。Elasticsearch 通过集群,可以将数据分布式存储,虽然一个节点(服务器)的存储空间有限,但是集群就可以增加节点,横向扩展存储空间,同时,集群还能将节点的数据联合进行计算,允许部分节点出现异常但不影响整体的使用,这是 Elasticsearch 高可用性的表现。
有人可能会问,数据分布式存储就可以提高系统的高可用性吗?其实,Elasticsearch 不是简单的将数据分布在若干节点(服务器)上就可以的,这涉及到一些基本概念。当我们建立一个索引时,这个索引将被分成 n 个主分片,每个主分片又各自复制了 m 份,复制的分片简称为副分片,这样一来,主分片、副分片一共 n*(m+1) 个,将主分片、副分片分布在若干节点服务器上,各个服务器节点可以互相访问,互相合作,就构成集群,但是要注意,主分片和它对应的副分片一般不存放在同一节点上,这是因为如果一个分片和它对应的副分片都存放在一起,当这个节点出现问题,其它节点就找不到对应的数据,会造成数据丢失,从而影响Elasticsearch的计算结果,这也不符合集群的理念。
Elasticsearch 搭建集群很简单,每个节点配置一个节点名,各个打算连成集群的节点都配置一样的集群名,然后各个节点可以互相访问,便成为集群。
二、集群配置与搭建
下面以 Windows10 单机为例,建立一个集群,首先按下图建好目录,即是准备3个节点的集群
文件目录 node1、node2、node3 分别存放官方下载的 Elasticsearch 包,如下图
node1 文件夹 config 中的配置文件 elasticsearch.yml 添加以下配置:
#集群名称,保证唯一
cluster.name: logelasticsearch
#节点名称,必须不一样
node.name: node1
#必须为本机的ip地址
network.host: 0.0.0.0
http.host: 0.0.0.0
#服务端口号,在同一机器下必须不一样
http.port: 9210
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9310
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9310","0.0.0.0:9311","0.0.0.0:9312"]
#设置主节点
cluster.initial_master_nodes: node1
http.cors.enabled: true
http.cors.allow-origin: "*"
node2 文件夹 config 中的配置文件 elasticsearch.yml 添加以下配置:
#集群名称,保证唯一
cluster.name: logelasticsearch
#节点名称,必须不一样
node.name: node2
#必须为本机的ip地址
network.host: 0.0.0.0
http.host: 0.0.0.0
#服务端口号,在同一机器下必须不一样
http.port: 9211
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9311
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9310","0.0.0.0:9311","0.0.0.0:9312"]
#设置主节点
cluster.initial_master_nodes: node1
http.cors.enabled: true
http.cors.allow-origin: "*"
node3 文件夹 config 中的配置文件 elasticsearch.yml 添加以下配置:
#集群名称,保证唯一
cluster.name: logelasticsearch
#节点名称,必须不一样
node.name: node3
#必须为本机的ip地址
network.host: 0.0.0.0
http.host: 0.0.0.0
#服务端口号,在同一机器下必须不一样
http.port: 9212
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9312
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9310","0.0.0.0:9311","0.0.0.0:9312"]
#设置主节点
cluster.initial_master_nodes: node1
http.cors.enabled: true
http.cors.allow-origin: "*"
注意:上面的配置中,各个节点的名称不一样,但是集群名称都是 logelasticsearch,这样3个节点的集群配置完成。
打开 powershell 启动第一个节点:
cd E:\es-cluster\node1\bin
./elasticsearch.bat
访问 http://localhost:9210/
再用同样的方式启动第二个节点、第三个节点,分别访问 http://localhost:9211/ 、 http://localhost:9212/
启动head插件:
cd D:\ES\elasticsearch-head-master
npm start
访问 http://localhost:9100/
这时候,集群搭建完成,可以在head插件上看一下效果。
三、建立索引
上面已经建立好一个3个节点的集群,现在建立一个索引,指定分片数是 3,每个分片复制 2份,建立语句如下:
PUT http://localhost:9210/logdb
{
"mappings": {
"properties": {
"ID": {
"type": "integer"
},
"Url": {
"type": "text",
"analyzer":"ik_max_word"
},
"Title": {
"type": "text",
"analyzer":"ik_max_word"
}
}
},
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
打开head插件,可以看到类似以下的效果图:
从上图就可以看出这个集群的相关信息:
- 集群名称是 logelasticsearch
- 集群总共包含3个节点,分别是 node1、node2、node3
- 索引名称是 logdb
- 索引包含3个分片,如上图红色框所示,分别存放在3个节点上,同时每个分片有2个备份,存储在其他节点上
从上图可以看出,如果节点 node1 挂了,那么节点2完全可以找到全部的数据,因为节点2包含了 0、1、2 这三部分数据,
节点三也可以完全找到这三部分数据,这就是为什么集群可以提高系统的稳定性和高可用性。
当这9部分数据都可用时,集群健康为绿色,当复制分片不可用时,集群出于亚健康状态,为黄色,应该及时排查原因,
当主分片出现问题时,集群为红色,应该引起高度重视。