前言

本篇主要聊聊ES生产环境的一些规划,以及ES的集群搭建。

一 环境规划

1.1 磁盘的选型

  • 固态硬盘(SSD) 提供最佳“热”工作负载的性能。
  • 普通磁盘(HDD) 成本低,用于“暖”和“冷”数据存储。

注意:RAID0 可以提高性能。RAID 是可选的,因为 Elastic 默认为 N + 1 分片复制策略。

为了追求硬件级别的高可用性,可以接受标准性能的 RAID 配置(例如 RA1/10/50 等)。不建议,副本机制已经保证了高可用

1.2 内存规划

1.2.1 JVM Heap

存储有关集群索引、分片、段和 fielddata 数据。

建议:可用 RAM 的 50%,最多最大 30GB RAM,以避免垃圾回收。

官方文档最大指 32 GB:

https://www.elastic.co/guide/en/elasticsearch/guide/master/heap-sizing.html

1.2.2 操作系统缓存

Elasticsearch 将使用剩余的可用内存来缓存数据(Lucene 使用), 通过避免在全文检索、文档聚合和排序环节的磁盘读取,极大地提高了性能。

1.3 cpu规划

大多数 Elasticsearch 部署往往对 CPU 要求不高。因此,相对其它资源,具体配置多少个(CPU)不是那么关键。你应该选择具有多个内核的现代处理器,常见的集群使用两到八个核的机器。

如果你要在更快的 CPUs 和更多的核心之间选择,选择更多的核心更好。多个内核提供的额外并发远胜过稍微快一点点的时钟频率。

1.4 带宽规划

快速可靠的网络显然对分布式系统的性能是很重要的。 低延时能帮助确保节点间能容易的通讯,大带宽能帮助分片移动和恢复。现代数据中心网络(1 GbE, 10 GbE)对绝大多数集群都是足够的。

即使数据中心们近在咫尺,也要避免集群跨越多个数据中心。绝对要避免集群跨越大的地理距离。

Elasticsearch 假定所有节点都是平等的—并不会因为有一半的节点在150ms 外的另一数据中心而有所不同。更大的延时会加重分布式系统中的问题而且使得调试和排错更困难。

和 NAS 的争论类似,每个人都声称他们的数据中心间的线路都是健壮和低延时的。这是真的—直到它不是时(网络失败终究是会发生的,你可以相信它)。 从我们的经验来看,处理跨数据中心集群的麻烦事是根本不值得的。

1.5 集群规模和容量规划预估方法

容量规划——预估集群中每个节点的分片数、内存及存储资源。

吞吐量规划——以预期的延迟和吞吐量估算处理预期操作所需的内存,计算和网络资源。

1.5.1 数据量预估

第一,问自己几个问题:

  • 您每天将索引多少原始数据(GB)?
  • 您将保留数据多少天?
  • 每天增量数据是多少?
  • 您将强制执行多少个副本分片?
  • 您将为每个数据节点分配多少内存?
  • 您的内存:数据比率是多少?

第二,预留存储以备错误。(Elastic 官方推荐经验值)

  • 预留 15%警戒磁盘水位空间。
  • 为错误余量和后台活动预留+ 5%。
  • 保留等效的数据节点以处理故障。

第三,容量预估计算方法如下:

  • 总数据量(GB) = 原始数据量(GB) /每天 X 保留天数 X 净膨胀系数 X (副本 + 1)
  • 磁盘存储(GB) = 总数据量(GB)* ( 1 + 0.15 + 0.05)
  • 数据节点 = 向上取整(磁盘存储(GB)/ 每个数据节点的内存量 / 内存:数据比率)+ 1

Tips:腾讯云 在 2019 4 月的 meetup 分享中建议:磁盘容量大小 = 原始数据大小 * 3.38。

1.5.2 分片预估

第一,问自己几个问题:

  • 您将创建多少索引?
  • 您将配置多少个主和副本分片?
  • 您将在什么时间间隔旋转索引?
  • 您将保留索引多长时间?
  • 您将为每个数据节点分配多少内存?

第二,经验值(Elastic 官方推荐)

  • 每 GB JVM 堆内存支持的分片数不超过 20 个。
  • 每个分片大小不要超过 50GB。推荐阅读:https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster

Tips:

  • 将小的每日索引整合为每周或每月的索引,以减少分片数。
  • 将大型(> 50GB)每日索引分拆分成小时索引或增加主分片的数量。

