ELK 性能(3) — 在 Docker 上运行高性能容错的 Elasticsearch 集群

介绍

在 Docker 上运行高性能容错的 Elasticsearch 集群

内容

通常熟悉的开发流程是:

开发环境(Dev)-> 测试环境(Test)-> 质量环境(QA)-> 生产环境(Production Environment)

我们遇到的问题通常是:

  • 资源没有完全使用
  • 过度预计服务器的数量
  • 开发环境 ≠ 测试环境 ≠ 质量环境 ≠ 生产环境

解决方案是使用容器技术

  • Amazon(AWS)
  • Kubernetes
  • Docker
  • rkt
  • spoon.net

容器与虚拟机的区别

运行官方的 Elasticsearch 容器

默认运行

$ docker run -d elasticsearch
(== $docker run -d elasticsearch:latest)

指定运行版本

$ docker run -d elasticsearch:1.7

为运行实例指定名称

$ docker run --name es_1 -h es_master_1 elasticsearch

设置容器参数

指定容器内存为 2G

$ docker run -d -m 2G elasticsearch

禁止内存交换

$ docker run -d -m 2G --memory-swappiness=0 elasticsearch

指定具体使用的 CPU 核心

$ docker run -d --cpuset-cpus="1,3" elasticsearch

指定 CPU 周期及利用率

$ docker run -d --cpu-period=50000 --cpu-quota=25000 elasticsearch

创建自定义的镜像

Dockerfile:
FROM elasticsearch
ADD ./elasticsearch.yml /usr/share/elasticsearch/config/

构建镜像名

$ docker build -t devops/example

网络控制

指定端口

$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch

绑定host

$ docker run -d elasticsearch -Dnetwork.publish_host=192.168.1.1

$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch -Dnetwork.publish_host=192.168.1.1

$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch -Dnetwork.publish_host=0.0.0.0

网络控制最佳实践

  • 为 Elasticsearch 集群使用独立的网络

  • 为容器使用统一的主机名

      $ docker run -d -h es_node_1 elasticsearch
  • 仅对客户节点暴露 9200 和 9300 端口

  • Elasticsearch 数据(data)和客户(client)节点仅指向主节点(master)

处理存储

存储路径默认使用

/usr/share/elasticsearch/data

默认是不持久化的(not persisted)

重定向到系统目录

$ docker run -d -v  /opt/elasticsearch/data:/usr/share/elasticsearch/data elasticsearch

只使用数据(data)容器

数据节点 Docker 的容量

忽略 Union File System

可以在多个容器间共享

如果容器本身被删除,数据内容仍然得以保持

$ docker create -v /mnt/es/data:/usr/share/elasticsearch/data
--name esdata elasticsearch

高可用集群

Master Only Data Only Data Only Client Only

minimum_master_nodes = N/2 + 1

一些参数:

recovery.after.nodes
recovery.expected.nodes
cluster.routing.allocation.node_concurrent_recoveries
index.unassigned.node_left.delayed_timeout
index.priority
  • Docker 主节点

      $ docker run -d elasticsearch
    -Dnode.master=true
    -Dnode.data=false
    -Dnode.client=false
  • Docker 客户节点

      $ docker run -d elasticsearch
    -Dnode.master=false
    -Dnode.data=false
    -Dnode.client=true
  • Docker 数据节点

      $ docker run -d elasticsearch
    -Dnode.master=false
    -Dnode.data=true
    -Dnode.client=false

集群伸缩

curl -XPUT 'http://localhost:9200/devops/' -d '{
"settings" : {
"index" : {
"number_of_shards" : 4,
"number_of_replicas" : 0
}
}
}'
curl -XPUT 'http://localhost:9200/devops/_settings' -d '{
"index.number_of_replicas" : 1
}'
curl -XPUT 'http://localhost:9200/devops/_settings' -d '{
"index.number_of_replicas" : 2
}'
curl -XPUT 'http://localhost:9200/devops/_settings' -d '{
"index.number_of_replicas" : 1
}'

如果移除 2 个节点

如果仅保留 1 个节点

RAM 缓冲

indices.memory.index_buffer_size: 10%
indices.memory.min_index_buffer_size: 48mb
indices.memory.max_index_buffer_size (unbounded)
indices.memory.min_shard_index_buffer_size: 4mb

值越小,吞吐量越小;值越大,吞吐量越大。

时间相关的数据

仅用 TODAY 与 WEEK 作为关键字进行搜索

curl -XPOST 'http://localhost:9200/_aliases' -d '{
"actions" : [
{ "add" : {"index":"2015-11-23","alias":"today"} },
{ "add" : {"index":"2015-11-23","alias":"week"} }
]}'

在 Elasticsearch 内部,Lucene 存在一种段合并(segment merge)的机制,索引内数据越多,Lucene 里面会创建更多的段(segment),多个小的段合并可以为我们提高搜索的性能。段合并的本质实际上就是移动和拷贝数据。这也意味着需要更多的 I/O 与 CPU ,此时会降低 Elasticsearch 的性能。

