ElasticStack系列之二十 & 数据均衡、迁移、冷热分离以及节点自动发现原理与机制
1. 数据均衡
某个shard分配到哪个节点上,一般来说,是由 ELasticSearch 自行决定的。以下几种情况会触发分配动作:
- 新索引的建立
- 索引的删除
- 新增副本分片
- 节点增减引发的数据均衡
在动态分配的时候有几个默认值需要注意,当然对应的这些默认值都是可以修改的,具体如下:
- ElasticSearch 默认要求所有分片都正常启动成功以后,才可以进行数据均衡操作,否则的话,在集群重启阶段,会浪费太多的流量
- ElasticSearch 默认可以有 2 个任务同时运行数据均衡。如果有节点增减且集群压力不高的情况下,可以适当增大(可通过 cluster.routing.alloction.cluster_concurrent_rebalance 参数来控制)
- ElasticSearch 默认可以有 2 个任务同时运行数据恢复操作,前提是除了主分片重启恢复以外的情况下。所以,节点重启时,可以看到主分片迅速恢复完成,副本分片的恢复却很慢。除了副本分片本身数据要通过网络复制以外,并发线程本身也减少一半(默认同时又4个主分片恢复)。当然这种设置也是有道理的--> 主分片一定是本地恢复,副本分片却需要走网络,带宽是有限的。
- ElasticSearch 默认当数据磁盘使用量占当前磁盘总空间的 85% 时,新索引分片就不会再分配到这个节点上了。在达到 90% 时,就会触发该节点现存分片的数据均衡,把数据挪到其他节点上去。
2. reroute 接口应用(数据迁移)
reroute 接口支持三种指令:allocate、move 和 cancel,我们最常用的就是 allocate 和 move 指令。
allocate 指令:
因为负载过高等原因,有时候个别分片可能长期处于 unassigned 状态,我们就可以手动分配到指定节点上。默认情况下不允许手动分配副本分片,所以如果是 主分片 故障,我们需要单独加一个 allow_primary 选项:
curl -XPOST 192.168.1.92:9201/_cluster/reroute -d '{
"commands": [
{
"allocate": {
"index": "test-index",
"shard": 3,
"node": "192.168.1.95",
"allow_primary": true
}
}
]
}'
注意:
如果是历史数据的话,需要提前确认一下哪个节点上保留有这个分片的实际目录,且目录大小最大,然后手动分配到这个节点上,以此来减少数据的丢失。
move 指令:
因为负载过高,磁盘利用率过高,服务器需要下线,更换磁盘等情况。我们此时需要从该节点一走部分分片数据到其他节点上,那么 move 指令就很有用了:
curl -XPOST 192.168.1.92:9201/_cluster/reroute -d '{
"move": [
{
"allocate": {
"index": "test-index",
"shard": 0,
"from_node": "192.168.1.95",
"to_node": "192.168.1.93"
}
}
]
}'
3. 冷热数据读写分离
ElasticSearch集群一个比较突出的问题是:用户做一次大的查询的时候,非常大量的读 I/O 以及 聚合计算导致机器 Load 升高,CPU 使用率上升,会阻塞到新数据的写入,这个过程甚至会持续几分钟。所以,可能需要仿照MySQL集群一样,进行读写分离。具体步骤如下所示:
- N 台机器做热数据的存储,上面只存放当天的数据。这 N 台热数据节点上的 elasticsearch.yml 中配置: node.tag:hot
- 除今天之外的之前的数据存放到另外 M 台机器上。这 M 台冷数据节点上的 elasticsearch.yml 中配置:node.tag:code
- 模板中控制对新建的索引添加 hot 标签
{
"order": ,
"template": "test-index-2018-*",
"settings": {
"index.routing.allocation.require.tag": "hot"
}
}
4. 每天计划任务更新索引的配置,将 tag 更改为 code,ElasticSearch中的索引会自动迁移到 M 台冷数据节点上
curl -XPUT http://192.168.1.92:/test-index---/_settings -d '{
"index": {
"routing": {
"allocation": {
"require": {
"tag": "code"
}
}
}
}
}'
这样,写操作集中在 N 台热数据节点上,大范围的读操作集中在 M 台冷数据节点上。避免了堵塞影响。
4. 节点自动发现原理与机制
前提概要:
ElasticSearch 是一个 P2P 类型的分布式系统,使用了 gossip 协议。
P2P 含义:即 peer-to-peer , 意为 同等位置 对 同等位置,即常说的点对点类型,各个网络中的节点是互相平等的位置,具体含义可以通过下面介绍的 gossip 协议来进行理解。
gossip含义:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节点可以通过网络连通,最终他们的状态都是一致的,类似于疫情传播的特点。简单的说,要想传播内容就需要有 “种子节点”。“种子节点” 每秒都会随机向其他节点发送自己所拥有的节点列表,以及需要传播的消息。任何新加入的节点,就在这种传播方式下很快地被全网所知道。这个协议的神奇就在它从设计开始就没想到信息一定要传递给所有的节点,但是随着时间的增长,在最终的某一时刻,全网会得到相同的信息。
自动发现机制:
我们知道,ElasticSearch 除了集群状态管理需要 master 节点来控制外,其他所有的请求都可以发送到集群内任意一节点上,这个节点可以自己找到需要转发给哪些节点,并且直接跟这些节点通信。所以,从网络架构及服务配置上来说,构建集群所需要的配置机器简单。在无阻碍的网络下,所有配置了相同 cluster.name 的节点都自动归属到一个集群中。ElasticSearch支持两种自动发现策略,分别如下:
multicast(组播) 方式
只配置 cluster.name 的集群,其实是采用了默认的自动发现协议,即 组播(multicast) 方式。节点会在本机所有网卡接口上,使用组播地址 224.2.2.4 以 port=54328 建立组播发送 clustername 信息。
但是,并不是所有的路由交换设备都支持且开启了组播信息传输!甚至可以说,默认情况下,都是不开启组播信息传输的。
所以在没有网络工程师的情况下,ElasticSearch 以默认组播方式,只有在同一个交换机下的节点,才能自动发现,跨交换机的节点是无法收到组播信息的。
unicast(单播) 方式
ElasticSearch 除了组播方式,还支持 单播(unicast) 方式。配置里需提供几台节点的地址,ElasticSearch 将其视作 gossip router 角色,借以完成集群的发现。由于这只是 ElasticSearch 内一个很小的功能,所以 gossip router 角色并不需要单独配置,每个 ElasticSearch 节点都可以担任。所以,采用单播方式的集群,各节点都需要配置相同的几个节点列表作为 router 即可。配置如下:
discovery.zen.minimum_master_nodes:
discovery.zen.ping.unicast.hosts: ["192.168.1.92", "192.168.1.93"]
ElasticStack系列之二十 & 数据均衡、迁移、冷热分离以及节点自动发现原理与机制的更多相关文章
- Java 设计模式系列(二十)状态模式
Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- 《sed的流艺术之四》-linux命令五分钟系列之二十四
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- ComicEnhancerPro 系列教程二十:用“文件比较”看有损、无损
作者:马健邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程二十:用“文件比较” ...
- 《sed的流艺术之二》-linux命令五分钟系列之二十二
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享
这篇文章是松哥的原创,但是在第一次发布的时候,忘了标记原创,结果被好多号转发,导致我后来整理的时候自己没法标记原创了.写了几百篇原创技术干货了,有一两篇忘记标记原创进而造成的一点点小小损失也能接受,不 ...
- 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...
- Spring Boot入门系列(二十)快速打造Restful API 接口
spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...
- geotrellis使用(二十九)迁移geotrellis至1.1.1版
目录 前言 升级过程 总结 一.前言 由于忙着安装OpenStack等等各种事情,有半年的时间没有再亲密的接触geotrellis,甚至有半年的时间没能畅快的写代码.近来OpenStac ...
随机推荐
- Quartz中时间表达式的设置-----corn表达式 (转)(http://www.cnblogs.com/GarfieldTom/p/3746290.html)
Quartz中时间表达式的设置-----corn表达式 (注:这是让我看比较明白的一个博文,但是抱歉,没有找到原作者,如有侵犯,请告知) 时间格式: <!-- s m h d m w(?) y( ...
- JSON数据格式解析
JSON数据的语法规则 1.数据以键值对的形式 2.数据由逗号分隔 3.花括号保存对象 4.方括号保存数组 以PHP的数组为例: <?php $arr = array( "aaaa&q ...
- Vim列模式(块选择)输入
https://www.ibm.com/developerworks/cn/linux/l-cn-vimcolumn/ https://www.zhihu.com/question/19968224 ...
- curl用法一例 传递代理用户名密码
curl -u bb0e1736d66744495b814b942fd04a80:0e11dda88048ed52cc8758caf06dc6b4 https://jinshuju.net/api/v ...
- Delphi/XE2 使用TIdHttp控件下载Https协议服务器文件[转]
之前的一篇博文详细描述了使用TIdhttp控件下载http协议的文件,在我项目的使用过程中发现对于下载Https协议中的文件与Http协议的文件不同,毕竟Https在HTTP协议基础上增加了SSL协议 ...
- [转帖]UML各种图总结-精华
UML各种图总结-精华 https://www.cnblogs.com/jiangds/p/6596595.html 之前自己以为画图很简单 不需要用心学 现在发现自己一直没有学会一些基础的知识 能力 ...
- React 组件
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 聊聊我怎么系统学习Linux技能并快速提高的
随着电子信息科技时代的发展,学会使用计算机在我们的生活中成为了必不可少的一项技能.而作为计算机中的三大操作系统之一的Linux更是饱受计算机爱好者们的喜爱.今天我们就来和大家一起聊一聊Linux操作系 ...
- BZOJ2819Nim——树链剖分+线段树+Nim游戏
题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...
- BZOJ1124 POI2008枪战Maf(环套树+贪心)
每个点出度都为1,可以发现这张图其实是个环套树森林,树中儿子指向父亲,环上边同向. 首先自环肯定是没救的,先抬出去. 要使死亡人数最多的话,显然若一个点入度为0其不会死亡,而一个孤立的环至少会留下一个 ...