第三,分片预估方法如下:

  1. 总分片数 = 索引个数 X 主分片数 * (副本分片数 +1)X 保留间隔
  2. 总数据节点个数 = 向上取整(总分片数 / (20 X 每个节点内存大小))

1.5.3 搜索吞吐量预估

搜索用例场景除了考虑搜索容量外,还要考虑如下目标:

  • 搜索响应时间;
  • 搜索吞吐量。

这些目标可能需要更多的内存和计算资源。

第一:问自己几个问题

  • 您期望每秒的峰值搜索量是多少?
  • 您期望平均搜索响应时间是多少毫秒?
  • 您期望的数据节点上几核 CPU,每核有多少个线程?

第二:方法论 与其确定资源将如何影响搜索速度,不如通过在计划的固定硬件上进行测量,可以将搜索速度作为一个常数,

然后确定集群中要处理峰值搜索吞吐量需要多少个核。

最终目标是防止线程池排队的增长速度超过了 CPU 的处理能力。

如果计算资源不足,搜索请求可能会被拒绝掉。

第三:吞吐量预估方法

  • 峰值线程数 = 向上取整(每秒峰值检索请求数 _ 每个请求的平均响应时间(毫秒)/1000)
  • 线程队列大小 = 向上取整((每个节点的物理 cpu 核数 _ 每核的线程数 * 3 / 2)+ 1)
  • 总数据节点个数 = 向上取整(峰值线程数 / 线程队列大小)

1.5.4 冷热集群架构

Elasticsearch 可以使用分片分配感知(shard allocation awareness)在特定硬件上分配分片。

索引密集型业务场景通常使用它在热节点、暖节点和冷(Frozen)节点上存储索引,

然后根据业务需要进行数据迁移(热节点->暖节点->冷节点),以完成数据的删除和存档需要。

这是优化集群性能的最经济方法之一,在容量规划期间,先确定每一类节点的数据规模,然后进行组合。

冷热集群架构推荐:

节点类型

存储目标

建议磁盘类型

内存/磁盘比率

热节点

搜索优化

SSD DAS / SAN(> 200Gb / s)

1:30

暖节点

存储优化

HDD DAS / SAN(〜100Gb / s)

1:160

冷节点

归档优化

最便宜的 DAS / SAN(<100Gb / s)

1:1000+

1.5.5 集群节点角色划分

Elasticsearch 节点执行一个或多个角色。通常,当集群规模大时,每个节点分配一个具体角色很有意义。

您可以针对每个角色优化硬件,并防止节点争夺资源。

角色

描述

存储

内存

计算

网络

数据节点

存储和检索数据

极高

主节点

管理集群状态

Ingest 节点

转换输入数据

机器学习节点

机器学习

极高

极高

协调节点

请求转发和合并检索结果

二 docker ES集群搭建(三节点)

2.1 创建相关挂载文件夹

cd  /docker/elasticsearch
for number in `seq 1 3`; do \
mkdir -p ./es${number}/logs \
&& mkdir -p ./es${number}/data; \
done
#es的用户id为1000,授权给所有人
sudo chmod 777 es* -R

2.2 拉取相关镜像

#拉取镜像
docker pull elasticsearch:7.7.0
#拉取镜像
docker pull kibana:7.7.0

2.3 创建安全配置文件

主要是两步,1:创建配置文件参考官网提供,2:运行实例获取证书

2.3.1 elasticsearch.yml

network.host: 0.0.0.0
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.keystore.type: PKCS12
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.type: PKCS12xpack.security.audit.enabled: true
  • network.host 设置允许其他ip访问,解除ip绑定
  • xpack.security 则是安全相关配置,其中ssl的证书需要自己生成

2.3.2 生成elastic-certificates.p12(证书)

#启动一个实例
docker run -dit --name=es elasticsearch:7.7.0 /bin/bash
#进入容器
docker exec -it es /bin/bash
#生成ca: elastic-stack-ca.p12
./bin/elasticsearch-certutil ca
#生成cert: elastic-certificates.p12
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
#拷贝证书到宿主机,后面使用
cd /docker/elasticsearch
docker cp es:/usr/share/elasticsearch/elastic-certificates.p12 .

es提供了生成证书的工具elasticsearch-certutil,我们可以在docker实例中生成它,然后复制出来,后面统一使用

2.4.创建 kibana.yml(监控配置文件)

