单节点问题:单机的elasticsearch做数据存储,面临的两个问题:海量的数据存储问题、单节点故障。
一个节点存储的数据是有限的。
- 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点
- 单点故障问题:将分片数据在不同节点备份(replica)
集群搭建的compose文件
version: '2.2'
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
networks:
- elastic
ports:
- 9202:9200
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
管理集群的软件:cerebro https://github.com/cerebroapp/cerebro
之后是创建分片和备份分片,创建也是在cerebro上
三 、集群的脑裂问题:
1、集群节点的职责
四、新增和查询
1、新增:在集群上进行新增数据,集群会通过coordinating node(协调节点)计算把这个数据放到那个分片上
通过hash算法计算id得到一个值,然后这个值对shard分片数量取模得到一个分片的id。如果新增一个分片,那么shard值没变,那么始终得到不到新增分片的id。
说明:
- _routing一般是新增数据的id
- 算法与分片的数量有关,那么索引库一旦创建分片数量不能变化
新增流程:
2、查询:如果不是通过id具体的查询,那么在查询的时候不会走计算hash值,然后到相应的分片上去查。而是通过coordinating node(协调节点)将请求路由到所有分片,在每个分片上通过条件查询到相应的数据。再把相应的数据传到coordinating node(协调节点),协调节点将所有的数据进行一个整合,把整合数据返回用户。
五、故障的转移
当节点恢复的时候,它会将一个分片和一个备份重新分配给node1节点,使得每一个节点都能均衡的有分片。