中国企业信息网官方网站,做网站可以用哪些软件,融水做的比较好的网站有哪些,如何免费弄一个网站前言
单机ES做数据存储#xff0c;必然面临两个问题#xff1a;海量数据的存储#xff0c;单点故障。
如何解决这两个问题#xff1f;
海量数据的存储问题#xff1a; 将索引库从逻辑上拆分为N个分片#xff08;shard#xff09;#xff0c;存储到多个节点。单点故障…前言
单机ES做数据存储必然面临两个问题海量数据的存储单点故障。
如何解决这两个问题
海量数据的存储问题 将索引库从逻辑上拆分为N个分片shard存储到多个节点。单点故障问题 将分片数据在不同节点备份replica
缺点是什么 造成资源的消耗的N倍的。
一、搭建ES集群
使用docker容器模拟ES的节点
1、一键启动文件 docker-compose.yml
version: 2.2
services:es01:image: elasticsearch:7.12.1container_name: es01environment:- node.namees01- cluster.namees-docker-cluster- discovery.seed_hostses02,es03- cluster.initial_master_nodeses01,es02,es03- ES_JAVA_OPTS-Xms512m -Xmx512mvolumes:- data01:/usr/share/elasticsearch/dataports:- 9200:9200networks:- elastices02:image: elasticsearch:7.12.1container_name: es02environment:- node.namees02- cluster.namees-docker-cluster- discovery.seed_hostses01,es03- cluster.initial_master_nodeses01,es02,es03- ES_JAVA_OPTS-Xms512m -Xmx512mvolumes:- data02:/usr/share/elasticsearch/dataports:- 9201:9200networks:- elastices03:image: elasticsearch:7.12.1container_name: es03environment:- node.namees03- cluster.namees-docker-cluster- discovery.seed_hostses01,es02- cluster.initial_master_nodeses01,es02,es03- ES_JAVA_OPTS-Xms512m -Xmx512mvolumes:- data03:/usr/share/elasticsearch/dataports:- 9202:9200networks:- elasticvolums:data01:driver: localdata02:driver: localdata03:driver: localnetworks:elastic:driver: bridge2、更改linux系统权限 /etc/sysctl.conf并启动docker
# command
vi /etc/sysctl.conf#添加内容
vm.max_map_count262144#执行命令完成配置
sysctl -p#一键部署docker
docker-compose up -d效果图
3、利用cerebro监控es集群状态
kibana当然可以监控es集群但新版本需要依赖es的 x-pack 功能配置较为复杂。 所以我们使用cerebro监控es集群官网https://github.com/lmenezes/cerebro
使用的是 cerebro-0.9.4
开启 cerebro 双击/bin/cerebro.bat 即可。
访问localhost:9000 我们可以输入任意一个ES地址例如虚拟机IP:9200 4、创建索引库
方式一kibana的DevTools创建索引库
PUT /zengoo
{settings: {number_of_shards: 3, # 分片数量number_of_replicas: 1 # 副本数量},mappings: {properties: {//..mapping映射的定义}}
}方式二利用cerebro创建索引 二、集群脑裂问题
一ES集群的节点角色
节点类型配置参数默认值节点职责master-eligiblenode.mastertrue 备选主节点 主节点可以管理和记录集群状态 决定分片在哪个节点 处理创建和删除索引库的请求 datanode.datatrue 数据节点存储数据、搜索、聚合、CRUD ingestnode.ingesttrue 数据存储之前的预处理 coordinating上面三个都为false则为coordinating节点无 路由请求到其它节点 合并其它节点处理的结果返回用户
二ES集群的分布式查询
ES中的每个节点角色都有自己的不同职责因此建议集群部署时每个节点都有独立的角色。
分布式查询流程
用户 》 负载均衡器 》 coordinating 节点 》 data 节点 》 master-eligible
三集群的脑裂
1、概念 指的是主节点由于网络问题与其他节点失去联系其它节点处于选举时期重新选取一个备用主节点当网络恢复时集群当中可能会产生两个及以上的主节点这就是脑裂。
2、解决方式 通过配置选票条件当选票超过主节点数1当选为主节点因此主节点的数量最好是奇数。discovery.zen.minimum_master_nodes在es7.0后称为默认配置一般不会发生脑裂问题。 三、集群故障转移
1故障转移 集群的master节点会监控集群中的节点状态如果发现有节点宕机会立即将宕机节点的分片数据迁移到其它节点确保数据安全。
我们不需要自己实现故障转移master节点已经实现了故障转移 四、集群分布式存储
当新增文档时应该保存到不同的分片保证数据均衡那么 coordinating node如何确定数据存储到哪个分片上
1负载均衡的原理
ES通过hash算法来计算文档的存储位置shard hash(_routing) % number_of_shards
_routing默认是文档的id算法与分片数量有关因此索引库一旦被创建分片数量就不能修改
2新增文档的流程
用户新增文档id1向coordinating 节点发起请求经过hash运算hash2coordinating 节点路由到分配了2号分片的节点在分配了2号分片的节点存储文档并查询对应的备份节点存储的节点向有2号备份分片备份的节点同步数据主分片与备用分片所在节点公共返回结果给coordinating 节点coordinating 节点将结果返回给用户
五、集群分布式查询
ES查询的两个阶段
scatter phase 分散阶段coordinating node会把请求分发到每个分片上。gather phase 聚集阶段coordinating node汇总data node搜索结果并处理为最终结果集返回用户。