The Good Student！ - Linux系统相关
type: channel
link: https://www.hxy.bj.cn/category/Linux%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3/
items: 灾备容灾体系建设(编制中)
items: ELK 性能优化实践
items: ELK大数据日志分析平台深度解析
items: OpenVPN
items: CentOS7 YUM源配置
items: Linux新增磁盘扩容
items: Centos安装node18版本以上
items: Linux 安装 JDK 1.8
items: ElasticSearch 性能调优
items: Nginx 性能调优

灾备容灾体系建设(编制中)
type: item
date: 2025-11-30T21:59:00+08:00
description: AI摘要 本文讨论了灾备容灾体系的建设，强调了数据在数字信息化建设中的核心地位，并指出了硬件故障、软件错误、网络攻击、自然灾害等因素可能导致的系统崩溃或数据丢失问题。文章分析了公司当前在灾备方面的现状，包括云上生产系统缺乏同城/异地灾备、云下生产系统完全单点、两套系统之间无数据同步和切换能力等问题。提出了建设灾备环境的目标，包括每套生产系统拥有独立灾备、数据恢复点目标（RPO）和业务恢复时间目标（RTO）等，并强调了演练频率和回切能力的重要性。最终目的是在云上生产或云下生产发生整体故障时，能够快速切换/恢复业务与数据，实现对外服务不中断或极短中断。 此内容根据文章生成，仅用于文章内容的解释与总结 灾备容灾体系建设一、背景在当前数字信息化建设中，数据是核心资产。无论是数据中台的运行、数字孪生的建模，还是数字可视化的展示，都需要依赖高质量的数据支持。然而，硬件故障、软件错误、网络攻击、自然灾害等不可预见的因素，都可能导致系统崩溃或数据丢失。灾备演练的核心目标是验证企业在突发情况下的应对能力，确保在最短时间内恢复业务运行，最大限度地减少损失。为保障业务连续性和数据安全性，公司亟需建立健全的灾备容灾体系，确保在突发事件发生时，能够快速检测故障并将业务切换至备用系统，将业务中断时间（RTO）和数据丢失量（RPO）控制在可接受范围内。1. 当前现状云上系统：无同城/异地灾备，依赖单地域单可用区或多可用区但未做应用级容灾云下系统：完全单点，无任何本地或异地备份环境数据库、中间件、静态资源均无跨地域备份与恢复机制缺乏灾备切换SOP与演练，RTO/RPO 未定义且实际趋近于无穷大2. 期望效果为云上、云下两套生产系统分别建设一套灾备环境，实现以下核心目标：目标项具体指标要求每套生产系统拥有独立灾备云上生产 → 云上灾备 （异地云/多云）/ 云下生产 → 云下灾备(异地数据中心)数据恢复点目标（RPO）核心数据库 ≤ 3 分钟（DTS数据通过/binlog复制）关键文件/对象存储 ≤ 5 小时业务恢复时间目标（RTO）关键系统 ≤ 5 分钟切换方式手动切换（DNS/负载均衡/全局流量调度）或可升级为半自动/自动切换演练频率每半年至少进行一次完整切换演练并出具报告回切能力具备支持故障修复后平滑回切至原生产环境最终效果： 无论云上生产还是云下生产发生整体故障，都能在可控时间内将其业务与数据快速切换/恢复到各自的灾备环境，对外服务不中断或极短中断，真正做到“两套系统各自有后路”。二、灾备方案1.主流方案排名方案名称RPO / RTO 典型值成本（相对生产）优点缺点1异地主备（Global Active-Passive）RPO ≤ 5分钟 / RTO 30秒～3分钟1.2～1.6倍改造最小、切换最可靠、演练最简单、100%过等保/监管/审计、成本最低RTO 无法做到秒级，极端情况下有几十秒到几分钟中断2同城双活 + 异地主备（2+1）RPO ≤ 1分钟 / RTO 10秒～1分钟1.8～2.5倍同城基本无感、异地仍有可靠兜底、监管最认可的“高级灾备”模式需要同城两套完整环境，建设和网络要求高，成本明显上升3异地双活/多活（单元化）RPO ≈ 0 / RTO ≤ 5秒2.5～4倍用户完全无感知、真正“业务不停”、极端场景下仍可扛区域级故障技术复杂度极高、业务改造巨大、容易脑裂/双写、演练风险极大、成本最高4三中心两主一备（2主1备）RPO ≤ 1分钟 / RTO ≤ 30秒2.2～3倍两个主中心互为备份+异地灾备，三重保险，监管评分最高建设和运维复杂度高，两个主中心要保持强一致，实际落地和演练都很难5同城双活 + 异地异步容灾RPO ≤ 15分钟 / RTO ≤ 4小时1.5～2倍过渡方案，同城做到高可用，异地成本低异地恢复时间长（几小时），属于“冷灾备”，不满足大部分监管要求2.方案选举2.1 主备灾备技术通常采用一主一备的架构，故障时需切换，用户可能感知等待时间。在这种架构下，主备之间无法同时在线，一旦系统出现问题，需要进行架构切换，用户可能会面临系统切换的等候时间。2.2 双活双活技术通过两套同时在线的架构互为灾备，实现无缝切换，确保业务连续性。双活技术采用两套同时在线的架构，互相作为对方的灾备。这种设计确保在主架构出现问题时，另一套双活架构能够无缝接管，实现无缝切换，用户无感知。三、灾备的难点及解决方案1.主备1.1 数据一致性问题2.双活