server.name: kibana
server.host: "0"
# elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.username: kibana
#这里的密码是我们启动集群初始化的密码
elasticsearch.password: hNNuuKBnE1r7xqtIN79B
i18n.locale: zh-CN

2.5.创建编排 docker-compose.yml

version: '3'
services:es01:image: elasticsearch:7.7.0container_name: es01environment:- node.name=es01- cluster.name=es-docker-cluster- discovery.seed_hosts=es02,es03- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- ./es01/data:/usr/share/elasticsearch/data- ./es01/logs:/usr/share/elasticsearch/logs- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12ports:- 9200:9200restart: alwaysnetworks:my-net:ipv4_address: 172.30.0.2es02:image: elasticsearch:7.7.0container_name: es02environment:- node.name=es02- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es03- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- ./es02/data:/usr/share/elasticsearch/data- ./es02/logs:/usr/share/elasticsearch/logs- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12ports:- 9201:9200restart: alwaysnetworks:my-net:ipv4_address: 172.30.0.3es03:image: elasticsearch:7.7.0container_name: es03environment:- node.name=es03- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es02- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- ./es03/data:/usr/share/elasticsearch/data- ./es03/logs:/usr/share/elasticsearch/logs- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12ports:- 9202:9200restart: alwaysnetworks:my-net:ipv4_address: 172.30.0.4kib01:depends_on: - es01image: kibana:7.7.0container_name: kib01ports:- 5601:5601environment:ELASTICSEARCH_URL: http://172.30.0.2:9200ELASTICSEARCH_HOSTS: http://172.30.0.2:9200volumes:- ./kibana.yml:/usr/share/kibana/config/kibana.ymlrestart: alwaysnetworks:my-net:ipv4_address: 172.30.0.5networks:my-net:driver: bridgeipam:driver: defaultconfig:- subnet: 172.30.0.1/24

2.6 启动集群并生成密码

# 编排文件
docker-compose up
# 进入容器设置密码
docker exec -it es01 /bin/bash
#初始化密码,这个需要手工设置比较麻烦
./bin/elasticsearch-setup-passwords interactive
# 查看帮助提示
./bin/elasticsearch-setup-passwords -h
#根据提示我们使用自动生成密码策略
./bin/elasticsearch-setup-passwords auto#生成密码
Changed password for user apm_system
PASSWORD apm_system = XlCcRjHuAz04wIiPsqZJChanged password for user kibana
PASSWORD kibana = hNNuuKBnE1r7xqtIN79BChanged password for user logstash_system
PASSWORD logstash_system = 16fgx7D0gpdQEtizmSYkChanged password for user beats_system
PASSWORD beats_system = AIHin0qm9hbQGv0yfNegChanged password for user remote_monitoring_user
PASSWORD remote_monitoring_user = dLnsltnaCHoMyZS4jOGoChanged password for user elastic
PASSWORD elastic = csb94dDWqa22mg7m1qEK

2.7 辅助命令

# 批量暂停容器,并移除容器
docker ps -a | grep kibana | awk '{print $1 }' | xargs docker  container  stop
docker ps -a | grep kibana | awk '{print $1 }' | xargs docker container rm
# 批量暂停容器,并移除容器
docker ps -a | grep elasticsearch | awk '{print $1 }' | xargs docker  container  stop
docker ps -a | grep elasticsearch | awk '{print $1 }' | xargs docker container rm
# 添加路由网卡
sudo route -n add -net 172.30.0.1/24  -netmask 255.255.254.0  192.168.64.200 

2.8 相关问题

2.8.1忘记密码怎么办?

 #进入机器docker exec -it es01 /bin/bash#创建一个临时的超级用户./bin/elasticsearch-users useradd xxx -r superuser#用这个用户去修改elastic的密码curl -XPUT -u xxx[这个是用户名]:xxx[密码] http://localhost:9200/_xpack/security/user/elastic/_password -H "Content-Type: application/json" -d '
{"password": "q5f2qNfUJQyvZPIz57MZ"
}'

可以进入机器去修改

2.8.2 kibana 登录失败报403?

使用elastic用户登录

