分片数制定
- 每个分片占用的硬盘容量不超过 32G,如果索引的总容量在 500G 左右,那分片大小在 16 个左右即可;
- 一般都设置分片数不超过节点数的 3 倍;
推迟分片分配
- 对于节点瞬时中断的问题,默认情况,集群会等待一分钟来查看节点是否会重新加入,如果这个节点在此期间重新加入,重新加入的节点会保持其现有的分片数据,不会触发新的分片分配。这样就可以减少 ES 在自动再平衡可用分片时所带来的极大开销。通过修改参数 delayed_timeout ,可以延长再均衡的时间
- 批量数据提交,ES 提供了 Bulk API 支持批量 *** 作,当我们有大量的写任务时,可以使用 Bulk 来进行批量写入。Bulk 默认设置批量提交的数据量不能超过 100M,单次批处理的数据大小应从 5MB~15MB 逐渐增加,当性能没有提升时,把这个数据量作为最大值;
- 减少 Refresh 的次数,Lucene 在新增数据时,采用了延迟写入的策略,默认情况下索引的 refresh_interval 为1 秒,如果我们对搜索的实效性要求不高,可以将 Refresh 周期延长,例如 30 秒。但这同时意味着需要消耗更多的 Heap 内存
- 加大 Flush 设置,Flush 的主要目的是把文件缓存系统中的段持久化到硬盘,当 Translog 的数据量达到512MB 或者 30 分钟时,会触发一次 Flush。index.translog.flush_threshold_size 参数的默认值是 512MB,我们进行修改。增加参数值意味着文件缓存系统中可能需要存储更多的数据,所以我们需要为 *** 作系统的文件缓存系统留下足够的空间。
- 减少副本的数量,如 果 我 们 需 要 大 批 量 进 行 写 入 *** 作 , 可 以 先 禁 止 Replica 复 制 , 设 置index.number_of_replicas: 0 关闭副本。在写入完成后,Replica 修改回正常的状态
- 不要超过物理内存的 50%
- 堆内存的大小最好不要超过 32GB
Elasticsearch 的 master 选举流程
Elasticsearch 的选主是 ZenDiscovery 模块负责的,主要包含 Ping(节点之间通过这个 RPC 来发现彼此)
和 Unicast(单播模块包含一个主机列表以控制哪些节点需要 ping 通)这两部分
对所有可以成为 master 的节点(node.master: true)根据 nodeId 字典排序,每次选举每个节点都把自
己所知道节点排一次序,然后选出第一个(第 0 位)节点,暂且认为它是 master 节点。
如果对某个节点的投票数达到一定的值(可以成为 master 节点数 n/2+1)并且该节点自己也选举自己,
那这个节点就是 master。否则重新选举一直到满足上述条件。
master 节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理;data 节点可以关闭 http
功能。
“脑裂”问题可能的成因: 网络问题:集群间的网络延迟导致一些节点访问不到 master,认为 master 挂掉了从而选举出新的
master,并对 master 上的分片和副本标红,分配新的主分片
节点负载:主节点的角色既为 master 又为 data,访问量较大时可能会导致 ES 停止响应造成大面积延
迟,此时其他节点得不到主节点的响应认为主节点挂掉了,会重新选取主节点。
内存回收:data 节点上的 ES 进程占用的内存较大,引发 JVM 的大规模内存回收,造成 ES 进程失去
响应。
脑裂问题解决方案:
减少误判:discovery.zen.ping_timeout 节点状态的响应时间,默认为 3s,可以适当调大,如果 master
在该响应时间的范围内没有做出响应应答,判断该节点已经挂掉了。调大参数(如 6s,
discovery.zen.ping_timeout:6),可适当减少误判。
选举触发: discovery.zen.minimum_master_nodes:1
该参数是用于控制选举行为发生的最小集群主节点数量。当备选主节点的个数大于等于该参数的值,
且备选主节点中有该参数个节点认为主节点挂了,进行选举。官方建议为(n/2)+1,n 为主节点个数
(即有资格成为主节点的节点个数)
角色分离:即 master 节点与 data 节点分离,限制角色
主节点配置为:node.master: true node.data: false
从节点配置为:node.master: false node.data: true
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)