ELK 性能优化实践
type: item
date: 2025-07-27T22:46:06+08:00
description: 一、背景介绍近一年内对公司的 ELK 日志系统做过性能优化，也对 SkyWalking 使用的 ES 存储进行过性能优化，在此做一些总结。本篇主要是讲 ES 在 ELK 架构中作为日志存储时的性能优化方案。ELK 架构作为日志存储方案二、现状分析1. 版本及硬件配置JDK：JDK1.8\_171-b11 (64 位)ES集群：由3台16核32G的虚拟机部署 ES 集群，每个节点分配 20 G 堆内存ELK版本：6.3.0垃圾回收器：ES 默认指定的老年代（CMS）+ 新生代（ParNew）操作系统：CentOS Linux release 7.4.1708(Core)2. 性能问题随着接入 ELK 的应用越来越多，每日新增索引约 230 个，新增 document 约 3000 万到 5000 万。每日上午和下午是日志上传高峰期，在 Kibana 上查看日志，发现问题：(1) 日志会有 5-40 分钟的延迟(2) 有很多日志丢失，无法查到3. 问题分析3.1 日志延迟首先了解清楚：数据什么时候可以被查到？数据先是存放在 ES 的内存 buffer，然后执行 refresh 操作写入到操作系统的内存缓存 os cache，此后数据就可以被搜索到。所以，日志延迟可能是我们的数据积压在 buffer 中没有进入 os cache 。3.2 日志丢失查看日志发现很多 write 拒绝执行的情况write 线程池拒绝任务的日志.png从日志中可以看出 ES 的 write 线程池已经满负荷，执行任务的线程已经达到最大 16 个线程，而 200 容量的队列也已经放不下新的 task。查看线程池的情况也可以看出 write 线程池有很多写入的任务GET /_cat/thread_pool?v&h=host,name,type,size,active,largest,rejected,completed,queue,queue_sizewrite 线程池拒绝任务的情况.png所以我们需要优化 ES 的 write 的性能。4.解决思路4.1 分析场景ES 的优化分为很多方面，我们要根据使用场景考虑对 ES 的要求。根据个人实践经验，列举三种不同场景下的特点：SkyWalking：一般配套使用 ES 作为数据存储，存储链路追踪数据、指标数据等信息。ELK：一般用来存储系统日志，并进行分析，搜索，定位应用的问题。全文搜索的业务：业务中常用 ES 作为全文搜索引擎，例如在外卖应用中，ES 用来存储商家、美食的业务数据，用户在客户端可以根据关键字、地理位置等查询条件搜索商家、美食信息。这三类场景的特点如下： SkyWalkingELK全文搜索的业务并发写高并发写高并发写并发一般不高并发读并发低并发低并发高实时性要求5分钟以内30秒以内1分钟内数据完整性可容忍丢失少量数据可容忍丢失少量数据数据尽量100%不丢失关于实时性SkyWalking 在实际使用中，一般使用频率不太高，往往是发现应用的问题后，再去 SkyWalking 查历史链路追踪数据或指标数据，所以可以接受几分钟的延迟。ELK 不管是开发、测试等阶段，时常用来定位应用的问题，如果不能快速查询出数据，延迟太久，会耽误很多时间，大大降低工作效率；如果是查日志定位生产问题，那更是刻不容缓。全文搜索的业务中一般可以接受在1分钟内查看到最新数据，比如新商品上架一分钟后才看到，但尽量实时，在几秒内可以可看到。4.2 优化的方向可以从三方面进行优化：JVM 性能调优、ES 性能调优、控制数据来源三、ES性能优化可以从三方面进行优化：JVM 性能调优、ES 性能调优、控制数据来源1. JVM调优第一步是 JVM 调优。因为 ES 是依赖于 JVM 运行，没有合理的设置 JVM 参数，将浪费资源，甚至导致 ES 很容易 OOM 而崩溃。1.1 监控 JVM 运行情况（1）查看 GC 日志问题：Young GC 和 Full GC 都很频繁，特别是 Young GC 频率高，累积耗时非常多。(2) 使用 jstat 看下每秒的 GC 情况参数说明S0：幸存1区当前使用比例S1：幸存2区当前使用比例E：伊甸园区使用比例O：老年代使用比例M：元数据区使用比例CCS：压缩使用比例YGC：年轻代垃圾回收次数FGC：老年代垃圾回收次数FGCT：老年代垃圾回收消耗时间GCT：垃圾回收消耗总时间问题：从 jstat gc 中也可以看出，每秒的 eden 增长速度非常快，很快就满了。1.2 定位 Young GC 频繁的原因1.2.1 检查是否新生代的空间是否太小用下面几种方式都可查看新、老年代内存大小 (1) 使用 jstat -gc pid 查看 Eden 区、老年代空间大小 (2) 使用 jmap -heap pid 查…