ElasticSearch 7.7.0 安装部署相关推荐

  1. MySQL 8.0 安装部署3个注意事项

    墨墨导读:本文分享实际案例中MySQL8.0安装部署时最典型的3个问题,希望对大家有帮助. MySQL 8.0 2016年首次发布,2018年GA版本发布也已经4年多的历程,最新版本已经到8.0.21 ...

  2. 21-win10下ElasticSearch.6.1.0安装SQL插件

    简介:win10下ElasticSearch.6.1.0安装SQL插件 5.安装sql 5.0 es配置 安装es http://blog.csdn.net/qq_21383435/article/d ...

  3. VMware-vRealize-Log-Insight-8.2.0.0安装部署指南

    VMware-vRealize-Log-Insight-8.2.0.0安装部署指南 https://blog.csdn.net/u011775882/article/details/110928142 ...

  4. linux上搭载was应用上传中文文件,受支持的Linux操作系统和WAS ND 9.0安装部署文档的资料说明...

    本文档的主要内容详细介绍的是受支持的Linux操作系统和WAS ND 9.0安装部署文档的资料说明. 从was9.0开始支持的最低版本的red hat Linux系统为6.6且仅支持64位操作系统 计 ...

  5. CentOS 8下 MySQL 8.0 安装部署(亲测)

    MySQL 8正式版8.0.11已发布,官方表示MySQL8要比MySQL 5.7快2倍,还带来了大量的改进和更快的性能!到底谁最牛呢?请看:MySQL 5.7 vs 8.0,哪个性能更牛? 下载地址 ...

  6. 记一次 基于Hadoop 3.3.0 安装部署 Spark 3.0.0 分布式集群

    一.基本信息 官网 http://spark.apache.org/ Apache Spark 官方文档中文版(Spark 2.2.0) http://spark.apachecn.org/#/ Sp ...

  7. elasticsearch 7.8.0 kibana 7.8.0安装部署

    下载es.kibana 在这里 下载elasticsearch 7.8.0 版本 在这里 下载kibana7.8.0版本 下载后的文件:elasticsearch-7.8.0-linux-x86_64 ...

  8. fuel6.0安装部署

    在经过一系列安装openstack方式后,个人觉得fuel的安装方式相对简易,接下来记录下安装部署fuel6.0的过程.本教程适合想把fuel6.0部署后,云主机需要连接外网的需求. 安装virtua ...

  9. vCenter 6.0安装部署

    本文主要测试vCenter 6.0的安装部署,vCenter6.0的坑爹之处是要8G内存才能安装,加上ESXi6.0需要至少4G内存,让我不得不买了2条8G的笔记本内存条,否则都无法完成这个测试.后面 ...

最新文章

  1. k8s 自定义dns_K8S 生态周报| Docker v19.03.10 正式发布
  2. 子商城管理之签到活动
  3. 解密阿里云七武器之高性能消息服务ONS
  4. UVA - 1339 ​​​​​​​Ancient Cipher
  5. 微信小程序获取二维码中URL中带的参数
  6. java对象引用传递和值传递的一些总结
  7. Windows Serer2003域升级到Windows Server2008R2域
  8. 剑与远征服务器维修,剑与远征怎么换区 剑与远征在哪里切换新的服务器
  9. 创建型模式之单例模式
  10. MySQL引擎详解(二)——MyISAM引擎特性
  11. POJ 3624 Charm Bracelet【01背包】
  12. 手把手教你开发图片识别(QT篇)
  13. 条码打印软件中如何设置条形码下面的字符间距?
  14. 中国生物医药产业集群产业战略布局及运营管理模式分析报告2021-2027年
  15. 计算机获取信息的过程是,“获取信息的过程与方法”的教学案例
  16. 【C#】利用读卡器对IC卡进行读写、加密等操作,源码下载
  17. 游戏更新-拖拉机升级 Android
  18. 他山之石 | 小米小爱Query识别
  19. 周记——20150907
  20. 基于redis实现抢红包功能(包括余额退回处理)

热门文章

  1. mysql 表如何分区数据恢复_硬盘重新分区后数据如何恢复?轻松一招搞定!
  2. 获取《王者荣耀》全英雄高清无码图
  3. c# mysql 编码_c# 连接MySQL中文乱码问题的正确方案
  4. 6G白皮书(附免费下载)《6G总体愿景与潜在关键技术》
  5. FEC计算机,fec
  6. bat获取文件名称和路径的方法
  7. [前端笔记——CSS] 12.处理不同方向文本
  8. Kali安装pip以及pip换源
  9. XX公司数据库迁移项目可行性研究与风险评估
  10. 天气预报今天几点下雨_今天天气预报几点下雨