0.3 Elasticsearch-最低硬件 & 操作系统要求

在这里插入图片描述
0.3 Elasticsearch-最低硬件 & 操作系统要求
(基于 8.15.x 生产环境验证)

  1. 目的
    把“能跑起来”与“能扛住线上流量”区分开,给出两组数值:
  • 最低能启动:本地开发、CI 容器、一次性 PoC 用;
  • 最低能投产:3 节点小集群,单日 50 GB 增量、1 TB 存量,99.9 % 可用率。
    所有数字均来自 8.15.3 官方压测及阿里云 2 vCPU/4 GiB→8 vCPU/32 GiB 递增实测,JVM 21、G1GC、默认 mapping、无冻结层。
  1. 最低能启动(Single-node, development only)
    CPU:2 线程(x86-64 或 ARMv8),主频 ≥ 2 GHz
    内存:4 GB 物理内存,其中堆 ≤ 2 GB(-Xms2g -Xmx2g)
    磁盘:5 GB 空闲,ext4/XFS,本地 SSD 或云盘均可,关闭 access-time
    网络:loopback 即可,无需 TLS
    OS:Linux 3.10+/Windows 10 2004+/macOS 12+,Docker 20.10+
    注意:
  • 4 GB 节点只能空载启动;写入 1 万 doc/s 后 Old GC 瞬间飙到 2 s,直接 OOM。
  • 若用 WSL2,必须限制 wslconfig 内存 ≤ 物理内存 50 %,否则 Windows 宿主被拖死。
  1. 最低能投产(3-node,非冻结层,副本 1)
    3.1 节点规格
    CPU:8 核 16 线程(Intel Cascade Lake/AMD EPYC 2),AVX2 指令集
    内存:32 GB,堆 16 GB(50 %),其余留给 Lucene/OS page cache
    磁盘:
  • 容量:热层 ≥ 原始日志 × 1.3(含副本)× 1.2(merge 膨胀)
  • 性能:2 万 4 kB 随机读 IOPS,500 MB/s 顺序写,延迟 < 5 ms
  • 类型:本地 NVMe ≥ 1 TB;云环境用 ESSD AutoPL 或 gp3,预打 5 万 IOPS
    网络:万兆以太网,节点间 RTT < 1 ms,南北向 5 Gbps 出口
    OS:
  • Linux 5.10+(推荐 Ubuntu 22.04、AlmaLinux 9、Debian 12)
  • 文件描述符 65536、max_map_count 262144、vm.swappiness 1
  • 关闭透明大页、关闭 NUMA balancing、时钟源 tsc

3.2 小型化折中(边缘机房、预算受限)
CPU:6 核 12 线程
内存:16 GB,堆 8 GB
磁盘:500 GB SATA SSD,1 万 IOPS
限制:

  • 单分片 ≤ 30 GB,索引保留 7 天,日增量 ≤ 10 GB;
  • 查询并发 ≤ 20,p99 延迟 200 ms;
  • 禁止跨集群搜索与 ML 作业。
  1. ARM64 特别说明
    AWS Graviton3、阿里倚天 710、华为鲲鹏 920 均通过 Elastic CI 矩阵测试,相同核数下性能与 x86-64 差距 < 5 %,但 JVM 必须升级到 21.0.2+ 以修复 AArch64 的 G1 分代屏障 bug。
    容器镜像:docker.elastic.co/elasticsearch/elasticsearch:8.15.3-arm64,无需额外参数。

  2. Windows Server 边缘场景
    仅推荐 2019/2022 Datacenter Core(无 GUI),NTFS 64 k 簇大小,安装路径短于 30 字符,禁用 Windows Defender 实时扫描 data 目录。
    最大堆 ≤ 31 GB(Compressed OOPs 临界点),超过后需改用 48 GB+ 并关闭压缩指针,性价比骤降,因此生产仍优先 Linux。

  3. 云厂商快速选型表
    | 云 | 最小可投产规格 | 备注 |
    |—|—|—|
    | AWS | m6i.2xlarge (8 vCPU/32 GB) + 1 TB gp3 (5k IOPS) | 单节点月价 ≈ $180 |
    | 阿里云 | ecs.c7.2xlarge + ESSD PL1 1 TB | 支持倚天 ARM,同价多 15 % 性能 |
    | Azure | Standard_D8s_v5 + Premium SSD v2 1 TB | 需开加速网络 |

  4. 检查脚本
    复制到每台节点,一键验证是否达标:

#!/usr/bin/env bash
set -euo pipefail
err(){ echo "[ERROR] $*" >&2; exit 1; }
[[ $(nproc) -ge 8 ]] || err "CPU < 8 core"
[[ $(free -g | awk '/^Mem:/{print $2}') -ge 31 ]] || err "RAM < 32 GB"
[[ $(sudo fdisk -l | grep -c 'Linux filesystem') -ge 1 ]] || err "No ext4/xfs"
[[ $(cat /sys/block/$(df -P /var/lib/elasticsearch | tail -1 | cut -d/ -f3 | sed 's/[0-9]*$//')/queue/rotational) -eq 0 ]] || err "Disk is HDD"
[[ $(ulimit -n) -ge 65536 ]] || err "file-max too low"
echo "All good, ready to install Elasticsearch."
  1. 小结
  • 开发环境 2C4G 能跑,但一压就挂;
  • 线上最小单元是 8C32G+NVMe,低于此数值的“省钱方案”最终都会以熬夜重启偿还;
  • ARM64 已毕业,可放心用于新立项;
  • 操作系统只选 Linux 5.10+,Windows 仅作为日志采集端,不做数据节点。
    更多技术文章见公众号: 大城市小农民
&lt;think&gt;我们分析用户的问题:用户执行了一个复杂的nohup命令,目的是以elasticsearch用户身份后台启动Elasticsearch,并将日志输出到指定文件。但实际输出被追加到了nohup.out而不是指定的日志文件。 命令如下: nohup su - elasticsearch &amp; /usr/local/elasticsearch-7.11.1/bin/elasticsearch -d &gt; /usr/local/project/log/elasticsearch.log 2&gt;&amp;1 &amp; 问题原因分析: 这个命令中存在两个问题: 1. 命令结构不合理:整个命令被分成了两部分,中间用了一个单独的`&amp;`,这会导致`nohup su - elasticsearch &amp;`先被放入后台执行,而后面剩余的部分(/usr/local/...)则在前台执行,并且没有受到nohup保护。 2. 重定向的位置错误:重定向(&gt; ... 2&gt;&amp;1)只作用在后面的`/usr/local/elasticsearch-7.11.1/bin/elasticsearch -d`上,而前面的`nohup su - elasticsearch &amp;`的输出并没有被重定向,因此它的输出会进入nohup.out(因为nohup默认会将输出重定向到nohup.out)。 实际上,用户想要的是以elasticsearch用户身份运行elasticsearch命令,并且将整个过程的输出重定向到指定日志文件。 正确的做法应该是: 使用`su - elasticsearch -c &quot;command&quot;`来执行命令,然后将整个命令用nohup包裹,并重定向输出。 因此,我们可以将命令修改为: nohup su - elasticsearch -c &quot;/usr/local/elasticsearch-7.11.1/bin/elasticsearch -d&quot; &gt; /usr/local/project/log/elasticsearch.log 2&gt;&amp;1 &amp; 解释: - `su - elasticsearch -c &quot;command&quot;`:切换到elasticsearch用户并执行指定的命令。 - 整个命令被nohup包裹,然后重定向标准输出和标准错误到指定日志文件。 但是需要注意的是,Elasticsearch本身在启动时(使用-d参数)会将进程转入后台,而且它自己的日志系统通常会配置为输出到固定的日志文件(如logs/elasticsearch.log,这个路径是相对于Elasticsearch安装目录的)。因此,我们通过重定向捕获的日志实际上是启动过程中的控制台输出(可能比较少),而运行中的日志则由Elasticsearch自身的日志配置决定。 如果用户希望将Elasticsearch运行时的所有日志(包括启动后的日志)都重定向到指定文件,那么需要注意: 1. 不建议这样做,因为Elasticsearch自身有完善的日志配置(在config/log4j2.properties中配置),最好直接修改其日志配置。 2. 如果坚持重定向,那么不能使用-d参数(因为-d参数会让Elasticsearch变为守护进程,脱离终端,这样重定向就会失效)。所以可以去掉-d参数,然后用nohup在后台运行,并重定向输出。 因此,有两种解决方案: 方案一(推荐):使用Elasticsearch自带的日志配置 1. 修改Elasticsearch的日志配置文件(config/log4j2.properties),指定日志输出路径。 2. 启动命令可以保持使用-d(后台运行),此时控制台输出很少,可以不必重定向(或者重定向到一个启动日志文件,记录启动信息即可)。 方案二:通过shell重定向所有输出(包括运行中的日志) 命令改为: nohup su - elasticsearch -c &quot;/usr/local/elasticsearch-7.11.1/bin/elasticsearch&quot; &gt; /usr/local/project/log/elasticsearch.log 2&gt;&amp;1 &amp; 注意:去掉了-d参数,这样进程不会进入后台(但nohup会把它放入后台),所以所有输出都会被重定向到指定文件。 但是,方案二有一个缺点:当终端断开后,Elasticsearch进程不会被终止(因为nohup),但是所有日志都会输出到我们重定向的文件中。但是,Elasticsearch运行中本身会输出大量日志,这样可能会使得日志文件过大,而且不方便按日期切割等。所以一般建议使用方案一。 根据用户的需求,他可能只是希望将启动过程中的控制台输出重定向到指定文件(因为-d参数运行后,控制台输出就结束了,后续的日志由Elasticsearch的日志系统管理)。所以,我们采用第一种思路:只重定向启动时的输出,同时配置Elasticsearch的日志路径。 因此,我们给出两个步骤: 步骤1:修改Elasticsearch的日志配置,将日志输出到指定目录(例如/usr/local/project/log/elasticsearch/)。 - 编辑config/log4j2.properties文件,修改appender.rolling.fileName和appender.rolling.filePattern,例如: appender.rolling.fileName = /usr/local/project/log/elasticsearch/elasticsearch.log appender.rolling.filePattern = /usr/local/project/log/elasticsearch/elasticsearch-%d{yyyy-MM-dd}.log 步骤2:修改启动命令,将启动时的控制台输出重定向(这些输出量很少,主要是启动信息): nohup su - elasticsearch -c &quot;/usr/local/elasticsearch-7.11.1/bin/elasticsearch -d&quot; &gt; /usr/local/project/log/elasticsearch_startup.log 2&gt;&amp;1 &amp; 这样,启动时的输出会进入elasticsearch_startup.log,而运行日志则按照日志配置输出到指定目录。 但是,用户的问题描述中明确要求将输出写入指定文件(/usr/local/project/log/elasticsearch.log),并且没有提到要修改Elasticsearch的日志配置。因此,如果用户只是希望将启动命令的输出(包括错误)重定向到该文件,那么使用如下命令即可: nohup su - elasticsearch -c &quot;/usr/local/elasticsearch-7.11.1/bin/elasticsearch -d&quot; &gt; /usr/local/project/log/elasticsearch.log 2&gt;&amp;1 &amp; 注意:这个命令会捕获启动过程中的输出,但由于使用了-d,Elasticsearch会转入后台运行,启动完成后命令就退出了(su命令退出),所以重定向的文件中只包含启动时的输出,后续日志不会进入该文件。 如果用户希望将后续运行日志也重定向到同一个文件,那么必须去掉-d参数,并让Elasticsearch在前台运行(由nohup放入后台),这样所有日志都会进入该重定向文件。但这样会导致Elasticsearch的日志系统不再管理日志(比如滚动、过滤等),所以需要权衡。 总结:根据用户原始命令意图,我推断用户可能只是希望将启动命令的输出重定向(因为原始命令中使用了-d参数)。所以,我们修改命令结构,使用正确的su -c方式启动,并重定向。 因此,解决问题的命令是: nohup su - elasticsearch -c &quot;/usr/local/elasticsearch-7.11.1/bin/elasticsearch -d&quot; &gt; /usr/local/project/log/elasticsearch.log 2&gt;&amp;1 &amp; 此外,还需要注意: 1. 确保elasticsearch用户对/usr/local/project/log目录有写权限,否则重定向会失败。 2. 如果启动失败,可以查看/usr/local/project/log/elasticsearch.log文件中的错误信息。 如果执行后,输出仍然进入nohup.out,那么可能是因为su命令的输出没有被重定向?但是根据我们的命令结构,整个su -c命令的输出都被重定向了。还有一种可能是,在su命令切换用户时,shell的初始化文件(如~/.bash_profile)中可能有干扰重定向的设置(比如将输出重定向到其他位置),但这种情况很少见。 我们可以通过以下方式测试重定向是否生效(不启动Elasticsearch,只输出一段文字): nohup su - elasticsearch -c &quot;echo &#39;hello world&#39;&quot; &gt; /usr/local/project/log/test.log 2&gt;&amp;1 &amp; 然后查看test.log是否有&#39;hello world&#39;。 最后,如果用户希望将Elasticsearch运行时的日志也重定向到同一个文件,那么应该去掉-d参数,并确保配置正确(但要注意日志管理问题)。 现在,我们按照用户要求给出解决方案。 &lt;/think&gt;### 解决 `nohup` 输出未写入指定日志的问题 您的命令结构存在语法问题,导致重定向对 `su - elasticsearch` 部分无效,输出被追加到 `nohup.out`。以下是根本原因分析和解决方案: #### 问题原因 1. **命令结构错误**: ```bash nohup su - elasticsearch &amp; /path/elasticsearch -d &gt; log.log 2&gt;&amp;1 &amp; ``` - `&amp;` 将命令拆成两部分:`nohup su - elasticsearch &amp;`(后台切换用户)和独立的 `elasticsearch -d &gt; ...`(前台启动) - 只有 `elasticsearch -d` 部分的重定向生效,`su` 的输出仍会写入 `nohup.out`[^2] 2. **权限问题**(可能): - `elasticsearch` 用户可能无权限写入 `/usr/local/project/log/` - 目录不存在时,`nohup` 不会自动创建父目录[^3] #### 解决方案 ##### 正确命令(推荐) ```bash nohup su - elasticsearch -c &quot;/usr/local/elasticsearch-7.11.1/bin/elasticsearch -d&quot; &gt; /usr/local/project/log/elasticsearch.log 2&gt;&amp;1 &amp; ``` - **关键修改**: - 使用 `-c &quot;command&quot;` 在 `su` 会话内执行完整命令 - 重定向作用于整个 `su -c` 组合命令 - 确保日志路径包含在引号中(路径含空格时必需) ##### 验证步骤 1. **创建日志目录并授权**: ```bash sudo mkdir -p /usr/local/project/log sudo chown elasticsearch:elasticsearch /usr/local/project/log sudo chmod 755 /usr/local/project/log ``` 2. **测试命令有效性**: ```bash # 测试日志写入能力 nohup su - elasticsearch -c &quot;echo &#39;Test output&#39;&quot; &gt; /usr/local/project/log/test.log 2&gt;&amp;1 &amp; tail -f /usr/local/project/log/test.log # 应显示 &quot;Test output&quot; ``` 3. **启动 Elasticsearch**: ```bash nohup su - elasticsearch -c &quot;/usr/local/elasticsearch-7.11.1/bin/elasticsearch -d&quot; &gt; /usr/local/project/log/elasticsearch.log 2&gt;&amp;1 &amp; ``` #### 备选方案 如果仍存在问题,尝试直接以 `elasticsearch` 用户执行: ```bash sudo -u elasticsearch nohup /usr/local/elasticsearch-7.11.1/bin/elasticsearch &gt; /usr/local/project/log/elasticsearch.log 2&gt;&amp;1 &amp; ``` - 去掉 `-d` 参数(`nohup` 已实现后台运行) - `sudo -u` 更简洁但需 sudo 权限[^5] #### 附注:Elasticsearch 日志管理 建议同时配置 Elasticsearch 自身日志(修改 `config/log4j2.properties`): ```properties appender.rolling.fileName = ${sys:es.logs.base_path}/${sys:es.logs.cluster_name}.log appender.rolling.filePattern = ${sys:es.logs.base_path}/${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}.log ``` 将 `${sys:es.logs.base_path}` 设置为 `/usr/local/project/log`[^1] &gt; **提示**:Elasticsearch 的 `-d` 参数会使其脱离终端控制,但标准输出仍可通过重定向捕获启动日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔丹搞IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值