ES集群搭建(仅供自己参考)
单节点问题:单机的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.1container_name: es02environment:- 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/dataports:- 9201:9200networks:- elastices03:image: elasticsearch:7.12.1container_name: es03environment:- 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/datanetworks:- elasticports:- 9202:9200
volumes:data01:driver: localdata02:driver: localdata03:driver: localnetworks: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节点,使得每一个节点都能均衡的有分片。