SpringCloud(10)— Elasticsearch集群
一 搭建ES集群
单机的 Elasticsearch 做数据存储,必然面临两个问题:海量数据存储问题,单点故障等
- 海量数据存储问题:将索引库从逻辑上拆分为 N 个分片(shard),存储到多个节点
- 单点故障问题:将分片数据在不同节点上备份(replica)
es 集群中的数据备份使用了错位备份的原理,即当前节点的数据将会备份在其他节点上。这样做保证了当某一节点宕机后,数据仍然完整
1.创建 docker-compose 文件
执行 docker-compose 文件之前,需要修改部分文件权限
# 1.进入文件进行编辑
vim /etc/sysctl.conf
# 2.添加如下内容
vm.max_map_count=262144
# 3.然后执行,让其生效
sysctl -p
创建 docker-compose 文件,复制一下内容到服务器。运行即可。
version: '3.4'
services:
es01:
image: elasticsearch:7.12.1
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: elasticsearch:7.12.1
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- data02:/usr/share/elasticsearch/data
ports:
- 9201:9200
networks:
- elastic
es03:
image: elasticsearch:7.12.1
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- data03:/usr/share/elasticsearch/data
ports:
- 9202:9200
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
2.运行 docker-compose 文件
运行完成后,将创建 Elasticsearch 集群,其中有3台 Elasticsearch 服务器
docker-compose up -d
二 集群状态监控
1.使用 cerebro
这里不再使用 kibana 来监控集群状态(kibana 的配置较为复杂),而是通过 cerebro 来监控。
cerebro 的官方文档:GitHub - lmenezes/cerebro
Docker Hub 地址: https://hub.docker.com/r/lmenezes/cerebro/
使用 docker 部署 cerebro:
# 1.拉取镜像
docker pull lmenezes/cerebro
# 2.运行镜像
docker run --name renebro -p 9000:9000 -d lmenezes/cerebro
# 3.浏览器访问 9000 端口即可
2.访问 cerebro
在主界面输入任一ES集群的地址,即可进入管理界面,
例如:http://192.168.119.101:9200
集群列表中的 实心星星 表示为主节点,其余为 候选节点
3.设置分片
可在创建索引库时设置分片信息
PUT /test
{
"settings": {
"number_of_shards": 3, //分片数量
"number_of_replicas": 1 //副本树量
},
"mappings": {
"properties": {
"firstName": {
"type": "keyword"
},
"lastName": {
"type": "keyword"
}
}
}
}
三 节点角色划分和脑裂
1.节点角色划分
elasticsearch中集群节点的不同的职责划分
elasticsearch中的每一个节点都有着属于自己的不同职责,因此建议集群部署时,每个节点都有独立的角色
2.脑裂问题
默认情况下,每个节点都是master-eligible,因此一旦master节点宕机,其他候选节点会选举一个新的节点成为主节点。
当主节点与其他节点网络故障时,可能发生脑裂问题。
脑裂问题:一个集群中因为某种原因出现了多个主节点,导致数据不同步
为了避免脑裂,需要要求 ”选票“ 数量超过 ( eligible +1 ) / 2 才能当选。因此 eligible 最好为奇数。
对应的配置项为 discovery.zen.minmun_master_nodes。在 es 7.0 以后已经成为了默认配置,因此一般不会发生脑裂。
四 ES集群的分布式存储
1.查看数据位置
新增文档时,应该保存到不同分片,保证数据均衡。
GET /test/_search
{
"query":{
"match_all":{}
},
"explain":true
}
explain:通过 explain 命令,可以看到插入的数据具体在集群上的哪一个分片中。
2.分布式存储算法
elasticsearch 通过 hash 算法来计算文档应该存储到哪个分片中
说明:
- _routing:默认是文档id
- number_of_shards:表示分片数量
- 算法与分片数量有关,因此索引库一旦创建,分片数量不能修改
3.分布式新增流程
4.分布式查询流程
五 故障转移
集群中的 master 节点会监控集群中的节点状态,如果发现宕机,会立即将宕机节点的分片数据迁移到其他节点,确保数据安全。这个机制称之为故障转移
尝试停掉 es01服务,此时 cerebro 给出警告提示:
稍微等待一会儿,es 集群将会自己完成迁移,迁移完成后,索引库状况如下:
这样便保证了集群中数据的安全性
故障转移保证了 es 集群可以任意伸缩且不出现任何故障
Elasticsearch 知识点完结。后续想起什么了再补充