上一篇:ElasticSearch 04 -- 进阶_fengxianaa的博客-CSDN博客


准备3个虚拟机,虚拟机复制参考:虚拟机02--Virtual Box 虚拟机复制_fengxianaa的博客-CSDN博客
我的三台机器,分别是:192.168.56.107、192.168.56.108、192.168.56.109
修改 107 上的 elasticsearch.yml
- # 集群名称,3个节点的cluster.name一样,表示这3个节点是一个集群
- cluster.name: my-es
- # 节点名称,唯一
- node.name: node-1
- # 是否有资格成为主节点,true:有资格竞争主节点的位置
- node.master: true
- #是否存储数据
- node.data: true
- # 限制单个机器上可以开启的ES存储实例的个数,如果在一台机器上搭建集群可以用这个配置
- node.max_local_storage_nodes: 3
- # 暴露一个IP,供外网访问
- network.host: 192.168.56.107
- # http访问的端口号
- http.port: 9200
- # 节点之间沟通端口,默认9300
- transport.tcp.port: 9700
- #es7.x 之后新增的配置,用于节点发现
- discovery.seed_hosts: ["192.168.56.107:9700","192.168.56.108:9700","192.168.56.109:9700"]
- #es7.x 之后新增的配置,初始化一个新的集群时,根据这个配置选举master
- cluster.initial_master_nodes: ["node-1","node-2","node-3"]
- # 集群名称,3个节点的cluster.name一样,表示这3个节点是一个集群
- cluster.name: my-es
- # 节点名称,唯一
- node.name: node-2
- # 是否有资格成为主节点,true:有资格竞争主节点的位置
- node.master: true
- #是否存储数据
- node.data: true
- # 限制单个机器上可以开启的ES存储实例的个数,如果在一台机器上搭建集群可以用这个配置
- node.max_local_storage_nodes: 3
- # 暴露一个IP,供外网访问
- network.host: 192.168.56.108
- # http访问的端口号
- http.port: 9200
- # 节点之间沟通端口,默认9300
- transport.tcp.port: 9700
- #es7.x 之后新增的配置,用于节点发现
- discovery.seed_hosts: ["192.168.56.107:9700","192.168.56.108:9700","192.168.56.109:9700"]
- #es7.x 之后新增的配置,初始化一个新的集群时,根据这个配置选举master
- cluster.initial_master_nodes: ["node-1","node-2","node-3"]
- # 集群名称,3个节点的cluster.name一样,表示这3个节点是一个集群
- cluster.name: my-es
- # 节点名称,唯一
- node.name: node-3
- # 是否有资格成为主节点,true:有资格竞争主节点的位置
- node.master: true
- #是否存储数据
- node.data: true
- # 限制单个机器上可以开启的ES存储实例的个数,如果在一台机器上搭建集群可以用这个配置
- node.max_local_storage_nodes: 3
- # 暴露一个IP,供外网访问
- network.host: 192.168.56.109
- # http访问的端口号
- http.port: 9200
- # 节点之间沟通端口,默认9300
- transport.tcp.port: 9700
- #es7.x 之后新增的配置,用于节点发现
- discovery.seed_hosts: ["192.168.56.107:9700","192.168.56.108:9700","192.168.56.109:9700"]
- #es7.x 之后新增的配置,初始化一个新的集群时,根据这个配置选举master
- cluster.initial_master_nodes: ["node-1","node-2","node-3"]
分别启动这 3 个 ES,启动前先删除 /home/soft/elasticsearch-7.8.0/data 下的数据
107:

108:

109:

查看集群状态:http://192.168.56.107:9200/_cat/health?v

解释:
- cluster: 集群名称
- status: 集群状态,
- green: 健康
- yellow: 缺失副分片
- red: 缺失主分片
- node.total: 在线的节点数量
- node.data: 在线的数据节点数量,elasticsearch.yml中 node.data=true 的是数据节点
- shards: 总分片数量
- pri: 主分片数量
- relo: 迁移的分片数量,正常为 0
- init: 初始化的分片数量,正常为 0
- unassign: 未分配的分片,正常为 0
- pending_tasks: 准备中的任务,比如:迁移分片等,正常为 0
- max_task_wait_time: 任务最长等待时间
- active_shards_percent:正常分片的百分比,一般应该是 100%
修改 Kibana 的配置文件:kibana.yml

然后启动 kibana

浏览器访问:http://192.168.56.107:5601/




java API 访问集群,只是在创建 client 的地方做修改,比如:
- RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
- new HttpHost("192.168.56.107",9200,"http"),
- new HttpHost("192.168.56.108",9200,"http"),
- new HttpHost("192.168.56.109",9200,"http")));
集群下,创建所索引时,默认会自动设置一个主分片和一个副分片,并且不再同一个节点上



在创建索引的时候可以通过 settings 设置分片
在 Kibana 中执行下面命令
- # 1. 删除索引
- DELETE fengxiansheng
-
- # 2. 创建索引时,指定分片数量
- PUT fengxiansheng
- {
- "mappings": {
- "properties": {
- "name":{
- "type": "text"
- }
- }
- },
- "settings": {
- "number_of_shards": 3,
- "number_of_replicas": 1
- }
- }
- # "number_of_shards": 3, 表示有3个主分片
- # "number_of_replicas": 1, 表示每个主分片有1个副分片
Kibana 上查看:

ES的自动分片方式保证了,任何一个节点宕机,都不影响数据的完整性
如果 node-3 宕机,那么它上面的分片会自动转移到 node-1、node-2 上

等一会儿刷新页面

重启 node-3 后,就重新分配两个分片

存储数据时,ES会经过一定的计算,得到分片编号,然后把数据放到指定的分片上
计算规则:分片编号 = 文档id的hash % 主分片数量
假如:一个文档 id 的哈希值是 15,主分片数量是 3,那么这个文档就会存储到 0 号分片上
所以 ES 规定一档分片数量确定,不能修改,否则一旦修改,有些数据就查不到了
正常情况下集群中只会有一个Master,脑裂是指:集群中出现多个Master
原因:Master 短暂的不可用或者连不上
解决:
新增复制一个虚拟机 192.168.56.110,修改 elasticsearch.yml
- # 集群名称,3个节点的cluster.name一样,表示这3个节点是一个集群
- cluster.name: my-es
- # 节点名称,唯一
- node.name: node-4
- # 是否有资格成为主节点,true:有资格竞争主节点的位置
- node.master: true
- #是否存储数据
- node.data: true
- # 限制单个机器上可以开启的ES存储实例的个数
- node.max_local_storage_nodes: 3
- # 暴露一个IP,供外网访问
- network.host: 192.168.56.110
- # http访问的端口号
- http.port: 9200
- # 节点之间沟通端口,默认9300
- transport.tcp.port: 9700
- # 加上110的ip和端口
- discovery.seed_hosts: ["192.168.56.107:9700","192.168.56.108:9700","192.168.56.109:9700","192.168.56.110:9700"]
- #es7.x 之后新增的配置,初始化一个新的集群时,根据这个配置选举master
- cluster.initial_master_nodes: ["node-1","node-2","node-3","node-4"]
启动ES,启动前先删除 /home/soft/elasticsearch-7.8.0/data 下的数据
结果:

Kibana 上查看
