十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenSearch与Dashboards实战:从单节点到集群的日志可视化平台搭建

OpenSearch与Dashboards实战:从单节点到集群的日志可视化平台搭建 我大概从2021年就开始折腾OpenSearch了那时候刚爆出Elasticsearch变更许可证的消息不少团队都在观望。后来OpenSearch社区版越做越稳我这边就把内部日志检索和监控可视化平台整体迁了过去。这套组合拳打下来用一句话总结就是OpenSearch负责存储和检索数据Dashboards负责把数据变成图表和仪表盘两者配合起来完全可以替代一套商业版的日志分析平台。这篇内容我会按自己实际搭建的过程来写从选型、装环境、部署单节点、扩展到三节点集群、开启安全认证再把Dashboards接上、导入真实数据做可视化最后说说生产环境的调优和那些年踩过的坑。整个过程偏实战代码和配置都能直接抄适合刚接触OpenSearch的运维、后端和测试同学。1. OpenSearch是什么我为什么从Elasticsearch迁过来选型逻辑与实际兼容性1.1 许可变更与分叉背景先说背景。Elasticsearch从7.11版本开始把协议从Apache 2.0改成了Elastic License简单理解就是你不能再拿它做商业化的托管服务了。这消息一出来很多云厂商和依赖ES做二次产品的团队就很被动。于是2021年AWS牵头把Elasticsearch 7.10.2的代码分叉出来孵化了OpenSearch项目采用Apache 2.0协议完全开源社区驱动。这个分叉时间点卡得很妙7.10.2算是ES 7.x里性能比较稳定的版本后面OpenSearch团队又额外开发了很多新功能比如内置机器学习框架、事件监控、k-NN向量检索等。对于咱们这种自建搜索/日志平台的用户来说最直观的感受就是——功能没落后成本还是零谁不爱。1.2 与Elasticsearch的兼容性差异很多第一次接触OpenSearch的人会问我之前写的ES API、DSL查询、索引配置搬到OpenSearch能用吗从我自己迁移的经验来看90%以上是兼容的。索引API、搜索API、聚合语法基本沿用分片、副本、refresh、translog这些底层概念也一致。Kibana要改成OpenSearch Dashboards但界面逻辑和配置方式几乎一模一样。要注意的几个差异OpenSearch 2.x版本以后默认包含OpenSearch Security插件相当于免费版的安全模块ES这边可是商业功能。文档id生成、字段类型映射这些完全一致。推荐用OpenSearch提供的客户端SDK不过原本用ES REST API去调的代码几乎不用改。1.3 什么时候该选OpenSearch我个人判断的标准是这样的公司没有采购过ES商业版也不想花钱买License的直接上OpenSearch。对数据主权有要求希望完全自托管搜索、日志系统的OpenSearch更合适。如果团队已经重度使用了ES最新商业特性如某些机器学习功能那就得先评估功能替代成本。如果体量很小日志量每天不到几个GB直接Docker跑个单节点OpenSearch省心还不花钱。2. 环境准备版本选择、系统参数与安装方式2.1 版本和机器选型我当前线上用的稳定版本是OpenSearch 2.11系列因为当时2.x已经迭代到比较成熟的阶段k-NN、Segment Replication这些特性都稳定了。建议你们在部署前先去GitHub官方Release页看看最新稳定版2.x的安装包基本都能直接用。机器最低配置角色CPU内存磁盘数量单节点体验2核4GB50GB SSD1台生产集群最小规模4核16GB500GB SSD3台带数据接驳的完整环境8核32GB1TB SSD5台以上磁盘一定选SSD搜索类的随机读写场景对IOPS极其敏感机械盘跑起来你会怀疑人生的。2.2 系统参数调整这部分属于那种配置不对装上了也白搭的环节。OpenSearch底层用的Lucene会创建大量内存映射文件Linux默认的vm.max_map_count根本不够用。# 查看当前值 sysctl vm.max_map_count # 永久调整 echo vm.max_map_count262144 /etc/sysctl.conf sysctl -p同时把进程最大文件描述符调大不然后面并发一上来too many open files会把你折磨死ulimit -n 65535如果是在systemd环境下启动直接在/etc/security/limits.conf里加opensearch soft nofile 65535 opensearch hard nofile 65535另外建议关闭swap至少也要把vm.swappiness调低防止操作系统把JVM进程的内存换到磁盘一旦发生GC基本就是几十秒起步集群分片很容易掉。echo vm.swappiness1 /etc/sysctl.conf sysctl -p2.3 安装包方式 vs Docker有两条路可以走。Docker方式最省事官方镜像直接拉docker pull opensearchproject/opensearch:2.11.1 docker run -d --name opensearch \ -p 9200:9200 -p 9600:9600 \ -e discovery.typesingle-node \ opensearchproject/opensearch:2.11.1但我个人还是建议生产环境用tar.gz或RPM包安装原因有两个一是方便直接调JVM参数和系统内核参数二是不需要额外折腾容器存储卷权限问题排查问题更直接。我线上用的是tar.gz方式下载地址一般在https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/opensearch-2.x.x-linux-x64.tar.gz用wget拉到服务器上解压到/opt/opensearch即可。3. 最小可用配置单节点 OpenSearch 跑通3.1 解压与目录结构我习惯把OpenSearch放在/opt/opensearch目录下解压后目录结构大概长这样/opt/opensearch ├── bin # 启动脚本与插件命令 ├── config # 所有配置文件 ├── data # 节点存储的数据 ├── jdk # 内置的JDK ├── lib # Java运行库 ├── logs # 日志 └── plugins # 插件目录不需要另外装JDK发行包已经内置了Java这一点比早期ES还省事。3.2 修改配置文件核心配置文件是config/opensearch.yml。单节点的最小配置# 集群名称同一集群的节点必须一致 cluster.name: os-cluster # 节点名称建议每台机器不同 node.name: node-1 # 数据和日志路径 path.data: /opt/opensearch/data path.logs: /opt/opensearch/logs # 绑定地址。生产环境建议绑定内网IP network.host: 0.0.0.0 # HTTP端口给客户端和Dashboards用 http.port: 9200 # 传输端口集群节点之间通信用 transport.port: 9300 # 允许单节点运行不参与集群发现 discovery.type: single-node还要把JVM堆内存调一下位置在config/jvm.options。-Xms4g -Xmx4g经验是给机器物理内存的一半但不要超过31GB因为JVM的压缩指针在大于32GB堆时反而会失效GC性能下跌。3.3 启动验证启动之前因为我用的不是root用户先创建专用账户useradd -m -s /bin/bash opensearch chown -R opensearch:opensearch /opt/opensearch su - opensearch cd /opt/opensearch bin/opensearch第一次建议前台跑日志直接刷到屏幕上可以看启动进度。如果看到Node node-1 successfully started就算成功了。验证接口curl -u admin:admin https://localhost:9200这里注意默认发行版开启了安全插件API是HTTPS协议的。如果只想先做功能验证不想纠结证书可以临时关掉安全插件bin/opensearch -Eplugins.security.disabledtrue或者直接把opensearch.yml里的安全配置注释掉。但仅限测试环境生产你一定得把安全打开。4. 从单点到三节点集群配置核心细节4.1 节点角色划分单节点玩通了就开始扩张。集群里的节点建议规划好角色OpenSearch支持以下角色角色作用典型配置cluster_manager管理集群状态、分配分片3台奇数压力不大但必须稳data存储和检索数据按数据量水平扩展ingest负责写入前的数据处理管道可和data合并coordinating接收请求分发到数据节点独立节点可提升并发能力小集群不需要搞太复杂一个节点同时承担manager和data即可。但3个节点里如果有2个同时挂掉集群就会失去法定人数所以生产至少3台起。4.2 集群 discovery 配置三台机器的opensearch.yml配置逻辑如下cluster.name: os-cluster node.name: node-1 # node-2, node-3 node.roles: [cluster_manager, data, ingest] network.host: 0.0.0.0 http.port: 9200 transport.port: 9300 # 种子节点告诉节点怎么找到其他伙伴 discovery.seed_hosts: - 10.0.0.11:9300 - 10.0.0.12:9300 - 10.0.0.13:9300 # 初始集群中可参与选举的master候选 cluster.initial_master_nodes: - node-1 - node-2 - node-3 # 为了避免脑裂最小法定人数一般是 (可用节点数 / 2) 1 discovery.zen.minimum_master_nodes: 2把这三份配置分别改完后依次启动node-1、node-2、node-3。等待几十秒执行curl -u admin:admin https://10.0.0.11:9200/_cluster/health?pretty如果返回的status:green说明集群健康number_of_nodes:3表示三个节点都已加入。4.3 四类常见集群异常搭建集群时最容易遇到四类问题我当年逐个踩过第一节点之间无法互相发现。这时候看日志如果发现connect-timeout优先检查传输端口9300的防火墙和网络安全组再用telnet 10.0.0.12 9300验证连通性。第二脑裂。两个节点都认为自己是主节点写请求会冲突。解决办法就是上面的discovery.zen.minimum_master_nodes保证法定人数才能选出唯一主节点。第三分片无法分配集群状态黄色。通常是副本分片找不到地方放curl _cat/allocation看磁盘空间和分片情况。第四集群状态红色。某个主分片丢失索引无法正常读写解决办法要么把分片强制分配到其他节点要么从快照恢复这个后面细说。5. 安全配置密码、TLS与最小权限5.1 安全插件开启OpenSearch自带的安全插件是opensearch-security在没有外部认证系统的情况下它提供内置用户体系、TLS传输加密和字段级权限控制。第一次启动前需要先手动生成管理员密码避免用默认的admin弱口令cd /opt/opensearch bash plugins/opensearch-security/tools/securityadmin.sh \ -cd config/opensearch-security/ \ -icl -nhnv \ -cacert config/root-ca.pem \ -cert config/kirk.pem \ -key config/kirk-key.pem生成好之后启动OpenSearch访问API需要带用户名密码curl -k -u admin:你的密码 https://localhost:9200此时节点之间的通信也启用了TLS如果日志中出现SSLException赶紧检查节点证书的时间戳和主机名。5.2 Dashboard 安全接入Dashboards这边也要配置对应的安全信息否则连接会被拒绝。在/etc/opensearch-dashboards/opensearch_dashboards.yml里写入server.host: 0.0.0.0 server.port: 5601 opensearch.hosts: [https://10.0.0.11:9200, https://10.0.0.12:9200, https://10.0.0.13:9200] opensearch.ssl.verificationMode: none opensearch.username: kibanaserver opensearch.password: 设置的密码启动Dashboards后浏览器访问http://服务器IP:5601用admin登录就可以进入管理界面。5.3 内置用户和权限安全插件内置了几个预设账号用途不同用户用途admin管理员全权限不能用于日常写入kibanaserverDashboards后台连接OpenSearch使用logstash数据采集端写入专用snapshotrestore快照备份恢复专用我更推荐的做法是新建业务专用用户只给需要的索引权限权限粒度可以做到具体索引和具体操作动作。比如只读用户就可以通过Dashboards的Security页面配置用OpenSearch Dashboards自带的管理界面比直接改YAML直观得多。6. Dashboard可视化平台搭建接入数据并产出图表6.1 Dashboards版本对齐这一步强烈建议用与OpenSearch相同版本的Dashboards不然很可能出现字段解析异常或插件不兼容。安装Dashboards同样建议tar.gz方式wget https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.11.1/opensearch-dashboards-2.11.1-linux-x64.tar.gz tar -xzf opensearch-dashboards-2.11.1-linux-x64.tar.gz -C /opt cd /opt/opensearch-dashboards-2.11.1 bin/opensearch-dashboardsDashboards默认端口5601登录后进入“Home”页面。第一次进入需要创建索引模式才能做可视化。6.2 创建索引模式假设我们已经往OpenSearch里写入了一批nginx访问日志索引名是nginx-access-2025.01.10。在Dashboards左侧菜单进入“Stack Management” - “Index patterns”点击创建索引模式索引模式名称nginx-access-* 时间字段timestamp时间字段千万别选错否则后面做时间范围筛选和趋势图都会失灵。如果日志里没有时间字段就让数据写入端补充一个timestamp字段不然图表基本废了。6.3 构建可视化与仪表板创建完索引模式就可以在Visualize Library里新建可视化。以一个非常常见的场景为例查看最近24小时Nginx请求量和状态码分布。第一步点击“Visualize” - “Create visualization”选择“Line”或者“Bar”选索引模式nginx-access-*。第二步配置指标Metrics参数值聚合方式Count自定义标签请求量第三步配置桶Buckets参数值X轴聚合方式Date Histogram字段timestamp时间间隔1小时第四步点击右上角“Save”存为“Nginx请求趋势”再点击“Dashboard” - “Create dashboard”把这个图加进去。这时候你会发现图表里请求量波动和状态码分布一目了然比自己写脚本统计省了不知道多少时间。再进阶一点你可以用“TSVB”可视化或者“Vega”语法做更精细的报表比如查询延迟的P90、P99或者按照省份Map展示IP归属。7. 生产环境调优与备份恢复经验7.1 JVM堆与线程池堆内存上面说过给一半物理内存别超31GB。额外要注意的是不要给JVM堆之外留太少内存因为Lucene要用堆外内存做文件缓存留太少会导致搜索性能严重下降。线程池方面OpenSearch默认有一套search、write、bulk线程池配置一般不用动。真正要关注的是批量写入的bulk请求大小。刚开始我图省事一次塞10000条结果直接把CPU打满后来改成一次2000~5000条根据响应时间动态调整写入稳定多了。一个简单的写入压测脚本思路from opensearchpy import OpenSearch client OpenSearch( hosts[https://10.0.0.11:9200], http_auth(admin, 密码), use_sslTrue, verify_certsFalse ) actions [ {_index: test-001, _source: {value: i}} for i in range(10000) ] client.bulk(actions)7.2 索引生命周期与分片规划索引不是越多越好分片也不是越大越好。我的经验是单个分片大小控制在30GB~50GB比较合适太大会拖慢恢复速度太小会导致分片数过多管理开销大。按天或按周建索引配合索引生命周期管理ISM策略自动轮转和删除。开启强制段合并减少段数量能提升查询性能。ISM策略在Dashboards的“Index Management”里配置或者通过_plugins/_ism/policiesAPI创建。7.3 快照备份要说哪件事最容易被忽略肯定是备份。我见过不止一次因为磁盘故障导致整个索引丢失的案例所以快照仓库一定要建。首先在opensearch.yml里加path.repo: /mnt/backups/opensearch然后调用API注册curl -k -u admin:密码 -X PUT https://localhost:9200/_snapshot/backup_repo -H Content-Type: application/json -d { type: fs, settings: { location: /mnt/backups/opensearch } }接着创建快照curl -k -u admin:密码 -X PUT https://localhost:9200/_snapshot/backup_repo/snapshot_20250110?wait_for_completiontrue恢复的话一串API的事但务必在测试环境先演练一遍别真出故障了才发现权限不对。8. 运维踩坑记录磁盘水位、堆压力、掉节点8.1 磁盘水位线导致索引只读这是一个非常经典的坑。OpenSearch在磁盘使用率超过一定阈值时会自动把索引变成只读状态防止数据节点写满盘。一旦触发你会发现写入请求疯狂报错{ reason: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)] }解决办法不是删索引而是先清理磁盘空间然后解除只读curl -k -u admin:密码 -X PUT https://localhost:9200/*/_settings -H Content-Type: application/json -d { index.blocks.read_only_allow_delete: null }最佳实践是在集群配置里调高水位线并设置监控告警cluster.routing.allocation.disk.watermark.low: 85% cluster.routing.allocation.disk.watermark.high: 90% cluster.routing.allocation.disk.watermark.flood_stage: 95%8.2 堆内存压力飙升集群跑一段时间会发现JVM堆使用率长期在85%以上伴随频繁的Full GC。我当时排查的链路是先看_cat/nodes?vhname,heapPercent,ramPercent,load_1m确认哪个节点最严重再用_nodes/hot_threads看是否有线程卡在Compaction或搜索上最后确认是否因为分片数量太多数据节点上每个分片都要占用堆。最终方案是设置索引分片分配规则把不同业务的索引分布到不同节点组并关闭大量不用的旧索引{ index.routing.allocation.require.box_type: hot }8.3 节点掉出集群三节点集群最容易出现的一个问题是某个节点因网络抖动或GC停顿被误判为不可达然后被踢出集群等它恢复回来又要重新同步分片非常消耗带宽。排查思路主要是看日志里的disconnected或failed to send配合tcpdump抓一下节点间传输端口9300的流量确认是不是网卡丢包。如果是因为磁盘慢导致GC时间过长优先换SSD或者调低分片数减少单节点负担。另外OpenSearch的cluster.fault_detection.leader_check.interval也可以适当调大避免因为瞬时抖动误判。最后分享一个小技巧。如果你在Dashboards里创建了很多图表发现加载速度变慢先别急着加节点。多半是因为页面打开时发了太多分页聚合请求把每个可视化的“Rows per page”和“Time range”收缩一下用起来会顺滑很多。生产环境最重要的是可预测性我之前就是因为把“最近7天”的查询全部默认拉到仪表盘上结果每次开页面都等于做一次全量聚合后来改成默认加载近1小时再按钮按需拉取体验立竿见影。OpenSearch这套东西真的能扛住日常规模的数据检索需求。你从单节点起步慢慢往里填数据、画图表、加报警它会越来越像一个得心应手的内部数据中台。希望这篇内容能帮你少走一些弯路。
返回列表