版本说明:
Windows 10 专业版
elasticsearch-7.1.1(Windows X64)
ES通常以集群方式工作,这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力,同时也增加了系统的容错能力及高可用,ES可以实现PB级数据的搜索。
从上图总结以下概念:
结点 ES集群由多个服务器组成,每个服务器即为一个Node结点(该服务只部署了一个ES进程)。
分片 当我们的文档量很大时,由于内存和硬盘的限制,同时也为了提高ES的处理能力、容错能力及高可用能力,我们将索引分成若干分片,每个分片可以放在不同的服务器,这样就实现了多个服务器共同对外提供索引及搜索服务。一个搜索请求过来,会分别从各分片去查询,最后将查询到的数据合并返回给用户。
副本 为了提高ES的高可用同时也为了提高搜索的吞吐量,我们将分片复制一份或多份存储在其它的服务器,这样即使当前的服务器挂掉了,拥有副本的服务器照常可以提供服务。
主结点 一个集群中会有一个或多个主结点,主结点的作用是集群管理,比如增加节点,移除节点等,主结点挂掉后ES会重新选一个主结点。
结点转发 每个结点都知道其它结点的信息,我们可以对任意一个结点发起请求,接收请求的结点会转发给其它结点查询数据。
搭建集群
下边的例子实现创建一个2结点的集群,并且索引的分片我们设置2片,每片一个副本。
下边的例子实现创建一个2结点的集群,并且索引的分片我们设置2片,每片一个副本。
1.结点的三个角色
主结点:master节点主要用于集群的管理及索引 比如新增结点、分片分配、索引的新增和删除等。
数据结点: data 节点上保存了数据分片,它负责索引和搜索操作。
客户端结点:client 节点仅作为请求客户端存在,client的作用也作为负载均衡器,client 节点不存数据,只是将请求均衡转发到其它结点。
通过下边两项参数来配置结点的功能:
node.master: #是否允许为主结点
node.data: #允许存储数据作为数据结点
node.ingest: #是否允许成为协调节点,
四种组合方式:
master=true,data=true:即是主结点又是数据结点
master=false,data=true:仅是数据结点
master=true,data=false:仅是主结点,不存储数据
master=false,data=false:即不是主结点也不是数据结点,此时可设置ingest为true表示它是一个客户端。
2.创建结点 1
解压elasticsearch-7.1.1.zip ,结点1对外服务的http端口是:9200 ;集群管理端口是9300;结点名:es_node_1,elasticsearch.yml内容如下
#集群名称
cluster.name: es-cluster
#节点名称
node.name: es_node_1
#给节点添加额外属性,暂时没用
node.attr.rack: r1
#数据存储位置
path.data: D:\o99o\Elasticsearch\elasticsearch-7.1.1_cluster_node1\data
#日志存储位置
path.logs: D:\o99o\Elasticsearch\elasticsearch-7.1.1_cluster_node1\logs
#网络绑定,这里我绑定 0.0.0.0,支持外网访问
network.host: 127.0.0.1
#对外服务http端口,默认9200
http.port: 9200
#单播节点列表
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301"]
#手动指定可以成为mater的所有节点的name或者ip,这些配置将会在第一次选举中进行计算
cluster.initial_master_nodes: ["127.0.0.1:9300"]
#控制集群在达到多少个节点之后才会开始数据恢复,通过这个设置可以避免集群自动相互发现的初期,
#shard分片不全的问题,假如es集群内一共有5个节点,就可以设置为5,
#那么这个集群必须有5个节点启动后才会开始数据分片,如果设置为3,
#就有可能另外两个节点没存储数据分片
gateway.recover_after_nodes: 2
#删除索引时给出索引名
action.destructive_requires_name: true
#集群节点之间通信端口
transport.tcp.port: 9300
#是否可以成为master节点
node.master: true
#是否允许该节点存储数据,默认开启
node.data: true
#用来在真正对文档进行索引之前做预处理
#如移除某个字段,重命名某个字段等
node.ingest: true
#设置一台服务器能运行的节点数
node.max_local_storage_nodes: 2
# 安装head插件时的必要参数:
http.cors.enabled: true
http.cors.allow-origin: "*"
#允许跨域访问头部信息
http.cors.allow-headers: "X-Requested-With,Content-Type, Content-Length, Authorization"
xpack.ml.enabled: false
3.创建结点2
解压elasticsearch-7.1.1.zip ,结点1对外服务的http端口是:9202 ;集群管理端口是9302;结点名:es_node_2,elasticsearch.yml内容如下
#集群名称
cluster.name: es-cluster
#节点名称
node.name: es_node_2
#给节点添加额外属性,暂时没用
node.attr.rack: r2
#数据存储位置
path.data: D:\o99o\Elasticsearch\elasticsearch-7.1.1_cluster_node2\data
#日志存储位置
path.logs: D:\o99o\Elasticsearch\elasticsearch-7.1.1_cluster_node2\logs
#网络绑定,这里我绑定 0.0.0.0,支持外网访问
network.host: 127.0.0.1
#对外服务http端口,默认9200
http.port: 9201
#单播节点列表
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301"]
#手动指定可以成为mater的所有节点的name或者ip,这些配置将会在第一次选举中进行计算
cluster.initial_master_nodes: ["127.0.0.1:9300"]
#控制集群在达到多少个节点之后才会开始数据恢复,通过这个设置可以避免集群自动相互发现的初期,
#shard分片不全的问题,假如es集群内一共有5个节点,就可以设置为5,
#那么这个集群必须有5个节点启动后才会开始数据分片,如果设置为3,
#就有可能另外两个节点没存储数据分片
gateway.recover_after_nodes: 2
#删除索引时给出索引名
action.destructive_requires_name: true
#集群节点之间通信端口
transport.tcp.port: 9301
#是否可以成为master节点
node.master: true
#是否允许该节点存储数据,默认开启
node.data: true
#用来在真正对文档进行索引之前做预处理
#如移除某个字段,重命名某个字段等
node.ingest: true
#设置一台服务器能运行的节点数
node.max_local_storage_nodes: 2
# 安装head插件时的必要参数:
http.cors.enabled: true
http.cors.allow-origin: "*"
#允许跨域访问头部信息
http.cors.allow-headers: "X-Requested-With,Content-Type, Content-Length, Authorization"
xpack.ml.enabled: false
4.启动测试
为每个结点安装IK分词器,并启动,然后创建索引库并设置分片数。
在一个节点上创建文档,发现在其他节点上也可以查询到数据,还可进行节点的增删测试。
5. 集群的健康
通过访问 GET /_cluster/health 来查看Elasticsearch 的集群健康情况。
用三种颜色来展示健康状态:green:所有的主分片和副本分片都正常运行; yellow:所有的主分片都正常运行,但有些副本分片运行不正常;red:存在主分片运行不正常。
Get请求:http://localhost:9200/_cluster/health
集群配置,详见GitHub:https://github.com/o99o/ElasticSearchTest