ELK大数据日志分析平台深度解析
type: item
date: 2025-07-26T13:03:00+08:00
description: AI摘要 本文详细介绍了ELK大数据日志分析平台的构建和优化方法。平台由Filebeat、Kafka、Logstash、Elasticsearch和Kibana五个组件构成，各组件负责不同的功能，如日志收集、消息队列、数据处理、数据存储和可视化。文章还提供了各组件的配置示例和调优建议，以确保平台的高效运行。 此内容根据文章生成，仅用于文章内容的解释与总结 Filebeat+Kafka+Logstash+Elasticsearch构建日志分析系统在现代分布式系统中，日志管理是至关重要的一环。日志不仅用于排查问题，还可以用于监控系统性能、分析用户行为等。为了高效地收集、处理和可视化日志，企业通常采用 Filebeat + Kafka + Logstash + Elasticsearch + Kibana 的组合架构。本文将深入探讨这一架构的工作原理、优势、适用场景以及实现步骤。组件介绍2.1 Filebeat• 功能：轻量级的日志收集工具，专为日志文件设计。• 特点：低资源消耗、支持多种输入输出、易于部署。• 适用场景：收集应用日志、系统日志等。2.2 Kafka• 功能：分布式消息队列，用于解耦数据生产和消费。• 特点：高吞吐量、低延迟、持久化存储、可扩展。• 适用场景：缓冲日志数据、解耦日志收集和数据处理。2.3 Logstash• 功能：数据管道工具，用于收集、过滤、转换和输出数据。• 特点：强大的插件生态系统、支持复杂的数据处理。• 适用场景：日志解析、数据格式化、数据过滤。2.4 Elasticsearch• 功能：分布式搜索引擎，用于存储和索引数据。• 特点：实时搜索、高扩展性、支持全文搜索。• 适用场景：日志存储、实时数据分析。2.5 Kibana• 功能：数据可视化工具，用于查询和展示 Elasticsearch 中的数据。• 特点：丰富的图表类型、交互式仪表盘、易于使用。• 适用场景：日志可视化、监控仪表盘。流程图组件交互详解Filebeat 收集日志并发送到 KafkaFilebeat 是一个轻量级的日志收集器，安装在各个日志源节点（如 Web 服务器、应用程序、容器等）上。Filebeat 的主要功能是读取日志文件并将其发送到 Logstash 或 Kafka。配置 Filebeat 发送到 Kafka： 在 Filebeat 配置文件 filebeat.yml 中，你可以设置 Kafka 输出配置，将日志发送到 Kafka 集群中的特定主题。Filebeat 配置示例：filebeat.inputs: - type: log enabled: true paths: - /var/log/*.log output.kafka: hosts: ["kafka_host:9092"] topic: "logs_topic" codec: jsonKafka 作为消息队列Kafka 在日志收集过程中充当消息队列的角色，将日志数据从 Filebeat 转发到 Logstash。Kafka 作为一个可靠的缓冲层，能够缓解高负载、网络延迟等问题。Kafka 接收 Filebeat 发送的日志，并将其存储在一个或多个分区（broker）中。它支持高吞吐量、持久化和容错，保证日志数据不会丢失。logstash 从kafka消费数据并处理logstash可以配置为kafka消费者，定期从kafka中读取日志数据。logstash可以对数据进行过滤、解析、转换等操作，处理后的数据会被转发到elasticsearch配置logstash从kafka消费数据：在logstash配置文件中，使用kafka input plugin来从kafka中读取数据，并使用elasticsearh output plugin将数据发送到elasticsearchlogstash 配置实例input { kafka { bootstrap_servers => "kafka_host:9092" topics => ["logs_topic"] group_id => "logstash-group" } } filter { # 可在这里进行数据过滤、解析和转换 json { source => "message" } } output { elasticsearch { hosts => ["http://elasticsearch_host:9200"] index => "logs-index-%{+YYYY.MM.dd}" } }kafka 输入插件从kafka中读取数据json过滤将日志数据解析为json格式（假设日志数据是json格式的）elasticsearch输出插件将处理后的数据发送到elasticsearchelastics…

OpenVPN
type: item
date: 2025-06-23T09:19:00+08:00
description: OpenVPN原理及部署使用1. 简介 VPN技术通过密钥交换、封装、认证、加密手段在公共网络上建立起私密的隧道，保障传输数据的完整性、私密性和有效性。OpenVPN是近年来新出现的开放源码项目，实现了SSL VPN的一种解决方案。2.应用场景有一些类似这样的情形或需求：1、开发:通过OpenVPN让开发人员连接网站,进行开发测试(在家的时候)2、运维:通过OpenVPN让运维连接内网服务器,或者是连接JUMPSERVER在家里想进入公司网站的管理界面，但管理系统限制了仅允许来自公司IP可以访问想连接到某个特别网站的特别网络应用，但本地的ISP或路由节点不允许您去连接它本地的ISP或路由节点可能会监听您的数据而您不想被它拦截，想找一种可以跳过它的办法,您想访问的网站和应用是基于明文传输，但您希望这个线路是私密的和可靠的。这时候就需要用到VPN来实现。3.OpenVPN服务端配置3.1 环境准备serverIPopenvpn-server公网:100.100.1.1 内网:10.100.240.3client能访问Internet3.2 证书准备流程1) 安装openvpn服务端、证书创建工具#openvpn 服务端、证书工具安装 [root@openvpn-server ~]# yum install -y openvpn easy-rsa #证书工具目录 [root@openvpn-server ~]# rpm -ql easy-rsa /usr/share/easy-rsa/3.0.8/easyrsa ...2) 服务器充当权威机构，创建ca证书#路径太深，新建目录 [root@openvpn-server ~]# mkdir -p /opt/easy-rsa [root@openvpn-server ~]# cp -a /usr/share/easy-rsa/3.0.8/* /opt/easy-rsa/ [root@openvpn-server ~]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /opt/easy-rsa/vars #修改vars文件，配置默认参数值 [root@openvpn-server ~]# cat > /opt/easy-rsa/vars if [ -z "$EASYRSA_CALLER" ]; then echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2 echo "This is no longer necessary and is disallowed. See the section called" >&2 echo "'How to use this file' near the top comments for more details." >&2 return 1 fi set_var EASYRSA_DN "cn_only" set_var EASYRSA_REQ_COUNTRY "CN" # 国家 set_var EASYRSA_REQ_PROVINCE "Beijing" # 省 set_var EASYRSA_REQ_CITY "ShangHai" # 城市 set_var EASYRSA_REQ_ORG "zxc.com" # 组织 set_var EASYRSA_REQ_EMAIL "123456@qq.com" # 邮箱 set_var EASYRSA_NS_SUPPORT "yes" EOF #配置完var后 检查 权威机构信息 [root@openvpn-server easy-rsa]# tree . |-- easyrsa |-- openssl-easyrsa.cnf |-- vars #var ca权威机构信息 `-- x509-types |-- ca |-- client |-- code-signing |-- COMMON |-- email |-- kdc |-- server `-- serverClient 1 directory, 11 files #初始化，会在当前目录创建PKI目录，用于存储证书 [root@openvpn-server easy-rsa]# ./easyrsa init-pki Note: using Easy-RSA configuration from: /opt/easy-rsa/vars #正在使用来自于vars init-pki complete; you may now create a CA or requests. #初始化完成 显示你可以尝试创建 CA证书 Your newly c…

CentOS7 YUM源配置
type: item
date: 2025-06-22T22:14:00+08:00
description: 每次新机器都配置很麻烦，记录一下如何配置网络yum一、配置本地yum源首先将centos自带的网络yum源删掉（自带的默认从centos官网下载软件，服务器在国外，非常不稳定） [root@cloud ~]# rm -rf /etc/yum.repos.d/*创建挂载点并挂载镜像[root@cloud ~]# mkdir /opt/centos [root@cloud ~]# mount /dev/cdrom /opt/centos/ mount: /dev/sr0 写保护，将以只读方式挂载创建并编写本地yum源配置文件，编写完成之后wq保存退出[root@cloud ~]# vi /etc/yum.repos.d/local.repo [centos] name=centos # Yum源的名称，用于描述这个源 baseurl=file:///opt/centos # 本地Yum源的位置，指向挂载点目录 gpgcheck=0 # 不进行GPG签名检查 enabled=1 # 启用该Yum源清除缓存原来的生成新的缓存并列出当前系统中已配置和启用的Yum仓库（repositories）及其状态[root@cloud ~]# yum clean all 已加载插件：fastestmirror, langpacks 正在清理软件源： centos Cleaning up list of fastest mirrors Other repos take up 1.0 G of disk space (use --verbose for details) [root@cloud ~]# yum makecache 已加载插件：fastestmirror, langpacks Determining fastest mirrors centos | 3.6 kB 00:00:00 (1/4): centos/group_gz | 153 kB 00:00:00 (2/4): centos/primary_db | 3.3 MB 00:00:00 (3/4): centos/other_db | 1.3 MB 00:00:00 (4/4): centos/filelists_db | 3.3 MB 00:00:00 元数据缓存已建立 [root@cloud ~]# yum repolist 已加载插件：fastestmirror, langpacks Loading mirror speeds from cached hostfile 源标识 源名称 状态 centos centos 4,070 repolist: 4,070下载httpd测试一下[root@cloud ~]# yum install -y httpd 已加载插件：fastestmirror, langpacks Loading mirror speeds from cached hostfile 正在解决依赖关系 --> 正在检查事务 ---> 软件包 httpd.x86_64.0.2.4.6-95.el7.centos 将被 安装 --> 正在处理依赖关系 httpd-tools = 2.4.6-95.el7.centos，它被软件包 httpd-2.4.6-95.el7.centos.x86_64 需要 --> 正在处理依赖关系 /etc/mime.types，它被软件包 httpd-2.4.6-95.el7.centos.x86_64 需要 --> 正在处理依赖关系 libaprutil-1.so.0()(64bit)，它被软件包 httpd-2.4.6-95.el7.centos.x86_64 需要 --> 正在处理依赖关系 libapr-1.so.0()(64bit)，它被软件包 httpd-2.4.6-95.el7.centos.x86_64 需要 --> 正在检查事务 ---> 软件包 apr.x86_64.0.1.4.8-7.el7 将被 安装 ---> 软件包 apr-util.x86_64.0.1.5.2-6.el7 将被 安装 ---> 软件包 httpd-tools.x86_64.0.2.4.6-95.el7.centos 将被 安装 ---> 软件包 mailcap.noarch.0.2.1.41-2.el7 将被 安装 --> 解决依赖关系完成 依赖关系解决 ======================================================================================================================== Package 架构 版本 源 大小 =====…

Linux新增磁盘扩容
type: item
date: 2025-06-09T16:18:04+08:00
description: Linux磁盘扩容需求：新增第二块磁盘 sdb 的空间（30G）扩展到当前的根目录 / 下，典型的 “添加新磁盘 → 扩容已有 LVM 根分区” 的操作流程。你的系统使用了 LVM（逻辑卷管理），所以我们可以把 sdb 加入到现有的 LVM 卷组并扩展根目录。✅ 操作目标将 sdb → 加入 LVM 卷组 centos → 扩容 centos-root → 扩容 / 挂载点空间🧰 操作步骤（谨慎操作，建议备份重要数据）① 确认当前卷组信息vgs输出示例（你应该会看到一个名为 centos 的卷组）：VG #PV #LV #SN Attr VSize VFree centos 1 2 0 wz--n- <29.00g 0② 对 sdb 创建物理卷（PV）pvcreate /dev/sdb成功输出类似：Physical volume "/dev/sdb" successfully created.③ 把 /dev/sdb 加入现有的卷组（VG）vgextend centos /dev/sdb成功输出类似：Volume group "centos" successfully extended④ 扩容逻辑卷（LV）到占满所有空间lvextend -l +100%FREE /dev/centos/root（这会将 VG 中剩余所有空间分配给 centos-root，即 /）⑤ 扩容文件系统如果你用的是 xfs 文件系统（CentOS 7+ 默认）：xfs_growfs /如果你用的是 ext4 文件系统（检查用 df -T /）：resize2fs /dev/centos/root✅ 完成后确认df -h /你应该可以看到 / 挂载点从原来的 26G 增加到了接近 56G（即原有 26G + sdb 的 30G）。[root@cicd_gitlab ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 2.9G 0 2.9G 0% /dev tmpfs 2.9G 84K 2.9G 1% /dev/shm tmpfs 2.9G 18M 2.9G 1% /run tmpfs 2.9G 0 2.9G 0% /sys/fs/cgroup /dev/mapper/centos-root 56G 25G 32G 45% / /dev/sda1 1014M 189M 826M 19% /boot tmpfs 581M 0 581M 0% /run/user/0 [root@cicd_gitlab ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 30G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 29G 0 part ├─centos-root 253:0 0 56G 0 lvm / └─centos-swap 253:1 0 3G 0 lvm [SWAP] sdb 8:16 0 30G 0 disk └─centos-root 253:0 0 56G 0 lvm / sr0 11:0 1 1024M 0 rom [root@cicd_gitlab ~]# 🛑 注意事项操作过程对系统影响较大，请在低峰时段操作或备份重要数据。如果后续计划卸载或缩容，建议新磁盘单独挂载，而不是扩展 /。

Centos安装node18版本以上
type: item
date: 2025-06-04T13:28:32+08:00
description: Node.js 安装（兼容旧版 glibc 的方案）在 CentOS 等 Linux 系统中运行 Node.js 时，可能遇到如下错误：node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)这是由于系统中的 glibc 版本过低（如 CentOS 7 的默认 glibc 为 2.17），而某些 Node.js 版本依赖更新版本的 glibc（如 2.27 及以上）。✅ 解决方案为避免升级系统或使用 Docker，可使用 专为旧版 glibc 编译的 Node.js 预构建版本，例如：node-v18.18.0-linux-x64-glibc-217.tar.gz该版本可在 CentOS 7 等使用 glibc 2.17 的系统中正常运行。🔧 安装步骤1️⃣ 下载 Node.js 版本进入 Node.js 非官方兼容版本下载页面，下载：node-v18.18.0-linux-x64-glibc-217.tar.gz2️⃣ 上传至服务器例如上传到目录：/root/node/3️⃣ 解压安装包cd /root/node tar -xzvf node-v18.18.0-linux-x64-glibc-217.tar.gz4️⃣ 重命名目录（可选）mv node-v18.18.0-linux-x64-glibc-217 node-v185️⃣ 配置环境变量创建配置文件 /etc/profile.d/nodejs.sh：vi /etc/profile.d/nodejs.sh添加内容如下：export NODE_HOME=/root/node/node-v18 export PATH=.:$NODE_HOME/bin:$PATH保存后使其生效：source /etc/profile6️⃣ 配置国内 npm 镜像源（建议）为加快依赖安装速度，设置为阿里云镜像：npm config set registry=https://registry.npmmirror.com✅ 验证安装node -v npm -v确保输出的版本正确，即代表安装成功。📌 总结通过该方法，可 避免升级系统 glibc，而直接使用为旧系统编译的 Node.js 版本，适合在 CentOS 7 等老系统上运行现代 Node.js 应用。

Linux 安装 JDK 1.8
type: item
date: 2025-05-26T17:33:03+08:00
description: Linux 安装 JDK 1.8 教程（RPM 包方式）1. 创建安装目录首先，创建一个目录用于存放 JDK 安装文件：bash 复制编辑 sudo mkdir -p /usr/local/java cd /usr/local/java2. 下载 JDK RPM 安装包使用 wget 命令从 Oracle 官方网站下载 JDK 1.8 的 RPM 安装包：WGCLOUDbash 复制编辑 wget --no-check-certificate --no-cookies \ --header "Cookie: oraclelicense=accept-securebackup-cookie" \ http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm注意：下载链接可能会因 Oracle 政策变化而失效，请根据实际情况获取最新的下载链接。3. 安装 JDK为下载的 RPM 包添加执行权限并进行安装：bash 复制编辑 chmod +x jdk-8u131-linux-x64.rpm sudo rpm -ivh jdk-8u131-linux-x64.rpm4. 配置环境变量编辑系统环境变量配置文件 /etc/profile：bash 复制编辑 sudo vim /etc/profile在文件末尾添加以下内容：bash 复制编辑 export JAVA_HOME=/usr/java/jdk1.8.0_131 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH export PATH=$PATH:${JAVA_HOME}/bin:${JRE_HOME}/bin保存并退出编辑器后，使环境变量配置立即生效：bash 复制编辑 source /etc/profile5. 验证安装执行以下命令，检查 JDK 是否安装成功：bash 复制编辑 java -version如果安装成功，系统将显示类似以下的信息：scss 复制编辑 java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

ElasticSearch 性能调优
type: item
date: 2025-05-22T14:36:00+08:00
description: 来一个大的介绍：ElasticSearch的性能优化的几大方面本文借鉴尼恩博主，参考学习总的来说，ElasticSearch的性能优化，可以从以下方面的考虑：硬件层面的优化：机器分配，机器配置，机器内存，机器CPU，机器网络，机器磁盘性能系统层面的优化：文件句柄优化、swap关闭ElasticSearch集群层面的优化 重点合理分配节点，合理分配参加竞选Master的节点ElasticSearch 索引层面的优化 重点副本数量、索引数量、分片数量ElasticSearch查询层面的优化职责分离，全面监控1 硬件层面的优化1.1 为ES进行 硬件层面的 内存优化：Elasticsearch是一个内存密集型应用，合理分配内存对于Elasticsearch 提高性能至关重要:确保系统内存有足够的空间用于文件缓存，而不单单是JVM堆内存。建议将一半的内存分配给Elasticsearch的堆内存，另一半留给操作系统和其他进程。为了避免垃圾回收（GC）成为瓶颈，建议设置堆内存的最大值为30GB或更小。可以通过修改jvm.options文件来调整堆内存的大小。总之，ES是比较依赖内存的，并且对内存的消耗也很大，内存对ES的重要性甚至是高于CPU的，所以即使是数据量不大的业务，为了保证服务的稳定性，在满足业务需求的前提下，我们仍需考虑留有不少于20%的冗余性能。根据业务量不同，内存的需求也不同，一般生产建议总体 32内存，其中JVM 不要少于16G， 还有 16G给底层的Luence。为ES进行 系统层面的 磁盘优化对于ES来说，磁盘可能是最重要的了，因为数据都是存储在磁盘上的，当然这里说的磁盘指的是磁盘的性能。磁盘性能往往是硬件性能的瓶颈，木桶效应中的最短板。方式一：纵向扩展： 使用最高性能的 磁盘ES 磁盘优化的最为简单，最为粗暴的方式是 纵向扩展，就是使用最高性能的 磁盘，比如SSD 固态硬盘。ES应用可能要面临不间断的大量的数据读取和写入，数据规模非常庞大， 尼恩曾经架构过的一个30个节点ES集群，数据量非常庞大，达到1TB 。一般来说，速度最快的，也是最昂贵的。不可能都用SSD硬盘， 一般是 SSD和机械硬盘组合使用。所以，可以考虑把节点冷热分离：“热节点”使用SSD做存储，可以大幅提高系统性能；“冷数据“存储在机械硬盘中，降低成本。如果使用磁盘阵列，可以使用RAID 0。这里，尼恩给大家来点基础知识， 什么是RAID 0？RAID（Redundant Array of Independent Disks，独立磁盘冗余阵列）是一种将多个物理磁盘组合成一个逻辑单元的数据存储虚拟化技术，其目的是提高数据存储的性能、可靠性或两者兼顾。RAID 0 是RAID中一种配置方式，具体含义如下：RAID 0 定义：RAID 0 又称为条带化（Striping），它将数据分散存储在两个或多个硬盘上，每个硬盘只存储数据的一部分，从而提高数据的读写速度。工作原理：在RAID 0配置中，数据被分成多个块（称为“条带”），并按顺序存储在多个硬盘上。例如，如果有一个4KB的数据块，它会被分成4个1KB的块，分别存储在4个硬盘上。读取数据时，因为可以同时从多个硬盘读取，所以读取速度会加快。写入数据时也是同理，数据会被分成多个块并行写入多个硬盘。性能提升：RAID 0 的主要优势在于提高数据的读写速度。由于数据被分散在多个硬盘上，所以理论上，RAID 0 的读写速度可以达到单个硬盘速度的总和。没有冗余：RAID 0 的缺点是没有数据冗余。如果其中一个硬盘发生故障，整个阵列上的数据都会丢失，因为每个硬盘上只存储数据的一部分，没有副本。适用场景：RAID 0 适用于对性能要求高而对数据安全性要求不高的场景，如视频编辑、大型数据库的临时存储等。RAID 0 风险：由于没有数据冗余，RAID 0 的风险较高。一旦硬盘发生故障，整个RAID 0 阵列上的数据都会丢失，因此在使用RAID 0 时需要非常小心，并且定期备份数据。总结来说，RAID 0 是一种通过将数据分散存储在多个硬盘上来提高性能的配置方式，但它不提供任何数据冗余，因此使用时需要考虑到数据丢失的风险。这里，尼恩给大家再来点基础知识， 看看 RAID 0 和 RAID 1 的区别?RAID 0 和 RAID 1 是两种不同的RAID配置，RAID 0 和 RAID 1 在数据存储、性能和可靠性方面有显著的区别：RAID 0（条带化）： 多块磁盘并行读写数据存储：数据被分割成多个块（条带），然后分散存储在两个或多个硬盘上。这意味着每个硬盘上存储的是数据的不同部分，而不是数据的副本。性能：由于数据的读写操作可以并行进行，RAID 0 可以提供很高的数据传输速率，特别是在写入大量数据时。可靠性：RAID 0 没有数据…

Nginx 性能调优
type: item
date: 2025-05-16T11:00:00+08:00
description: 一、前言相信对于 Nginx 你一定并不陌生，它是一款轻量级的开源 Web 服务及代理程序，因其轻量化、支持高并发等特性，目前国内企业早已广泛的使用 Nginx。既然 Nginx 使用这么广泛，那么我们在性能测试工作中如何对其进行优化和配置便成了重中之重。二、配置优化2.1 并发处理架构优化2.1.1 工作进程配置现代 CPU 多核架构下，Nginx 的 worker 进程若在不同核心间频繁调度，会增加 CPU 上下文切换损耗。CPU 亲和性通过将 worker 进程固定到特定核心，避免跨核调度，提升缓存利用率。所以就需要配置 Nginx 的 CPU 亲和性来解决这个问题。那由于 Nginx CPU 亲和性配置本身有多套配置方案，这里推荐你直接将配置项设置成 auto（worker\_cpu\_affinity ），即采用了 Nginx 推荐的 CPU 绑核策略方式。另外的一个方式是手动绑定，将 worker 线程数量与 CPU 核心数一一绑定方式设置。我们设置成 auto Nginx 会自动识别并按照推荐策略来分配 worker 线程和 CPU。配置方案：自动绑定（推荐）：通过 worker_cpu_affinity auto 让 Nginx 自动识别 CPU 核心并按最优策略绑定。例如 8 核 CPU 会将 8 个 worker 进程一对一绑定到 CPU0\~CPU7，实现负载均衡。手动绑定：按核心数显式配置，如 worker_cpu_affinity 0001 0010 0100 1000（4 核场景）。配置示例如下：worker_cpu_affinity auto; # 自动将工作进程绑定到可用的 CPU 核心 worker_processes auto; # 基于CPU核心数动态分配工作进程，充分利用多核性能 worker_connections 1024; # 单进程最大并发连接数，支持高并发场景 worker_rlimit_nofile 65535; # 单进程文件描述符上限，突破系统资源限制 理论并发能力： 通过多进程模型实现水平扩展，总并发量为：worker\_processes × worker\_connections （例：4 核 CPU 配置下可达 4×1024=4096 并发连接）。需结合系统级限制（如 nofile）。若未调整 sysctl，实际并发可能受限于系统默认值（通常 1024）。# 系统级文件描述符限制 worker_rlimit_nofile 65535; # 需在系统中同步调整（/etc/security/limits.conf）2.1.2 事件驱动模型Linux 系统下一切皆文件，比如打开一个设备，它便会产生一个文件描述符。在产生一个进程时，这个进程便需要一个进程描述符，这个进程描述符也是一个文件。所以在 Nginx 处理请求的时候，每一个请求都会产生处理请求的描述符。其次，在 Nginx 处理大规模请求的时候，为了提高并发效率需要采用异步非阻塞模型，epoll 本身是以异步非阻塞模型来处理请求流中的事件流。这里还需要注意一点，并不是所有的 Linux 操作系统都可以使用 epoll，它是在 kernel 2.6 版本以后提出的，早期内核使用的 select\poll 模型，select 模型比 epoll 模型性能要低很多。模型对比：epoll（Kernel 2.6+）：异步非阻塞模型，基于事件驱动，通过 mmap 共享用户态与内核态空间，突破 select/poll 的 1024 文件描述符限制，支持百万级并发。select/poll：早期模型，需轮询扫描所有文件描述符，性能随并发量下降明显。配置示例如下：multi_accept on; # 一次性接受所有新连接 use epoll; # Linux高效IO多路复用，支持C10K级别并发 2.2 传输效率优化2.2.1 零拷贝技术Nginx 在处理文件时，会将文件传入操作系统内核态的 Buffer Cache，然后传递到操作系统上层的用户态，经用户态的 Buffer Cache 再传回内核态中，最后通过 Socket 将文件转发出去。通过 sendfile on 实现内核态直接传输，避免文件在用户态与内核态间的冗余拷贝。传统流程需 4 次拷贝（内核 Buffer→用户 Buffer→内核 Buffer→Socket），零拷贝仅需 2 次内核态数据搬运，尤其适合图片、视频等静态资源。配置示例如下：# I/O优化 - 减少带宽消耗和提高传输效率 sendfile on; # 开启零拷贝文件传输，减少CPU消耗和内核上下文切换 tcp_nopush on; # 优化数据包传输，减少网络报文数量，配合sendfile使用 tcp_no…