elasticsearch集群

搭建es集群

es集群结构

单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。

        海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点

        单点故障问题:将分片数据在不同节点备份(replica )

elasticsearch集群_第1张图片

es部署

 首先编写一个docker-compose文件

es运行需要修改一些linux系统权限,修改`/etc/sysctl.conf`文件

vi /etc/sysctl.conf

# 添加下面内容

vm.max_map_count=262144

# 执行命令,使之生效

sysctl -p

# 通过docker-compose启动集群

docker-compose up -d

集群状态监控

kibana可以监控es集群,不过新版本需要依赖es的x-pack 功能,配置比较复杂。

这里推荐使用cerebro来监控es集群状态,官方网址:https://github.com/lmenezes/cerebroicon-default.png?t=N2N8https://github.com/lmenezes/cerebro

双击其中的cerebro.bat文件即可启动服务。

访问http://localhost:9000 即可进入管理界面:

输入你的elasticsearch的任意节点的地址和端口,点击connect即可:

创建索引库

PUT /itcast
{
  "settings": {
    "number_of_shards": 3, // 分片数量
    "number_of_replicas": 1 // 副本数量
  },
  "mappings": {
    "properties": {
      // mapping映射定义 ...
    }
  }
}

这只是一个简单的例子,你可以讲hotel的代码移植过来,修改setting就可以

每个索引库的分片数量、副本数量都是在创建索引库时指定的,并且分片数量一旦设置以后无法修改

集群脑裂问题

ES集群的节点角色

elasticsearch中集群节点有不同的职责划分:

elasticsearch集群_第2张图片

ES集群的分布式查询

elasticsearch中的每个节点角色都有自己不同的职责,因此建议集群部署时,每个节点都有独立的角色。

 elasticsearch集群_第3张图片

ES集群的脑裂

默认情况下,每个节点都是master eligible节点,因此一旦master节点宕机,其它候选节点会选举一个成为主节点。当主节点与其他节点网络故障时,可能发生脑裂问题。 为了避免脑裂,需要要求选票超过 ( eligible节点数量 + 1 )/ 2 才能当选为主,因此eligible节点数量最好是奇数。对应配置项是discovery.zen.minimum_master_nodes,在es7.0以后,已经成为默认配置,因此一般不会发生脑裂问题

master eligible节点的作用是什么?

参与集群选主 主节点可以管理集群状态、管理分片信息、处理创建和删除索引库的请求

data节点的作用是什么?

数据的CRUD

coordinator节点的作用是什么?

路由请求到其它节点 合并查询到的结果,返回给用户 

集群分布式存储

当新增文档时,应该保存到不同分片,保证数据均衡,那么coordinating node如何确定数据该存储到哪个分片呢? elasticsearch会通过hash算法来计算文档应该存储到哪个分片:

 

 

_routing默认是文档的id

算法与分片数量有关,因此索引库一旦创建,分片数量不能修改!

新增文档流程:

elasticsearch集群_第4张图片

集群分布式查询

elasticsearch的查询分成两个阶段:

scatter phase:分散阶段,coordinating node会把请求分发到每一个分片

gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户 

elasticsearch集群_第5张图片

分布式新增如何确定分片?

coordinating node根据id做hash运算,得到结果对shard数量取余,余数就是对应的分片

集群故障转移

集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其它节点,确保数据安全,这个叫做故障转移。

master宕机后,EligibleMaster选举为新的主节点。

你可能感兴趣的:(elasticsearch,java,大数据)