多层结构

另外一种处理时间相关的数据可以通过冷热标签来实现。

node.tag=hot node.tag=cold node.tag=cold
curl -XPUT 'localhost:9200/data_2015-11-23' -d '{
"settings": {
"index.routing.allocation.include.tag" : "hot"
}
}'
node.tag=hot node.tag=cold node.tag=cold
curl -XPUT 'localhost:9200/data_2015-11-23/_settings' -d '{
"settings": {
"index.routing.allocation.exclude.tag" : "hot",
"index.routing.allocation.include.tag" : "cold",
}
}'
node.tag=hot node.tag=cold node.tag=cold
node.tag=hot node.tag=cold node.tag=cold
node.tag=hot node.tag=cold node.tag=cold

但是此种方法在多租条件下是无效的

路由

索引
  • 无路由

  • 有路由

查询
  • 无路由

  • 有路由

有路由与无路由查询的性能对比

性能监控

https://github.com/sematext/spm-agent-docker

参考

参考来源:

2016.1 Rafał Kuć - Running High Performance And Fault Tolerant Elasticsearch Clusters On Docker

2015.11 Presentation: Running High Performance and Fault Tolerant Elasticsearch Clusters on Docker

结束

ELK 性能(3) — 在 Docker 上运行高性能容错的 Elasticsearch 集群的更多相关文章

  1. 在 Kubernetes 上运行高可用的 Kafka 集群

    转载自:https://www.qikqiak.com/post/deploy-kafka-ha-on-k8s/ Apache Kafka 是目前最流行的分布式消息发布订阅系统,虽然 Kafka 非常 ...

  2. 【集群监控】Docker上部署Prometheus+Alertmanager+Grafana实现集群监控

    Docker部署 下载 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.re ...

  3. docker swarm英文文档学习-8-在集群中部署服务

    Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...

  4. 试试将.NET7编译为WASM并在Docker上运行

    之前有听到说Docker支持Wasmtime了,刚好.NET7也支持WASM,就带大家来了解一下这个东西,顺便试试它怎么样. 因为WASM(WebAssembly) 一开始是一个给浏览器的技术,比起J ...

  5. 在OSX和Windows版本Docker上运行GUI程序

    看到很多人在Docker问题区讨论:如何在OS X和Windows的Docker上运行GUI程序, 随手记录几个参考资料: https://github.com/docker/docker/issue ...

  6. .NET Core 3.0 部署在docker上运行

    自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0. 本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docke ...

  7. linux安装docker,并在docker上运行springboot项目

    docker架构示例图 仓库---> 镜像 --->  容器 一.安装docker 1.通过 uname -r 命令查看你当前的内核版本 uname -r 2使用 root 权限登录 Ce ...

  8. ELK 性能(4) — 大规模 Elasticsearch 集群性能的最佳实践

    ELK 性能(4) - 大规模 Elasticsearch 集群性能的最佳实践 介绍 集群规模 集群数:6 整体集群规模: 300 Elasticsearch 实例 141 物理服务器 4200 CP ...

  9. 【ELK】【docker】6.Elasticsearch 集群启动多节点 + 解决ES节点集群状态为yellow

    本章其实是ELK第二章的插入章节. 本章ES集群的多节点是docker启动在同一个虚拟机上 ====================================================== ...

随机推荐

  1. redis命令手册

    Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...

  2. 构造方法,this关键字,static关键字,封装

    1.构造方法 定义:构造方法是指实例化对象的方法 语法:[修饰符]  类名(参数){    } 根据有无参数分为有参构造和无参构造 1)有参构造 语法:[修饰符]  类名(type 实例变量,int ...

  3. Linux命令——磁盘管理

    Linux命令--磁盘管理 命令df 作用:查看已挂载磁盘的总容量.使用容量.剩余容量等 参数:-i,查看inodes的使用状况 参数:-h,使用合适的单位显示(推荐) 命令du 作用:查看某个目录或 ...

  4. ArcGIS中的坐标系统定义与投影转换方法

    坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统的GIS数据是不完善的,因此在ArcGI ...

  5. JAVA框架 Mybaits 动态sql

    动态sql 一:if标签使用: 我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接. Mapper配置文件: < ...

  6. Vue复选框的全选

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  7. css 常用单位

    em: 相对于应用在当前元素的字体尺寸,1em 等于当前的字体尺寸,2em 等于当前字体尺寸的两倍,一般浏览器字体大小默认为16px,则2em == 32px: W3原文:font size of t ...

  8. Unable to start a VM due to insufficient capacity

    今天cloudstack中的一个普通用户创建虚拟机时,总是报错:Unable to start a VM due to insufficient capacity ,看management and a ...

  9. 02-Maven安装配置

    1.Maven下载 2.Maven依赖 3.安装Maven 4.Maven目录

  10. 你也可以自己写一个可爱 & 小资风格的Android加载等待自定义View - 转

    http://blog.csdn.net/carson_ho/article/details/77712072