ELK 性能(3) — 在 Docker 上运行高性能容错的 Elasticsearch 集群
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 集群的更多相关文章
- 在 Kubernetes 上运行高可用的 Kafka 集群
转载自:https://www.qikqiak.com/post/deploy-kafka-ha-on-k8s/ Apache Kafka 是目前最流行的分布式消息发布订阅系统,虽然 Kafka 非常 ...
- 【集群监控】Docker上部署Prometheus+Alertmanager+Grafana实现集群监控
Docker部署 下载 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.re ...
- docker swarm英文文档学习-8-在集群中部署服务
Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...
- 试试将.NET7编译为WASM并在Docker上运行
之前有听到说Docker支持Wasmtime了,刚好.NET7也支持WASM,就带大家来了解一下这个东西,顺便试试它怎么样. 因为WASM(WebAssembly) 一开始是一个给浏览器的技术,比起J ...
- 在OSX和Windows版本Docker上运行GUI程序
看到很多人在Docker问题区讨论:如何在OS X和Windows的Docker上运行GUI程序, 随手记录几个参考资料: https://github.com/docker/docker/issue ...
- .NET Core 3.0 部署在docker上运行
自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0. 本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docke ...
- linux安装docker,并在docker上运行springboot项目
docker架构示例图 仓库---> 镜像 ---> 容器 一.安装docker 1.通过 uname -r 命令查看你当前的内核版本 uname -r 2使用 root 权限登录 Ce ...
- ELK 性能(4) — 大规模 Elasticsearch 集群性能的最佳实践
ELK 性能(4) - 大规模 Elasticsearch 集群性能的最佳实践 介绍 集群规模 集群数:6 整体集群规模: 300 Elasticsearch 实例 141 物理服务器 4200 CP ...
- 【ELK】【docker】6.Elasticsearch 集群启动多节点 + 解决ES节点集群状态为yellow
本章其实是ELK第二章的插入章节. 本章ES集群的多节点是docker启动在同一个虚拟机上 ====================================================== ...
随机推荐
- [ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project SSMMavenPro: configfile D:\java\PermissionPro\src\main\resources\generatorCo
看看自己的generatorConfig.xml文件是否放错,反正我不小心resources文件放在src目录下,并没有放在main目录下,所有找不带该文件
- nano,pico文本编辑器,debian执行crontab -e
debian执行crontab -e的时候出现: Edit this file to introduce tasks to be run by cron.## Each task to run has ...
- C#中使用WeiFenLuo.WinFormsUI.Docking.dll实现窗口停靠效果
很酷的效果,很值得好好去学习的哈. 重置工具箱: 新建一个WinForm程序,项目名称为TestDockPanelControl.选中Form1窗体后选择工具箱--->>新建个添加选项卡命 ...
- spring amqp初步了解
Rabbitmq简介 生产者会把消息发送给RabbitMQ的交换中心(Exchange),Exchange的一侧是生产者,另一侧则是一个或多个队列,由Exchange决定一条消息的生命周期--发送给某 ...
- Docker学习5-Services – 服务(未完待续)
扩展应用程序并启用负载平衡, 为此,必须在分布式应用程序的层次结构中提升一级:服务.在分布式应用程序中,应用程序的不同部分称为“服务”.例如,一个视频共享站点,它可能包含用于将应用程序数据存储在数据库 ...
- 快速在Ubuntu安装PHP网站
快速安装使用的是tasksel,tasksel是Debian / Ubuntu的工具,安装多个相关软件包作为一个协调的“任务”到你的系统.这个lamp-server^跟taskel这个程序有关.下面是 ...
- sql语句截取字符串
Postgresql 当中有四种方式获取当前时间. 一:now() 通过now()获取的时间是最完整的时间,包括时区,秒也保留到了6位小数. select now(); ...
- Kafka 集群部署
kafka是一个分布式消息队列,需要依赖ZooKeeper,请先安装好zk集群 kafka安装包解压 $ -0.9.0.1.tgz $ -0.9.0.1 /usr/kafka $ cd /usr/ka ...
- 20155238 2016-2017-2 《JAVA程序设计》第十周学习总结
教材学习内容总结 # Java计算机网络基础 计算机网络 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使 ...
- 20155301 Web基础
20155301 Web基础 1.基础问题回答 (1)什么是表单 答: 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素 (2)浏 ...
















