10.10 ES集群
单机ElasticSearch做数据存储面临两个问题:海量数据存储问题、单点故障问题。
- 海量数据存储问题:将索引从逻辑上拆分为N个分片(shard),存储到多个节点
- 单点故障问题:将分片数据在不同节点备份(replica)

10.10.1搭建集群
使用docker模拟多台ES。
0.修改Linux系统权限
es运行需要修改Linux权限
# 打开配置文件
vi /etc/sysctl.conf
# 控制一个进程可以拥有的最大内存区域数量,以保证es正常运行
vm.max_map_count=262144
# 加载修改后的文件,使配置生效
sysctl -p
1.编写docker-compose文件,上传到linux并启动
version: '3'
services:
es01:
image: elasticsearch:8.8.1
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster #es支持集群,名称一致的节点在一个集群
- discovery.seed_hosts=es02,es03 #集群其他节点的ip地址,docker容器互联故可直接使用名称
- 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:8.8.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:8.8.1
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es01
- 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 #使用本地驱动,数据存储在docker所在机器
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
10.10.2集群状态监控
方法一:使用kibana监控es集群,需要依赖es的x-pack功能,比较复杂;
方法二:使用cerebro,官方网址
下载并解压,运行bat文件,即可在9000端口启动cerebro


10.10.3集群职责及脑裂
ES集群的节点角色
elasticsearch中集群节点的职责划分如下:

默认情况下es节点同时具有以上四种角色,可以通过修改默认值修改职责。例如下面示例集群:

脑裂

此时若网络恢复,则同一个集群会出现两个主节点,而两个主节点控制的节点数据不一致,出现问题。
解决方法:
为了避免脑裂,要求选票超过(eligible节点数量+1)/2才能当选为主,因此eligible节点数量最好是奇数。对应配置项是discovery.zen.minimum_master_nodes,在es7.0之后已经是默认配置,故一般不会发生脑裂问题。
10.10.4分布式新增和查询流程
新增文档时应该保存到不同的分片,保证数据均衡。这个工作由coordinating node完成。
具体算法:

分布式新增

分布式查询

10.10.5故障转移

示例:当es01恢复正常时,数据分片也会恢复到原始状态。
