SpringCloud(十一)ES 进阶 -- ES集群
单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。
解决方案:
海量数据存储问题:将索引库从逻辑上拆分为N个分片,存储到多个节点。
单点故障问题:将分片数据在不同节点备份。(这样有一个点挂掉,还能保证数据是完整的,如图:比如说node1挂掉了,node1的主数据shard-0在node2上有备份数据,shard-0,shard-1,shard-2组合起来还是完整的数据。)
ES集群搭建方法:链接:https://pan.baidu.com/s/1kdJmUz2R5oxSuEihih1Bzw 提取码:73zy
备注:
1、集群名称一样,ES会自动把它们组成集群
2、集群中另两个点的IP地址,正常的话写ip地址(安装教程中用的是docker在一个虚拟机上,所以直接写的节点名称)
3、初始化主节点,候选主节点
4、最小内存,最大内存都配置成了512MB
5、数据卷地址
6、端口映射
集群状态监控
推荐使用cerebro来监控es集群状态,官方网址:https://github.com/lmenezes/cerebro
cerebro-0.9.4.zip 下载链接:https://pan.baidu.com/s/1Y7oy-8b5Kf0aees24ueURg 提取码:bol3
ES集群的分布式存储
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
教程中部署ES集群时创建了三个ES,es-01 端口 9200 、es-02 端口 9201 、es-03 端口 9202
利用kibana在9200插入3条文档,再用kibana查询所有文档信息
查询9200、9201、9202的所有文档信息时会发现在三个端口查询都会查到这三条数据(三个ES查询共享数据)
那插入的三条文档到底存在哪个es里了呢? 在参数中加一个 explain:true, 可显示文档在哪个es分片中
ES集群的分布式存储工作流程
ES集群的分布式查询流程
ES集群的故障转移(ES集群会自动处理)
当某个节点挂掉时(这里举例node1主节点挂掉了)
当node1节点恢复正常以后,主节点会监控到分片的状态,数据又会迁移会去,但是主节点已经变为node2了不会再变回node1。
备注docker命令:
停到某个es节点:docker-compose stop es01
启动某个es节点:docker-compose start es01